From f103d52ed276e0686991a2065c3a87cfa694d9b2 Mon Sep 17 00:00:00 2001 From: hellovai Date: Mon, 11 Nov 2024 13:27:25 -0800 Subject: [PATCH] chore: Bump version to 0.68.0 (#1159) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bump version to 0.68.0\n\n❌ Typescript integ tests\n❌ Python integ tests\n\nGenerated by bump-version script. ---- > [!IMPORTANT] > Bump version to 0.68.0 across multiple files, update changelog, and adjust integration tests. > > - **Version Bump**: > - Update version from `0.67.0` to `0.68.0` in `Cargo.toml`, `pyproject.toml`, `baml.gemspec`, `package.json`, and `vscode-ext/packages/package.json`. > - Update version in `tools/versions` configuration files for `engine.cfg`, `integ-tests.cfg`, `python.cfg`, `ruby.cfg`, `typescript.cfg`, and `vscode.cfg`. > - **Changelog**: > - Add entries for version `0.68.0` in `CHANGELOG.md` with new features and bug fixes. > - **Tests**: > - Remove tests for non-terminal finish reason in `integ-tests.test.ts`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=BoundaryML%2Fbaml&utm_source=github&utm_medium=referral) for 278232ee2f40c43ced0bddfdfaebe17c91b77a5b. It will automatically update as commits are pushed. --- CHANGELOG.md | 21 + engine/Cargo.lock | 30 +- 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/generators.baml | 8 +- integ-tests/python/baml_client/inlinedbaml.py | 2 +- integ-tests/python/report.html | 2018 ++++++++++------- integ-tests/ruby/baml_client/inlined.rb | 2 +- .../typescript/baml_client/inlinedbaml.ts | 2 +- integ-tests/typescript/test-report.html | 790 ++++++- .../typescript/tests/integ-tests.test.ts | 45 - 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 +- 20 files changed, 2024 insertions(+), 916 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96c3800fc..f5d46878e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,27 @@ All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines. +## [0.68.0](https://github.com/boundaryml/baml/compare/0.67.0..0.68.0) - 2024-11-11 + +### Documentation + + +### Features + +- Recursive types! (#1065) - ([8100df9](https://github.com/boundaryml/baml/commit/8100df999e67690458e8bc6adc50575e855bd242)) - Antonio Sarosi +- Support specifying "region" for aws-bedrock (#1150) - ([cbe3c92](https://github.com/boundaryml/baml/commit/cbe3c9261b3fa5cd026b9492a2858c1822e354df)) - Samuel Lijin +- Add `hoisted_class_prefix` option in docs (#1154) - ([cf2298e](https://github.com/boundaryml/baml/commit/cf2298ec53c74c317c495c7b84e1a56a97193b4f)) - Antonio Sarosi +- Make render messages dynamic and use `hoisted_class_prefix` instead of `"schema"` (#1155) - ([873751b](https://github.com/boundaryml/baml/commit/873751ba84f736dfbcbd9cbb0b6debfe7081cc1f)) - Antonio Sarosi +- Support o1 in playground (allow certain models to disable streaming) (#1157) - ([09c6549](https://github.com/boundaryml/baml/commit/09c65497c3218387756775827ba22bcad16f0362)) - hellovai +- Add basic grammar for `a` vs `an` articles in ctx.output_format (#1158) - ([e084130](https://github.com/boundaryml/baml/commit/e0841307d4da809754d995a4524b39b87040f2d0)) - Antonio Sarosi + + +### Bug Fixes +- Improved syntax highlighting for template_strings (#1151) - ([8c43e37](https://github.com/boundaryml/baml/commit/8c43e37fdaa05d9f3626fde7ad56614610727348)) - Greg Hale +- Improved error detection for client<llm> parsing (#1026) - ([c6b1167](https://github.com/boundaryml/baml/commit/c6b116744f55f831352209c04cd6bce7b028eda9)) - hellovai +- Fix BAML_LOG_JSON logs for py, ruby, and TS (#1153) - ([9e08642](https://github.com/boundaryml/baml/commit/9e08642470435fbefca20b163de010dd805560b8)) - aaronvg + + ## [0.67.0](https://github.com/boundaryml/baml/compare/0.66.0..0.67.0) - 2024-11-05 ### Bug Fixes diff --git a/engine/Cargo.lock b/engine/Cargo.lock index 6dabfb12b..f5964cbd6 100644 --- a/engine/Cargo.lock +++ b/engine/Cargo.lock @@ -773,7 +773,7 @@ dependencies = [ [[package]] name = "baml-cli" -version = "0.67.0" +version = "0.68.0" dependencies = [ "ambassador", "anyhow", @@ -860,7 +860,7 @@ dependencies = [ [[package]] name = "baml-lib" -version = "0.67.0" +version = "0.68.0" dependencies = [ "base64 0.13.1", "dissimilar", @@ -900,7 +900,7 @@ dependencies = [ [[package]] name = "baml-runtime" -version = "0.67.0" +version = "0.68.0" dependencies = [ "ambassador", "anyhow", @@ -993,7 +993,7 @@ dependencies = [ [[package]] name = "baml-schema-build" -version = "0.67.0" +version = "0.68.0" dependencies = [ "anyhow", "baml-runtime", @@ -1029,7 +1029,7 @@ dependencies = [ [[package]] name = "baml-types" -version = "0.67.0" +version = "0.68.0" dependencies = [ "anyhow", "clap", @@ -1157,7 +1157,7 @@ dependencies = [ [[package]] name = "bstd" -version = "0.67.0" +version = "0.68.0" dependencies = [ "anyhow", "assert_cmd", @@ -2541,7 +2541,7 @@ dependencies = [ [[package]] name = "internal-baml-codegen" -version = "0.67.0" +version = "0.68.0" dependencies = [ "anyhow", "askama", @@ -2566,7 +2566,7 @@ dependencies = [ [[package]] name = "internal-baml-core" -version = "0.67.0" +version = "0.68.0" dependencies = [ "anyhow", "baml-types", @@ -2602,7 +2602,7 @@ dependencies = [ [[package]] name = "internal-baml-diagnostics" -version = "0.67.0" +version = "0.68.0" dependencies = [ "anyhow", "colored", @@ -2615,7 +2615,7 @@ dependencies = [ [[package]] name = "internal-baml-jinja" -version = "0.67.0" +version = "0.68.0" dependencies = [ "anyhow", "askama", @@ -2636,7 +2636,7 @@ dependencies = [ [[package]] name = "internal-baml-jinja-types" -version = "0.67.0" +version = "0.68.0" dependencies = [ "anyhow", "askama", @@ -2655,7 +2655,7 @@ dependencies = [ [[package]] name = "internal-baml-parser-database" -version = "0.67.0" +version = "0.68.0" dependencies = [ "anyhow", "baml-types", @@ -2678,7 +2678,7 @@ dependencies = [ [[package]] name = "internal-baml-prompt-parser" -version = "0.67.0" +version = "0.68.0" dependencies = [ "internal-baml-diagnostics", "internal-baml-schema-ast", @@ -2690,7 +2690,7 @@ dependencies = [ [[package]] name = "internal-baml-schema-ast" -version = "0.67.0" +version = "0.68.0" dependencies = [ "baml-types", "either", @@ -2795,7 +2795,7 @@ checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105" [[package]] name = "jsonish" -version = "0.67.0" +version = "0.68.0" dependencies = [ "anyhow", "assert-json-diff", diff --git a/engine/Cargo.toml b/engine/Cargo.toml index 7d0ea7645..041a886f7 100644 --- a/engine/Cargo.toml +++ b/engine/Cargo.toml @@ -95,7 +95,7 @@ internal-baml-jinja = { path = "baml-lib/jinja" } internal-baml-schema-ast = { path = "baml-lib/schema-ast" } [workspace.package] -version = "0.67.0" +version = "0.68.0" authors = ["Boundary "] description = "BAML Toolchain" diff --git a/engine/language_client_python/pyproject.toml b/engine/language_client_python/pyproject.toml index 8e8dcd6a4..604a29bcb 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.67.0" +version = "0.68.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 87b69aa51..f22f06b3a 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.67.0" + spec.version = "0.68.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 82c4f787f..cf7c2d548 100644 --- a/engine/language_client_typescript/package.json +++ b/engine/language_client_typescript/package.json @@ -1,6 +1,6 @@ { "name": "@boundaryml/baml", - "version": "0.67.0", + "version": "0.68.0", "description": "BAML typescript bindings (package.json)", "repository": { "type": "git", diff --git a/integ-tests/baml_src/generators.baml b/integ-tests/baml_src/generators.baml index 70513bb2b..360bb5a8b 100644 --- a/integ-tests/baml_src/generators.baml +++ b/integ-tests/baml_src/generators.baml @@ -1,24 +1,24 @@ generator lang_python { output_type python/pydantic output_dir "../python" - version "0.67.0" + version "0.68.0" } generator lang_typescript { output_type typescript output_dir "../typescript" - version "0.67.0" + version "0.68.0" } generator lang_ruby { output_type ruby/sorbet output_dir "../ruby" - version "0.67.0" + version "0.68.0" } // generator openapi { // output_type rest/openapi // output_dir "../openapi" -// version "0.67.0" +// version "0.68.0" // on_generate "rm .gitignore" // } diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py index cf65f46cc..44f601879 100644 --- a/integ-tests/python/baml_client/inlinedbaml.py +++ b/integ-tests/python/baml_client/inlinedbaml.py @@ -25,7 +25,7 @@ "fiddle-examples/extract-receipt-info.baml": "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n venue \"barisa\" | \"ox_burger\"\n}\n\nfunction ExtractReceiptInfo(email: string, reason: \"curiosity\" | \"personal_finance\") -> ReceiptInfo {\n client GPT4o\n prompt #\"\n Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\n", "fiddle-examples/images/image.baml": "function DescribeImage(img: image) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\") }}\n\n\n Describe the image below in 20 words:\n {{ img }}\n \"#\n\n}\n\nclass FakeImage {\n url string\n}\n\nclass ClassWithImage {\n myImage image\n param2 string\n fake_image FakeImage\n}\n\n// chat role user present\nfunction DescribeImage2(classWithImage: ClassWithImage, img2: image) -> string { \n client GPT4Turbo\n prompt #\"\n {{ _.role(\"user\") }}\n You should return 2 answers that answer the following commands.\n\n 1. Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n 2. Also tell me what's happening here in one sentence:\n {{ img2 }}\n \"#\n}\n\n// no chat role\nfunction DescribeImage3(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\n\n// system prompt and chat prompt\nfunction DescribeImage4(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n {{ _.role(\"system\")}}\n\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\ntest TestName {\n functions [DescribeImage]\n args {\n img { url \"https://imgs.xkcd.com/comics/standards.png\"}\n }\n}\n", "fiddle-examples/symbol-tuning.baml": "enum Category3 {\n Refund @alias(\"k1\")\n @description(\"Customer wants to refund a product\")\n\n CancelOrder @alias(\"k2\")\n @description(\"Customer wants to cancel an order\")\n\n TechnicalSupport @alias(\"k3\")\n @description(\"Customer needs help with a technical issue unrelated to account creation or login\")\n\n AccountIssue @alias(\"k4\")\n @description(\"Specifically relates to account-login or account-creation\")\n\n Question @alias(\"k5\")\n @description(\"Customer has a question\")\n}\n\nfunction ClassifyMessage3(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", - "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.67.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.67.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.67.0\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.67.0\"\n// on_generate \"rm .gitignore\"\n// }\n", + "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.68.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.68.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.68.0\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.68.0\"\n// on_generate \"rm .gitignore\"\n// }\n", "test-files/aliases/aliased-inputs.baml": "\nclass InputClass {\n key string @alias(\"color\")\n key2 string\n}\n\n\nclass InputClassNested {\n key string\n nested InputClass @alias(\"interesting-key\")\n}\n \n\nfunction AliasedInputClass(input: InputClass) -> string {\n client GPT35\n prompt #\"\n\n {{input}}\n\n This is a test. What's the name of the first json key above? Remember, tell me the key, not value.\n \"#\n}\n \nfunction AliasedInputClass2(input: InputClass) -> string {\n client GPT35\n prompt #\"\n\n {# making sure we can still access the original key #}\n {%if input.key == \"tiger\"%}\n Repeat this value back to me, and nothing else: {{input.key}}\n {%endif%}\n \"#\n}\n \n function AliasedInputClassNested(input: InputClassNested) -> string {\n client GPT35\n prompt #\"\n {{ _.role(\"user\")}}\n\n {{input}}\n\n This is a test. What's the name of the second json key above? Remember, tell me the key, not value.\n \"#\n }\n\n\nenum AliasedEnum {\n KEY_ONE @alias(\"tiger\")\n KEY_TWO\n}\n\nfunction AliasedInputEnum(input: AliasedEnum) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\")}}\n\n\n Write out this word only in your response, in lowercase:\n ---\n {{input}}\n ---\n Answer:\n \"#\n}\n\n\nfunction AliasedInputList(input: AliasedEnum[]) -> string {\n client GPT35\n prompt #\"\n {{ _.role(\"user\")}}\n Given this array:\n ---\n {{input}}\n ---\n\n Return the first element in the array:\n \"#\n}\n\n", "test-files/aliases/classes.baml": "class TestClassAlias {\n key string @alias(\"key-dash\") @description(#\"\n This is a description for key\n af asdf\n \"#)\n key2 string @alias(\"key21\")\n key3 string @alias(\"key with space\")\n key4 string //unaliased\n key5 string @alias(\"key.with.punctuation/123\")\n}\n\nfunction FnTestClassAlias(input: string) -> TestClassAlias {\n client GPT35\n prompt #\"\n {{ctx.output_format}}\n \"#\n}\n\ntest FnTestClassAlias {\n functions [FnTestClassAlias]\n args {\n input \"example input\"\n }\n}\n", "test-files/aliases/enums.baml": "enum TestEnum {\n A @alias(\"k1\") @description(#\"\n User is angry\n \"#)\n B @alias(\"k22\") @description(#\"\n User is happy\n \"#)\n // tests whether k1 doesnt incorrectly get matched with k11\n C @alias(\"k11\") @description(#\"\n User is sad\n \"#)\n D @alias(\"k44\") @description(\n User is confused\n )\n E @description(\n User is excited\n )\n F @alias(\"k5\") // only alias\n \n G @alias(\"k6\") @description(#\"\n User is bored\n With a long description\n \"#)\n \n @@alias(\"Category\")\n}\n\nfunction FnTestAliasedEnumOutput(input: string) -> TestEnum {\n client GPT35\n prompt #\"\n Classify the user input into the following category\n \n {{ ctx.output_format }}\n\n {{ _.role('user') }}\n {{input}}\n\n {{ _.role('assistant') }}\n Category ID:\n \"#\n}\n\ntest FnTestAliasedEnumOutput {\n functions [FnTestAliasedEnumOutput]\n args {\n input \"mehhhhh\"\n }\n}", diff --git a/integ-tests/python/report.html b/integ-tests/python/report.html index 26baf843b..0bafb9d9c 100644 --- a/integ-tests/python/report.html +++ b/integ-tests/python/report.html @@ -3,11 +3,11 @@
Test Report

Summary

94
2 failed 92 passed

Tests

tests/test_functions.py 289 0:03:00.139964

PASSED test_env_vars_reset 0:00:01.650679

Setup

Call

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

Summary

97
3 failed 93 passed 1 skipped

Warnings

Warnings 1

  • PytestUnhandledCoroutineWarning async def functions are not natively supported and have been skipped. You need to install a suitable plugin for your async framework, for example: - anyio - pytest-asyncio - pytest-tornasync - pytest-trio - pytest-twisted
    /Users/vbv/Library/Caches/pypoetry/virtualenvs/python-integ-tests-lSPb1NE9-py3.12/lib/python3.12/site-packages/_pytest/python.py:148

Tests

tests/test_functions.py 3901 0:03:14.941336

PASSED test_env_vars_reset 0:00:03.317093

Setup

Call

Captured stdout call
Context depth is greater than 0!
 Except but ending trace!
 Context depth is greater than 0!
-
Captured stderr call
[2024-11-05T19:54:24Z WARN  baml_events] Function ExtractPeople:
-    Client: GPT4 (<unknown>) - 192ms
+
Captured stderr call
[2024-11-11T19:26:53Z WARN  baml_events] Function ExtractPeople:
+    Client: GPT4 (<unknown>) - 234ms
     ---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.
     
@@ -32,8 +32,8 @@
         }
     }
     
-[2024-11-05T19:54:25Z INFO  baml_events] Function ExtractPeople:
-    Client: GPT4 (gpt-4o-2024-08-06) - 1066ms. StopReason: stop. Tokens(in/out): 124/22
+[2024-11-11T19:26:55Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-08-06) - 2696ms. StopReason: stop. Tokens(in/out): 124/22
     ---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.
     
@@ -60,11 +60,11 @@
         "hair_color": "BLACK"
       }
     ]
-

Teardown

PASSED test_sync 0:00:00.408052

Setup

Call

Captured stdout call
got response key
+

Teardown

PASSED test_sync 0:00:00.420527

Setup

Call

Captured stdout call
got response key
 true
 52
-
Captured stderr call
[2024-11-05T19:54:26Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 406ms. StopReason: stop. Tokens(in/out): 19/5
+
Captured stderr call
[2024-11-11T19:26:56Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 417ms. StopReason: stop. Tokens(in/out): 19/5
     ---PROMPT---
     [chat] system: Print these values back to me:
     key
@@ -77,8 +77,8 @@
     52
     ---Parsed Response (string)---
     "key\ntrue\n52"
-

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.370021

Setup

Call

Captured stderr call
[2024-11-05T19:54:26Z INFO  baml_events] Function TestFnNamedArgsSingleBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 368ms. StopReason: stop. Tokens(in/out): 15/1
+

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.392597

Setup

Call

Captured stderr call
[2024-11-11T19:26:56Z INFO  baml_events] Function TestFnNamedArgsSingleBool:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 388ms. StopReason: stop. Tokens(in/out): 15/1
     ---PROMPT---
     [chat] system: Return this value back to me: true
     
@@ -86,8 +86,8 @@
     true
     ---Parsed Response (string)---
     "true"
-

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.706536

Setup

Call

Captured stderr call
[2024-11-05T19:54:27Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 703ms. StopReason: stop. Tokens(in/out): 23/9
+

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.517886

Setup

Call

Captured stderr call
[2024-11-11T19:26:57Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 511ms. StopReason: stop. Tokens(in/out): 23/9
     ---PROMPT---
     [chat] system: Return this value back to me: ["a", "b", "c"]
     
@@ -95,8 +95,8 @@
     ["a", "b", "c"]
     ---Parsed Response (string)---
     "[\"a\", \"b\", \"c\"]"
-

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.345808

Setup

Call

Captured stderr call
[2024-11-05T19:54:27Z INFO  baml_events] Function LiteralUnionsTest:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 343ms. StopReason: stop. Tokens(in/out): 31/1
+

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.462986

Setup

Call

Captured stderr call
[2024-11-11T19:26:57Z INFO  baml_events] Function LiteralUnionsTest:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 453ms. StopReason: stop. Tokens(in/out): 31/1
     ---PROMPT---
     [chat] system: Return one of these values: 
     Answer in JSON using any of these schemas:
@@ -106,8 +106,8 @@
     1
     ---Parsed Response (int)---
     1
-

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.781047

Setup

Call

Captured stderr call
[2024-11-05T19:54:28Z INFO  baml_events] Function PredictAge:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 774ms. StopReason: stop. Tokens(in/out): 116/36
+

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.725449

Setup

Call

Captured stderr call
[2024-11-11T19:26:58Z INFO  baml_events] Function PredictAge:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 710ms. StopReason: stop. Tokens(in/out): 116/36
     ---PROMPT---
     [chat] system: Using your understanding of the historical popularity
     of names, predict the age of a person with the name
@@ -162,9 +162,9 @@
       "species": {
         "value": "Homo sapiens",
         "checks": {
-          "trivial": {
-            "name": "trivial",
-            "expression": "this == \"Homo sapiens\"",
+          "regex_good": {
+            "name": "regex_good",
+            "expression": "this|regex_match(\"Homo\")",
             "status": "succeeded"
           },
           "regex_bad": {
@@ -172,16 +172,16 @@
             "expression": "this|regex_match(\"neanderthalensis\")",
             "status": "failed"
           },
-          "regex_good": {
-            "name": "regex_good",
-            "expression": "this|regex_match(\"Homo\")",
+          "trivial": {
+            "name": "trivial",
+            "expression": "this == \"Homo sapiens\"",
             "status": "succeeded"
           }
         }
       }
     }
-

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.718112

Setup

Call

Captured stderr call
[2024-11-05T19:54:29Z INFO  baml_events] Function ExtractContactInfo:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 705ms. StopReason: stop. Tokens(in/out): 98/39
+

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.917260

Setup

Call

Captured stderr call
[2024-11-11T19:26:59Z INFO  baml_events] Function ExtractContactInfo:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 894ms. StopReason: stop. Tokens(in/out): 98/39
     ---PROMPT---
     [chat] system: Extract a primary contact info, and if possible a secondary contact
     info, from this document:
@@ -220,8 +220,8 @@
         "value": "111-222-3333"
       }
     }
-

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.499815

Setup

Call

Captured stderr call
[2024-11-05T19:54:29Z WARN  baml_events] Function ReturnMalformedConstraints:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 495ms. StopReason: stop. Tokens(in/out): 28/9
+

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:01.874296

Setup

Call

Captured stderr call
[2024-11-11T19:27:01Z WARN  baml_events] Function ReturnMalformedConstraints:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1867ms. StopReason: stop. Tokens(in/out): 28/9
     ---PROMPT---
     [chat] system: Return the integer after 1
     
@@ -238,10 +238,10 @@
     Failed to coerce value: <root>: Failed while parsing required fields: missing=0, unparsed=1
       - <root>: Failed to parse field foo: foo: Failed to evaluate constraints: unknown method: object has no method named length (in <string>:1)
         - foo: Failed to evaluate constraints: unknown method: object has no method named length (in <string>:1)
-

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.002574

Setup

Call

Captured stderr call
[2024-11-05T19:54:29Z ERROR baml_runtime::tracing]   Error: a: Failed to evaluate assert: Error evaluating constraint: unknown method: object has no method named length (in <string>:1)
+

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.003463

Setup

Call

Captured stderr call
[2024-11-11T19:27:01Z ERROR baml_runtime::tracing]   Error: a: Failed to evaluate assert: Error evaluating constraint: unknown method: object has no method named length (in <string>:1)
     
-

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.519443

Setup

Call

Captured stderr call
[2024-11-05T19:54:30Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 516ms. StopReason: stop. Tokens(in/out): 19/5
+

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.948883

Setup

Call

Captured stderr call
[2024-11-11T19:27:02Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 942ms. StopReason: stop. Tokens(in/out): 19/5
     ---PROMPT---
     [chat] system: Print these values back to me:
     key
@@ -254,8 +254,8 @@
     52
     ---Parsed Response (string)---
     "key\ntrue\n52"
-

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.527998

Setup

Call

Captured stderr call
[2024-11-05T19:54:30Z INFO  baml_events] Function TestMulticlassNamedArgs:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 522ms. StopReason: stop. Tokens(in/out): 25/11
+

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.460532

Setup

Call

Captured stderr call
[2024-11-11T19:27:02Z INFO  baml_events] Function TestMulticlassNamedArgs:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 452ms. StopReason: stop. Tokens(in/out): 25/11
     ---PROMPT---
     [chat] system: Print these values back to me:
     key
@@ -266,16 +266,16 @@
     64
     
     ---LLM REPLY---
-    key
-    true
-    52
-    key
-    true
+    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.426740

Setup

Call

Captured stderr call
[2024-11-05T19:54:31Z INFO  baml_events] Function TestFnNamedArgsSingleEnumList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 422ms. StopReason: stop. Tokens(in/out): 18/4
+    "key  \ntrue  \n52  \nkey  \ntrue  \n64"
+

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.405180

Setup

Call

Captured stderr call
[2024-11-11T19:27:03Z INFO  baml_events] Function TestFnNamedArgsSingleEnumList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 397ms. StopReason: stop. Tokens(in/out): 18/4
     ---PROMPT---
     [chat] system: Print these values back to me:
     ["TWO"]
@@ -284,8 +284,8 @@
     ["TWO"]
     ---Parsed Response (string)---
     "[\"TWO\"]"
-

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.480304

Setup

Call

Captured stderr call
[2024-11-05T19:54:31Z INFO  baml_events] Function TestFnNamedArgsSingleFloat:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 477ms. StopReason: stop. Tokens(in/out): 18/3
+

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.515763

Setup

Call

Captured stderr call
[2024-11-11T19:27:03Z INFO  baml_events] Function TestFnNamedArgsSingleFloat:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 509ms. StopReason: stop. Tokens(in/out): 18/3
     ---PROMPT---
     [chat] system: Return this value back to me: 3.12
     
@@ -293,8 +293,8 @@
     3.12
     ---Parsed Response (string)---
     "3.12"
-

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.662206

Setup

Call

Captured stderr call
[2024-11-05T19:54:32Z INFO  baml_events] Function TestFnNamedArgsSingleInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 659ms. StopReason: stop. Tokens(in/out): 17/2
+

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.424194

Setup

Call

Captured stderr call
[2024-11-11T19:27:04Z INFO  baml_events] Function TestFnNamedArgsSingleInt:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 419ms. StopReason: stop. Tokens(in/out): 17/2
     ---PROMPT---
     [chat] system: Return this value back to me: 3566
     
@@ -302,8 +302,8 @@
     3566
     ---Parsed Response (string)---
     "3566"
-

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.402970

Setup

Call

Captured stderr call
[2024-11-05T19:54:32Z INFO  baml_events] Function TestNamedArgsLiteralInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 399ms. StopReason: stop. Tokens(in/out): 16/1
+

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.356345

Setup

Call

Captured stderr call
[2024-11-11T19:27:04Z INFO  baml_events] Function TestNamedArgsLiteralInt:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 350ms. StopReason: stop. Tokens(in/out): 16/1
     ---PROMPT---
     [chat] system: Return this value back to me: 1
     
@@ -311,8 +311,8 @@
     1
     ---Parsed Response (string)---
     "1"
-

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.644420

Setup

Call

Captured stderr call
[2024-11-05T19:54:33Z INFO  baml_events] Function TestNamedArgsLiteralBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 640ms. StopReason: stop. Tokens(in/out): 15/1
+

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.376583

Setup

Call

Captured stderr call
[2024-11-11T19:27:04Z INFO  baml_events] Function TestNamedArgsLiteralBool:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 371ms. StopReason: stop. Tokens(in/out): 15/1
     ---PROMPT---
     [chat] system: Return this value back to me: true
     
@@ -320,17 +320,17 @@
     true
     ---Parsed Response (string)---
     "true"
-

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.521603

Setup

Call

Captured stderr call
[2024-11-05T19:54:33Z INFO  baml_events] Function TestNamedArgsLiteralString:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 519ms. StopReason: stop. Tokens(in/out): 16/2
+

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.433627

Setup

Call

Captured stderr call
[2024-11-11T19:27:05Z INFO  baml_events] Function TestNamedArgsLiteralString:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 427ms. StopReason: stop. Tokens(in/out): 16/8
     ---PROMPT---
     [chat] system: Return this value back to me: My String
     
     ---LLM REPLY---
-    My String
+    The value you entered is: My String
     ---Parsed Response (string)---
-    "My String"
-

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:01.109324

Setup

Call

Captured stderr call
[2024-11-05T19:54:35Z INFO  baml_events] Function FnLiteralClassInputOutput:
-    Client: GPT4 (gpt-4o-2024-08-06) - 1105ms. StopReason: stop. Tokens(in/out): 30/13
+    "The value you entered is: My String"
+

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:00.841751

Setup

Call

Captured stderr call
[2024-11-11T19:27:06Z INFO  baml_events] Function FnLiteralClassInputOutput:
+    Client: GPT4 (gpt-4o-2024-08-06) - 832ms. StopReason: stop. Tokens(in/out): 30/13
     ---PROMPT---
     [chat] system: Return the same object you were given.
     Answer in JSON using this schema:
@@ -348,8 +348,8 @@
     {
       "prop": "hello"
     }
-

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.628783

Setup

Call

Captured stderr call
[2024-11-05T19:54:35Z INFO  baml_events] Function FnLiteralUnionClassInputOutput:
-    Client: GPT4 (gpt-4o-2024-08-06) - 624ms. StopReason: stop. Tokens(in/out): 41/13
+

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.662402

Setup

Call

Captured stderr call
[2024-11-11T19:27:06Z INFO  baml_events] Function FnLiteralUnionClassInputOutput:
+    Client: GPT4 (gpt-4o-2024-08-06) - 654ms. StopReason: stop. Tokens(in/out): 54/13
     ---PROMPT---
     [chat] system: Return the same object you were given.
     Answer in JSON using any of these schemas:
@@ -358,6 +358,9 @@
     } or {
       prop: "two",
     }
+    user: {
+        "prop": "one",
+    }
     
     ---LLM REPLY---
     ```json
@@ -369,20 +372,20 @@
     {
       "prop": "one"
     }
-

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.559410

Setup

Call

Captured stderr call
[2024-11-05T19:54:36Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToString:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 554ms. StopReason: stop. Tokens(in/out): 29/15
+

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.545213

Setup

Call

Captured stderr call
[2024-11-11T19:27:07Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToString:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 538ms. StopReason: stop. Tokens(in/out): 29/15
     ---PROMPT---
-    [chat] system: Return this value back to me: {"dolor": "sit", "lorem": "ipsum"}
+    [chat] system: Return this value back to me: {"lorem": "ipsum", "dolor": "sit"}
     
     ---LLM REPLY---
-    {"dolor": "sit", "lorem": "ipsum"}
+    {"lorem": "ipsum", "dolor": "sit"}
     ---Parsed Response (map<string, string>)---
     {
-      "dolor": "sit",
-      "lorem": "ipsum"
+      "lorem": "ipsum",
+      "dolor": "sit"
     }
-

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.609054

Setup

Call

Captured stderr call
[2024-11-05T19:54:36Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 602ms. StopReason: stop. Tokens(in/out): 28/18
+

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.629675

Setup

Call

Captured stderr call
[2024-11-11T19:27:07Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 622ms. StopReason: stop. Tokens(in/out): 28/18
     ---PROMPT---
     [chat] system: Return this value back to me: {"lorem": {
         "word": "ipsum",
@@ -400,8 +403,8 @@
         "word": "ipsum"
       }
     }
-

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.579827

Setup

Call

Captured stderr call
[2024-11-05T19:54:37Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToMap:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 572ms. StopReason: stop. Tokens(in/out): 25/11
+

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.440707

Setup

Call

Captured stderr call
[2024-11-11T19:27:08Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToMap:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 434ms. StopReason: stop. Tokens(in/out): 25/11
     ---PROMPT---
     [chat] system: Return this value back to me: {"lorem": {"word": "ipsum"}}
     
@@ -413,22 +416,17 @@
         "word": "ipsum"
       }
     }
-

Teardown

FAILED test_should_work_for_all_outputs 0:00:02.672510

assert 0 > 0
- +  where 0 = len([])

Setup

Call

>   ???
-E   assert 0 > 0
-E    +  where 0 = len([])
-
-tests/test_functions.py:260: AssertionError
Captured stderr call
[2024-11-05T19:54:37Z INFO  baml_events] Function FnOutputBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 416ms. StopReason: stop. Tokens(in/out): 16/1
+

Teardown

PASSED test_should_work_for_all_outputs 0:00:05.795874

Setup

Call

Captured stderr call
[2024-11-11T19:27:08Z INFO  baml_events] Function FnOutputBool:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 370ms. StopReason: stop. Tokens(in/out): 15/1
     ---PROMPT---
-    [chat] system: Return a true: Answer as a: bool
+    [chat] system: Return a true: Answer as a bool
     
     ---LLM REPLY---
-    True
+    true
     ---Parsed Response (bool)---
     true
-[2024-11-05T19:54:38Z INFO  baml_events] Function FnOutputInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 488ms. StopReason: stop. Tokens(in/out): 17/1
+[2024-11-11T19:27:09Z INFO  baml_events] Function FnOutputInt:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 370ms. StopReason: stop. Tokens(in/out): 17/1
     ---PROMPT---
     [chat] system: Return the integer 5 with no additional context.
     
@@ -436,18 +434,18 @@
     5
     ---Parsed Response (int)---
     5
-[2024-11-05T19:54:38Z INFO  baml_events] Function FnOutputLiteralInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 427ms. StopReason: stop. Tokens(in/out): 18/6
+[2024-11-11T19:27:09Z INFO  baml_events] Function FnOutputLiteralInt:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 403ms. StopReason: stop. Tokens(in/out): 18/1
     ---PROMPT---
     [chat] system: Return an integer: Answer using this specific value:
     5
     
     ---LLM REPLY---
-    The answer is 5.
+    5
     ---Parsed Response (int)---
     5
-[2024-11-05T19:54:39Z INFO  baml_events] Function FnOutputLiteralBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 399ms. StopReason: stop. Tokens(in/out): 18/1
+[2024-11-11T19:27:09Z INFO  baml_events] Function FnOutputLiteralBool:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 382ms. StopReason: stop. Tokens(in/out): 18/1
     ---PROMPT---
     [chat] system: Return a false: Answer using this specific value:
     false
@@ -456,18 +454,18 @@
     false
     ---Parsed Response (bool)---
     false
-[2024-11-05T19:54:39Z INFO  baml_events] Function FnOutputLiteralString:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 405ms. StopReason: stop. Tokens(in/out): 21/4
+[2024-11-11T19:27:10Z INFO  baml_events] Function FnOutputLiteralString:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 669ms. StopReason: stop. Tokens(in/out): 21/2
     ---PROMPT---
     [chat] system: Return a string: Answer using this specific value:
     "example output"
     
     ---LLM REPLY---
-    "example output"
+    example output
     ---Parsed Response (string)---
     "example output"
-[2024-11-05T19:54:40Z INFO  baml_events] Function FnOutputClassList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 495ms. StopReason: stop. Tokens(in/out): 46/1
+[2024-11-11T19:27:11Z INFO  baml_events] Function FnOutputClassList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1222ms. StopReason: stop. Tokens(in/out): 46/63
     ---PROMPT---
     [chat] system: Return a JSON array that follows this schema: 
     Answer with a JSON Array using this schema:
@@ -481,67 +479,178 @@
     JSON:
     
     ---LLM REPLY---
-    []
+    [
+        {
+          "prop1": "apple",
+          "prop2": 5
+        },
+        {
+          "prop1": "banana",
+          "prop2": 3
+        },
+        {
+          "prop1": "orange",
+          "prop2": 8
+        }
+      ]
+    ---Parsed Response (list<class TestOutputClass>)---
+    [
+      {
+        "prop1": "apple",
+        "prop2": 5
+      },
+      {
+        "prop1": "banana",
+        "prop2": 3
+      },
+      {
+        "prop1": "orange",
+        "prop2": 8
+      }
+    ]
+[2024-11-11T19:27:12Z INFO  baml_events] Function FnOutputClassWithEnum:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 619ms. StopReason: stop. Tokens(in/out): 48/21
+    ---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-11-11T19:27:12Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 596ms. StopReason: stop. Tokens(in/out): 50/18
+    ---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-11-11T19:27:13Z INFO  baml_events] Function FnEnumListOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 434ms. StopReason: stop. Tokens(in/out): 51/11
+    ---PROMPT---
+    [chat] system: Print out two of these values randomly selected from the list below in a json array.
     
-    ---Parsed Response (list<?>)---
-    []
-

Teardown

PASSED test_should_work_with_image_url 0:00:01.382067

Setup

Call

Captured stderr call
[2024-11-05T19:54:41Z INFO  baml_events] Function TestImageInput:
-    Client: GPT4o (gpt-4o-2024-08-06) - 1377ms. StopReason: stop. Tokens(in/out): 275/8
+    Answer with a JSON Array using this schema:
+    [
+      'ONE' or 'TWO' or 'THREE'
+    ]
+    
+    Answer:
+    
+    ---LLM REPLY---
+    [
+      "ONE",
+      "TWO"
+    ]
+    ---Parsed Response (list<enum EnumOutput>)---
+    [
+      "ONE",
+      "TWO"
+    ]
+[2024-11-11T19:27:14Z INFO  baml_events] Function FnEnumOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 672ms. StopReason: stop. Tokens(in/out): 42/20
+    ---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---
+    In the vast ocean
+    Waves whisper ancient secrets
+    Majestic beauty
+    
+    VALUE_ENUM: TWO
+    ---Parsed Response (enum EnumOutput)---
+    "TWO"
+

Teardown

PASSED test_should_work_with_image_url 0:00:01.069187

Setup

Call

Captured stderr call
[2024-11-11T19:27:15Z INFO  baml_events] Function TestImageInput:
+    Client: GPT4o (gpt-4o-2024-08-06) - 1061ms. StopReason: stop. Tokens(in/out): 275/6
     ---PROMPT---
     [chat] user: Describe this in 4 words. One word must be the color<image_placeholder: https://upload.wikimedia.org/wikipedia/en/4/4d/Shrek_%28character%29.png>
     
     ---LLM REPLY---
-    Green, animated, smiling ogre.
+    Green ogre in clothes.
     ---Parsed Response (string)---
-    "Green, animated, smiling ogre."
-

Teardown

PASSED test_should_work_with_image_list 0:00:01.547280

Setup

Call

Captured stderr call
[2024-11-05T19:54:43Z INFO  baml_events] Function TestImageListInput:
-    Client: GPT4o (gpt-4o-2024-08-06) - 1540ms. StopReason: stop. Tokens(in/out): 528/7
+    "Green ogre in clothes."
+

Teardown

PASSED test_should_work_with_image_list 0:00:01.501662

Setup

Call

Captured stderr call
[2024-11-11T19:27:16Z INFO  baml_events] Function TestImageListInput:
+    Client: GPT4o (gpt-4o-2024-08-06) - 1494ms. StopReason: stop. Tokens(in/out): 528/9
     ---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---
-    Both images feature the color green.
+    Both images have the color green in common.
     ---Parsed Response (string)---
-    "Both images feature the color green."
-

Teardown

PASSED test_should_work_with_vertex 0:00:10.080527

Setup

Call

Captured stderr call
[2024-11-05T19:54:53Z INFO  baml_events] Function TestVertex:
-    Client: Vertex () - 10071ms. StopReason: "STOP". Tokens(in/out): 8/471
+    "Both images have the color green in common."
+

Teardown

PASSED test_should_work_with_vertex 0:00:09.695080

Setup

Call

Captured stderr call
[2024-11-11T19:27:26Z INFO  baml_events] Function TestVertex:
+    Client: Vertex () - 9686ms. StopReason: "STOP". Tokens(in/out): 8/481
     ---PROMPT---
     [chat] user: Write a nice short story about donkey kong
     
     ---LLM REPLY---
-    The jungle symphony was in full swing, a cacophony of chirps, croaks, and the rustling of leaves. Donkey Kong, however, paid it no mind. He sat on his favorite cliff, the setting sun painting the sky in fiery hues, a melancholy air about him. He missed Diddy.
-    
-    The little monkey had been gone for days, on a quest to find the legendary Golden Banana, said to grant eternal joy. Donkey Kong had scoffed at the legend, content with his life of bananas and naps. But Diddy, always the adventurer, was determined.
+    The humid jungle air hung heavy as Donkey Kong ambled through his banana grove, the morning sun dappling through the leaves onto his fur. He hummed a happy, off-key tune, gently patting his belly full of freshly picked bananas. Life was good. He had a mountain of bananas, a beautiful sunset every evening, and not a single pesky plumber in sight. 
     
-    A familiar chirp broke Donkey Kong from his thoughts. A small, blue bird landed on his knee, a tiny scroll tied to its leg. Donkey Kong carefully unfurled it. It was Diddy's scrawl: "Found it! Trapped. Need help! Hurry!" followed by a crude map.
+    He stopped by a particularly plump bunch, its golden fruit almost glowing in the morning light.  He reached out, eager to pluck the prize, when a flash of pink caught his eye.
     
-    Donkey Kong's heart pounded. Diddy was in trouble! He scooped up the bird, who affectionately nuzzled his finger. "Lead the way, little friend," he rumbled, his voice thick with worry.
+    There, nestled amongst the leaves, was a tiny, whimpering creature. Pink and hairless, it barely resembled the jungle animals Donkey Kong knew. He leaned closer, his fur brushing against the little thing. It let out a tiny squeak and instinctively clung to his fur.
     
-    He followed the bird through tangled undergrowth and across rushing rivers. The map led to a dormant volcano, its entrance sealed by fallen rocks. Donkey Kong felt a tremor of fear. He had to get to Diddy.
+    Donkey Kong was confused. This creature was clearly lost and scared, yet...he felt a strange protectiveness towards it.  He couldn't leave it alone. With a grunt, he scooped the tiny creature into his large hand. It was soft and warm, and it looked at him with wide, trusting eyes. 
     
-    With a roar that shook the trees, he began to move the boulders, his immense strength making light work of the obstacle. The bird chirped encouragingly. Finally, Donkey Kong cleared a path and rushed inside.
+    He decided to call it "Pinky."
     
-    He found Diddy hanging precariously from a vine over a bubbling lava pit, the Golden Banana glinting nearby. Donkey Kong, with a mighty leap and a swing of his long arms, snatched Diddy from danger. 
+    For weeks, Donkey Kong cared for Pinky, feeding it mashed bananas and keeping it safe from curious monkeys and mischievous snakes. He even let Pinky sleep in a nest of soft leaves in his treetop hammock. Pinky, in turn, filled Donkey Kong’s days with unexpected joy. 
     
-    Safe in Donkey Kong's arms, Diddy beamed, "I knew you'd come!"
+    One evening, as the sun dipped below the horizon, painting the sky in fiery hues, Pinky started making strange noises. Donkey Kong watched, puzzled, as it pointed towards the sky and let out a high-pitched squeal. He tilted his head, trying to understand. Was it…was Pinky trying to sing?
     
-    Donkey Kong grunted, a smile tugging at his lips.  They retrieved the Golden Banana, its glow warming their fur. 
+    Donkey Kong let out a rumbling laugh, and soon, the jungle echoed with a strange but harmonious duet – Donkey Kong’s booming voice and Pinky’s squeaky trills, a melody of friendship echoing in the twilight.
     
-    As they made their way out, Donkey Kong realized the legend was true.  It wasn't the golden fruit that brought joy, but the love and loyalty shared between a grumpy old gorilla and his adventurous little buddy.  And that was a treasure more precious than any gold. 
+    Even though they were different, Donkey Kong knew one thing for sure - he'd found a friend in the most unexpected place. And as he watched Pinky snuggle into his fur, he realized that sometimes, the best things in life come in the smallest packages. 
     
     ---Parsed Response (string)---
-    "The jungle symphony was in full swing, a cacophony of chirps, croaks, and the rustling of leaves. Donkey Kong, however, paid it no mind. He sat on his favorite cliff, the setting sun painting the sky in fiery hues, a melancholy air about him. He missed Diddy.\n\nThe little monkey had been gone for days, on a quest to find the legendary Golden Banana, said to grant eternal joy. Donkey Kong had scoffed at the legend, content with his life of bananas and naps. But Diddy, always the adventurer, was determined.\n\nA familiar chirp broke Donkey Kong from his thoughts. A small, blue bird landed on his knee, a tiny scroll tied to its leg. Donkey Kong carefully unfurled it. It was Diddy's scrawl: \"Found it! Trapped. Need help! Hurry!\" followed by a crude map.\n\nDonkey Kong's heart pounded. Diddy was in trouble! He scooped up the bird, who affectionately nuzzled his finger. \"Lead the way, little friend,\" he rumbled, his voice thick with worry.\n\nHe followed the bird through tangled undergrowth and across rushing rivers. The map led to a dormant volcano, its entrance sealed by fallen rocks. Donkey Kong felt a tremor of fear. He had to get to Diddy.\n\nWith a roar that shook the trees, he began to move the boulders, his immense strength making light work of the obstacle. The bird chirped encouragingly. Finally, Donkey Kong cleared a path and rushed inside.\n\nHe found Diddy hanging precariously from a vine over a bubbling lava pit, the Golden Banana glinting nearby. Donkey Kong, with a mighty leap and a swing of his long arms, snatched Diddy from danger. \n\nSafe in Donkey Kong's arms, Diddy beamed, \"I knew you'd come!\"\n\nDonkey Kong grunted, a smile tugging at his lips.  They retrieved the Golden Banana, its glow warming their fur. \n\nAs they made their way out, Donkey Kong realized the legend was true.  It wasn't the golden fruit that brought joy, but the love and loyalty shared between a grumpy old gorilla and his adventurous little buddy.  And that was a treasure more precious than any gold. \n"
-

Teardown

PASSED test_should_work_with_image_base64 0:00:01.465171

Setup

Call

Captured stderr call
[2024-11-05T19:54:54Z INFO  baml_events] Function TestImageInput:
-    Client: GPT4o (gpt-4o-2024-08-06) - 1437ms. StopReason: stop. Tokens(in/out): 275/7
+    "The humid jungle air hung heavy as Donkey Kong ambled through his banana grove, the morning sun dappling through the leaves onto his fur. He hummed a happy, off-key tune, gently patting his belly full of freshly picked bananas. Life was good. He had a mountain of bananas, a beautiful sunset every evening, and not a single pesky plumber in sight. \n\nHe stopped by a particularly plump bunch, its golden fruit almost glowing in the morning light.  He reached out, eager to pluck the prize, when a flash of pink caught his eye.\n\nThere, nestled amongst the leaves, was a tiny, whimpering creature. Pink and hairless, it barely resembled the jungle animals Donkey Kong knew. He leaned closer, his fur brushing against the little thing. It let out a tiny squeak and instinctively clung to his fur.\n\nDonkey Kong was confused. This creature was clearly lost and scared, yet...he felt a strange protectiveness towards it.  He couldn't leave it alone. With a grunt, he scooped the tiny creature into his large hand. It was soft and warm, and it looked at him with wide, trusting eyes. \n\nHe decided to call it \"Pinky.\"\n\nFor weeks, Donkey Kong cared for Pinky, feeding it mashed bananas and keeping it safe from curious monkeys and mischievous snakes. He even let Pinky sleep in a nest of soft leaves in his treetop hammock. Pinky, in turn, filled Donkey Kong’s days with unexpected joy. \n\nOne evening, as the sun dipped below the horizon, painting the sky in fiery hues, Pinky started making strange noises. Donkey Kong watched, puzzled, as it pointed towards the sky and let out a high-pitched squeal. He tilted his head, trying to understand. Was it…was Pinky trying to sing?\n\nDonkey Kong let out a rumbling laugh, and soon, the jungle echoed with a strange but harmonious duet – Donkey Kong’s booming voice and Pinky’s squeaky trills, a melody of friendship echoing in the twilight.\n\nEven though they were different, Donkey Kong knew one thing for sure - he'd found a friend in the most unexpected place. And as he watched Pinky snuggle into his fur, he realized that sometimes, the best things in life come in the smallest packages. \n"
+

Teardown

PASSED test_should_work_with_image_base64 0:00:01.879766

Setup

Call

Captured stderr call
[2024-11-11T19:27:28Z INFO  baml_events] Function TestImageInput:
+    Client: GPT4o (gpt-4o-2024-08-06) - 1851ms. StopReason: stop. Tokens(in/out): 275/6
     ---PROMPT---
     [chat] user: Describe this in 4 words. One word must be the color<image_placeholder base64>
     
     ---LLM REPLY---
-    Green ogre, brown vest.
+    Green animated cartoon ogre.
     ---Parsed Response (string)---
-    "Green ogre, brown vest."
-

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.087347

Setup

Call

Captured stderr call
[2024-11-05T19:54:55Z INFO  baml_events] Function AudioInput:
-    Client: Gemini () - 1073ms. StopReason: "STOP". Tokens(in/out): 114/1
+    "Green animated cartoon ogre."
+

Teardown

PASSED test_should_work_with_audio_base64 0:00:00.810606

Setup

Call

Captured stderr call
[2024-11-11T19:27:29Z INFO  baml_events] Function AudioInput:
+    Client: Gemini () - 795ms. StopReason: "STOP". Tokens(in/out): 114/1
     ---PROMPT---
     [chat] user: Does this sound like a roar? Yes or no? One word no other characters.<audio_placeholder base64>
     
@@ -550,8 +659,8 @@
     
     ---Parsed Response (string)---
     "Yes \n"
-

Teardown

PASSED test_should_work_with_audio_url 0:00:01.200185

Setup

Call

Captured stderr call
[2024-11-05T19:54:56Z INFO  baml_events] Function AudioInput:
-    Client: Gemini () - 1078ms. StopReason: "STOP". Tokens(in/out): 178/1
+

Teardown

PASSED test_should_work_with_audio_url 0:00:01.018003

Setup

Call

Captured stderr call
[2024-11-11T19:27:30Z INFO  baml_events] Function AudioInput:
+    Client: Gemini () - 884ms. StopReason: "STOP". Tokens(in/out): 178/1
     ---PROMPT---
     [chat] user: Does this sound like a roar? Yes or no? One word no other characters.<audio_placeholder base64>
     
@@ -560,10 +669,10 @@
     
     ---Parsed Response (string)---
     "No \n"
-

Teardown

PASSED test_works_with_retries2 0:00:02.380336

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: 1730836499, tv_nsec: 22550000 }, latency: 240.442542ms, 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-11-05T19:54:59Z WARN  baml_events] Function TestRetryExponential:
+

Teardown

PASSED test_works_with_retries2 0:00:02.030863

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: 1731353251, tv_nsec: 940087000 }, latency: 161.383042ms, 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-11-11T19:27:32Z WARN  baml_events] Function TestRetryExponential:
     (3 other previous tries)
-    Client: RetryClientExponential (<unknown>) - 240ms
+    Client: RetryClientExponential (<unknown>) - 161ms
     ---PROMPT---
     [chat] system: Say a haiku
     
@@ -579,363 +688,460 @@
         }
     }
     
-

Teardown

PASSED test_works_with_fallbacks 0:00:02.041390

Setup

Call

Captured stderr call
[2024-11-05T19:55:01Z INFO  baml_events] Function TestFallbackClient:
+

Teardown

PASSED test_works_with_fallbacks 0:00:01.676532

Setup

Call

Captured stderr call
[2024-11-11T19:27:33Z INFO  baml_events] Function TestFallbackClient:
     (5 other previous tries)
-    Client: GPT35 (gpt-3.5-turbo-0125) - 639ms. StopReason: stop. Tokens(in/out): 14/16
+    Client: GPT35 (gpt-3.5-turbo-0125) - 532ms. StopReason: stop. Tokens(in/out): 14/17
     ---PROMPT---
     [chat] system: Say a haiku about mexico.
     
     ---LLM REPLY---
-    Vibrant colors shine
-    Mariachi music calls
-    Mexico's heart beats true
+    Desert meets ocean,
+    Vibrant culture, spicy cuisine,
+    Mexico's beauty.
     ---Parsed Response (string)---
-    "Vibrant colors shine\nMariachi music calls\nMexico's heart beats true"
-

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.003004

Setup

Call

Captured stderr call
[2024-11-05T19:55:01Z ERROR baml_runtime::tracing] Either base_url or (resource_name, deployment_id) must be provided
-

Teardown

PASSED test_claude 0:00:01.141294

Setup

Call

Captured stderr call
[2024-11-05T19:55:02Z INFO  baml_events] Function PromptTestClaude:
-    Client: Sonnet (claude-3-5-sonnet-20241022) - 1135ms. StopReason: "end_turn". Tokens(in/out): 19/44
+    "Desert meets ocean,\nVibrant culture, spicy cuisine,\nMexico's beauty."
+

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.003238

Setup

Call

Captured stderr call
[2024-11-11T19:27:33Z ERROR baml_runtime::tracing] Either base_url or both (resource_name, deployment_id) must be provided
+

Teardown

PASSED test_claude 0:00:00.907101

Setup

Call

Captured stderr call
[2024-11-11T19:27:34Z INFO  baml_events] Function PromptTestClaude:
+    Client: Sonnet (claude-3-5-sonnet-20241022) - 900ms. StopReason: "end_turn". Tokens(in/out): 19/34
     ---PROMPT---
     [chat] user: Tell me a haiku about Mt Rainier is tall
     
     ---LLM REPLY---
     Here's a haiku about Mt. Rainier:
     
-    Rainier stands proud, high
-    Piercing through clouds to the sky
-    Nature's crown of snow
+    Rainier stands supreme
+    Piercing clouds with snowy peak
+    Guardian of time
     ---Parsed Response (string)---
-    "Here's a haiku about Mt. Rainier:\n\nRainier stands proud, high\nPiercing through clouds to the sky\nNature's crown of snow"
-

Teardown

PASSED test_gemini 0:00:07.400576

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pepper wasn't a doctor at all, not in the traditional sense. He didn't wear a white coat or have a stethoscope slung around his neck. No, Dr. Pepper was a feeling, an effervescent sensation that lived inside a glass bottle.
+    "Here's a haiku about Mt. Rainier:\n\nRainier stands supreme\nPiercing clouds with snowy peak\nGuardian of time"
+

Teardown

PASSED test_gemini 0:00:08.387621

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pepper wasn't a doctor, not really. He didn't have a practice, or a degree hanging on the wall, but everyone in town called him "Doc" anyway. Maybe it was the twinkle in his eye, the way he listened with a tilted head and a soft "hmm" as you poured your heart out, or perhaps it was the steaming mugs of his famous concoction he offered, always brewed to perfection. 
 
-He spent his days on supermarket shelves, nestled between his bubbly brethren, dreaming of adventure. He yearned to escape the monotony of cardboard boxes and fluorescent lights, to quench a thirst that went beyond the physical.
+Doc Pepper's "cure-all," as he playfully called it, wasn't found in any medical journal. It was a secret blend of spices and fruits, simmered low and slow on his ancient stovetop. A sip of Doc's brew could chase away the blues, mend a broken heart, or simply warm you from the inside out on a cold day. 
 
-One Tuesday, a hand reached for him. It belonged to a girl with sunshine hair and eyes full of stories. Dr. Pepper felt a flutter of hope. This wasn't just any hand; this was the hand of an adventurer.
+One blustery afternoon, a young woman named Lily arrived at Doc's doorstep, her shoulders slumped with worry. Her dreams of becoming a writer felt as distant as the stars. Doc listened patiently, his brow furrowed in thought. Then, with a knowing smile, he handed her a steaming mug.
 
-The girl, whose name was Lily, took him on all sorts of escapades. He accompanied her to the park, where he soaked in the laughter of children and the warmth of the sun. He was there during her triumphs, like when she finally finished that challenging puzzle, and during her quiet moments of contemplation, sharing the silence as she stared at the night sky. 
+"There's magic in every story," he said, his voice a low rumble, "sometimes you just need a little something to help you taste it."
 
-Lily treated Dr. Pepper differently than she did the other drinks. She savored each sip, her face lighting up with delight at the unique blend of flavors. It wasn't just his 23 flavors she appreciated; it was the feeling he evoked – a sense of joyful possibility and a reminder that even the smallest moments could sparkle.
+Lily took a tentative sip. The flavors danced on her tongue: a hint of cinnamon, a whisper of cherry, a touch of something she couldn't quite place, yet felt strangely familiar.  As the warmth spread through her, she felt a spark ignite within.  She spent the rest of the afternoon at Doc's table, scribbling furiously in her notebook, the words flowing as effortlessly as the steam from her mug.
 
-As the last drop was consumed, Dr. Pepper felt a pang of sadness. He knew his time with Lily was ending, but he also felt a sense of satisfaction. He had lived up to his name, not as a medical doctor, but as a doctor of delight, a dispenser of joy. He knew that somewhere out there, another adventure, another Lily, awaited. And he couldn't wait. 
+Doc Pepper's brew didn't hold any magical properties, not really. But sometimes, all it took was a listening ear, a warm smile, and a unique blend of flavors to remind people of the magic they already possessed. And that, perhaps, was the best medicine of all. 
 
-
Captured stderr call
[2024-11-05T19:55:09Z INFO  baml_events] Function TestGemini:
-    Client: Gemini () - 7392ms. StopReason: "STOP". Tokens(in/out): 10/375
+
Captured stderr call
[2024-11-11T19:27:43Z INFO  baml_events] Function TestGemini:
+    Client: Gemini () - 8379ms. StopReason: "STOP". Tokens(in/out): 10/411
     ---PROMPT---
     [chat] user: Write a nice short story about Dr. Pepper
     
     ---LLM REPLY---
-    Dr. Pepper wasn't a doctor at all, not in the traditional sense. He didn't wear a white coat or have a stethoscope slung around his neck. No, Dr. Pepper was a feeling, an effervescent sensation that lived inside a glass bottle.
+    Dr. Pepper wasn't a doctor, not really. He didn't have a practice, or a degree hanging on the wall, but everyone in town called him "Doc" anyway. Maybe it was the twinkle in his eye, the way he listened with a tilted head and a soft "hmm" as you poured your heart out, or perhaps it was the steaming mugs of his famous concoction he offered, always brewed to perfection. 
     
-    He spent his days on supermarket shelves, nestled between his bubbly brethren, dreaming of adventure. He yearned to escape the monotony of cardboard boxes and fluorescent lights, to quench a thirst that went beyond the physical.
+    Doc Pepper's "cure-all," as he playfully called it, wasn't found in any medical journal. It was a secret blend of spices and fruits, simmered low and slow on his ancient stovetop. A sip of Doc's brew could chase away the blues, mend a broken heart, or simply warm you from the inside out on a cold day. 
     
-    One Tuesday, a hand reached for him. It belonged to a girl with sunshine hair and eyes full of stories. Dr. Pepper felt a flutter of hope. This wasn't just any hand; this was the hand of an adventurer.
+    One blustery afternoon, a young woman named Lily arrived at Doc's doorstep, her shoulders slumped with worry. Her dreams of becoming a writer felt as distant as the stars. Doc listened patiently, his brow furrowed in thought. Then, with a knowing smile, he handed her a steaming mug.
     
-    The girl, whose name was Lily, took him on all sorts of escapades. He accompanied her to the park, where he soaked in the laughter of children and the warmth of the sun. He was there during her triumphs, like when she finally finished that challenging puzzle, and during her quiet moments of contemplation, sharing the silence as she stared at the night sky. 
+    "There's magic in every story," he said, his voice a low rumble, "sometimes you just need a little something to help you taste it."
     
-    Lily treated Dr. Pepper differently than she did the other drinks. She savored each sip, her face lighting up with delight at the unique blend of flavors. It wasn't just his 23 flavors she appreciated; it was the feeling he evoked – a sense of joyful possibility and a reminder that even the smallest moments could sparkle.
+    Lily took a tentative sip. The flavors danced on her tongue: a hint of cinnamon, a whisper of cherry, a touch of something she couldn't quite place, yet felt strangely familiar.  As the warmth spread through her, she felt a spark ignite within.  She spent the rest of the afternoon at Doc's table, scribbling furiously in her notebook, the words flowing as effortlessly as the steam from her mug.
     
-    As the last drop was consumed, Dr. Pepper felt a pang of sadness. He knew his time with Lily was ending, but he also felt a sense of satisfaction. He had lived up to his name, not as a medical doctor, but as a doctor of delight, a dispenser of joy. He knew that somewhere out there, another adventure, another Lily, awaited. And he couldn't wait. 
+    Doc Pepper's brew didn't hold any magical properties, not really. But sometimes, all it took was a listening ear, a warm smile, and a unique blend of flavors to remind people of the magic they already possessed. And that, perhaps, was the best medicine of all. 
     
     ---Parsed Response (string)---
-    "Dr. Pepper wasn't a doctor at all, not in the traditional sense. He didn't wear a white coat or have a stethoscope slung around his neck. No, Dr. Pepper was a feeling, an effervescent sensation that lived inside a glass bottle.\n\nHe spent his days on supermarket shelves, nestled between his bubbly brethren, dreaming of adventure. He yearned to escape the monotony of cardboard boxes and fluorescent lights, to quench a thirst that went beyond the physical.\n\nOne Tuesday, a hand reached for him. It belonged to a girl with sunshine hair and eyes full of stories. Dr. Pepper felt a flutter of hope. This wasn't just any hand; this was the hand of an adventurer.\n\nThe girl, whose name was Lily, took him on all sorts of escapades. He accompanied her to the park, where he soaked in the laughter of children and the warmth of the sun. He was there during her triumphs, like when she finally finished that challenging puzzle, and during her quiet moments of contemplation, sharing the silence as she stared at the night sky. \n\nLily treated Dr. Pepper differently than she did the other drinks. She savored each sip, her face lighting up with delight at the unique blend of flavors. It wasn't just his 23 flavors she appreciated; it was the feeling he evoked – a sense of joyful possibility and a reminder that even the smallest moments could sparkle.\n\nAs the last drop was consumed, Dr. Pepper felt a pang of sadness. He knew his time with Lily was ending, but he also felt a sense of satisfaction. He had lived up to his name, not as a medical doctor, but as a doctor of delight, a dispenser of joy. He knew that somewhere out there, another adventure, another Lily, awaited. And he couldn't wait. \n"
-

Teardown

PASSED test_gemini_streaming 0:00:07.756724

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pepper wasn’t a doctor at all. Not the kind who wore a white coat and peered in ears, anyway. No, Dr. Pepper was a feeling. A tingle that started at the back of your throat, like a fizzy secret, and spread out in a wave of warm, comforting nostalgia. 
+    "Dr. Pepper wasn't a doctor, not really. He didn't have a practice, or a degree hanging on the wall, but everyone in town called him \"Doc\" anyway. Maybe it was the twinkle in his eye, the way he listened with a tilted head and a soft \"hmm\" as you poured your heart out, or perhaps it was the steaming mugs of his famous concoction he offered, always brewed to perfection. \n\nDoc Pepper's \"cure-all,\" as he playfully called it, wasn't found in any medical journal. It was a secret blend of spices and fruits, simmered low and slow on his ancient stovetop. A sip of Doc's brew could chase away the blues, mend a broken heart, or simply warm you from the inside out on a cold day. \n\nOne blustery afternoon, a young woman named Lily arrived at Doc's doorstep, her shoulders slumped with worry. Her dreams of becoming a writer felt as distant as the stars. Doc listened patiently, his brow furrowed in thought. Then, with a knowing smile, he handed her a steaming mug.\n\n\"There's magic in every story,\" he said, his voice a low rumble, \"sometimes you just need a little something to help you taste it.\"\n\nLily took a tentative sip. The flavors danced on her tongue: a hint of cinnamon, a whisper of cherry, a touch of something she couldn't quite place, yet felt strangely familiar.  As the warmth spread through her, she felt a spark ignite within.  She spent the rest of the afternoon at Doc's table, scribbling furiously in her notebook, the words flowing as effortlessly as the steam from her mug.\n\nDoc Pepper's brew didn't hold any magical properties, not really. But sometimes, all it took was a listening ear, a warm smile, and a unique blend of flavors to remind people of the magic they already possessed. And that, perhaps, was the best medicine of all. \n"
+

Teardown

PASSED test_gemini_streaming 0:00:07.311081

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pete Pepper wasn't a doctor of medicine, but a doctor of fizz. His small, unassuming soda shop, tucked away on a side street bustling with life, was his laboratory. It was here he tirelessly toiled, not with beakers and Bunsen burners, but with bubbling fountains and exotic syrups, chasing the perfect effervescent concoction. 
 
-Old Man Higgins, proprietor of Higgins’ Haberdashery and Purveyor of Peculiar Potions, knew this better than anyone. He watched folks cross his threshold, weary from the day, shadows clinging to their shoulders. He'd offer a smile and a wink, "What'll it be today? Tonic for the soul?"
+He already had his "Cherry Smile" and "Lemon Zing," but they lacked a certain... mystery. One breezy afternoon, a traveling musician with a velvet voice and a guitar case full of stories wandered in. He introduced himself as "Dusty," ordered a "Sunset Shimmer" – a drink Pete invented on the spot – and began spinning tales of faraway lands, filled with spices that danced on the tongue and fruits bursting with the sun's fire.
 
-Inevitably, their gaze would fall on the old, oak barrel tucked away in the corner, the one with the faded, red lettering that whispered, "Dr. Pepper." And just like that, the shadows would lift, replaced by a flicker of something brighter. Memory, maybe. Or hope.
+Inspired, Dr. Pepper combined cinnamon syrup, a dash of vanilla, and a secret ingredient whispered by the wind as Dusty strummed his guitar. He poured the concoction into an ice-filled glass, the amber liquid fizzing with an alluring aroma.  Dusty took a sip, his eyes widening. 
 
-One day, a young girl named Lily shuffled in, clutching a worn teddy bear.  "Do you have something for a grumpy heart, mister?" she mumbled, lip trembling.
+"This, my friend," he declared, "is a symphony in a glass! What do you call it?"
 
-Old Man Higgins chuckled, his own heart aching for her unspoken sadness. "Why, I believe I do," he said, pulling out a frosty mug. 
+Dr. Pepper, a humble smile on his face, looked at the musician, then at his creation, a new melody playing on his heartstrings. 
 
-He filled it with the elixir from the whispering barrel, the rich, caramel scent filling the air. Lily took a sip, her eyes widening. The fizzy secret did its work. A smile bloomed on her face, chasing away the gloom. 
+"This," he said, "is Dr. Pepper."
 
-And in that moment, Old Man Higgins knew Dr. Pepper wasn't just a feeling. It was a reminder. A reminder that sometimes, all it takes to chase away the shadows is a little bit of magic, disguised as a drink, in an old oak barrel, whispering stories of joy. 
+And so it was. The recipe, a secret whispered only to the wind, became a legend. The little soda shop, once overlooked, became a haven for dreamers and adventurers, all drawn to the magic brewed within, all thanks to Dr. Pepper, the doctor of fizz, who found his perfect note of mystery in the most unexpected of places. 
 
-
Captured stderr call
[2024-11-05T19:55:17Z INFO  baml_events] Function TestGemini:
-    Client: Gemini (gemini-1.5-pro-001) - 7741ms. StopReason: Stop. Tokens(in/out): unknown/unknown
+
Captured stderr call
[2024-11-11T19:27:50Z INFO  baml_events] Function TestGemini:
+    Client: Gemini (gemini-1.5-pro-001) - 7284ms. StopReason: Stop. Tokens(in/out): unknown/unknown
     ---PROMPT---
     [chat] user: Write a nice short story about Dr. Pepper
     
     ---LLM REPLY---
-    Dr. Pepper wasn’t a doctor at all. Not the kind who wore a white coat and peered in ears, anyway. No, Dr. Pepper was a feeling. A tingle that started at the back of your throat, like a fizzy secret, and spread out in a wave of warm, comforting nostalgia. 
+    Dr. Pete Pepper wasn't a doctor of medicine, but a doctor of fizz. His small, unassuming soda shop, tucked away on a side street bustling with life, was his laboratory. It was here he tirelessly toiled, not with beakers and Bunsen burners, but with bubbling fountains and exotic syrups, chasing the perfect effervescent concoction. 
     
-    Old Man Higgins, proprietor of Higgins’ Haberdashery and Purveyor of Peculiar Potions, knew this better than anyone. He watched folks cross his threshold, weary from the day, shadows clinging to their shoulders. He'd offer a smile and a wink, "What'll it be today? Tonic for the soul?"
+    He already had his "Cherry Smile" and "Lemon Zing," but they lacked a certain... mystery. One breezy afternoon, a traveling musician with a velvet voice and a guitar case full of stories wandered in. He introduced himself as "Dusty," ordered a "Sunset Shimmer" – a drink Pete invented on the spot – and began spinning tales of faraway lands, filled with spices that danced on the tongue and fruits bursting with the sun's fire.
     
-    Inevitably, their gaze would fall on the old, oak barrel tucked away in the corner, the one with the faded, red lettering that whispered, "Dr. Pepper." And just like that, the shadows would lift, replaced by a flicker of something brighter. Memory, maybe. Or hope.
+    Inspired, Dr. Pepper combined cinnamon syrup, a dash of vanilla, and a secret ingredient whispered by the wind as Dusty strummed his guitar. He poured the concoction into an ice-filled glass, the amber liquid fizzing with an alluring aroma.  Dusty took a sip, his eyes widening. 
     
-    One day, a young girl named Lily shuffled in, clutching a worn teddy bear.  "Do you have something for a grumpy heart, mister?" she mumbled, lip trembling.
+    "This, my friend," he declared, "is a symphony in a glass! What do you call it?"
     
-    Old Man Higgins chuckled, his own heart aching for her unspoken sadness. "Why, I believe I do," he said, pulling out a frosty mug. 
+    Dr. Pepper, a humble smile on his face, looked at the musician, then at his creation, a new melody playing on his heartstrings. 
     
-    He filled it with the elixir from the whispering barrel, the rich, caramel scent filling the air. Lily took a sip, her eyes widening. The fizzy secret did its work. A smile bloomed on her face, chasing away the gloom. 
+    "This," he said, "is Dr. Pepper."
     
-    And in that moment, Old Man Higgins knew Dr. Pepper wasn't just a feeling. It was a reminder. A reminder that sometimes, all it takes to chase away the shadows is a little bit of magic, disguised as a drink, in an old oak barrel, whispering stories of joy. 
+    And so it was. The recipe, a secret whispered only to the wind, became a legend. The little soda shop, once overlooked, became a haven for dreamers and adventurers, all drawn to the magic brewed within, all thanks to Dr. Pepper, the doctor of fizz, who found his perfect note of mystery in the most unexpected of places. 
     
     ---Parsed Response (string)---
-    "Dr. Pepper wasn’t a doctor at all. Not the kind who wore a white coat and peered in ears, anyway. No, Dr. Pepper was a feeling. A tingle that started at the back of your throat, like a fizzy secret, and spread out in a wave of warm, comforting nostalgia. \n\nOld Man Higgins, proprietor of Higgins’ Haberdashery and Purveyor of Peculiar Potions, knew this better than anyone. He watched folks cross his threshold, weary from the day, shadows clinging to their shoulders. He'd offer a smile and a wink, \"What'll it be today? Tonic for the soul?\"\n\nInevitably, their gaze would fall on the old, oak barrel tucked away in the corner, the one with the faded, red lettering that whispered, \"Dr. Pepper.\" And just like that, the shadows would lift, replaced by a flicker of something brighter. Memory, maybe. Or hope.\n\nOne day, a young girl named Lily shuffled in, clutching a worn teddy bear.  \"Do you have something for a grumpy heart, mister?\" she mumbled, lip trembling.\n\nOld Man Higgins chuckled, his own heart aching for her unspoken sadness. \"Why, I believe I do,\" he said, pulling out a frosty mug. \n\nHe filled it with the elixir from the whispering barrel, the rich, caramel scent filling the air. Lily took a sip, her eyes widening. The fizzy secret did its work. A smile bloomed on her face, chasing away the gloom. \n\nAnd in that moment, Old Man Higgins knew Dr. Pepper wasn't just a feeling. It was a reminder. A reminder that sometimes, all it takes to chase away the shadows is a little bit of magic, disguised as a drink, in an old oak barrel, whispering stories of joy. \n"
-

Teardown

PASSED test_aws 0:00:02.618416

Setup

Call

Captured stderr call
[2024-11-05T19:55:17Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
-[2024-11-05T19:55:17Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
-[2024-11-05T19:55:20Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 2452ms. StopReason: max_tokens. Tokens(in/out): 19/100
+    "Dr. Pete Pepper wasn't a doctor of medicine, but a doctor of fizz. His small, unassuming soda shop, tucked away on a side street bustling with life, was his laboratory. It was here he tirelessly toiled, not with beakers and Bunsen burners, but with bubbling fountains and exotic syrups, chasing the perfect effervescent concoction. \n\nHe already had his \"Cherry Smile\" and \"Lemon Zing,\" but they lacked a certain... mystery. One breezy afternoon, a traveling musician with a velvet voice and a guitar case full of stories wandered in. He introduced himself as \"Dusty,\" ordered a \"Sunset Shimmer\" – a drink Pete invented on the spot – and began spinning tales of faraway lands, filled with spices that danced on the tongue and fruits bursting with the sun's fire.\n\nInspired, Dr. Pepper combined cinnamon syrup, a dash of vanilla, and a secret ingredient whispered by the wind as Dusty strummed his guitar. He poured the concoction into an ice-filled glass, the amber liquid fizzing with an alluring aroma.  Dusty took a sip, his eyes widening. \n\n\"This, my friend,\" he declared, \"is a symphony in a glass! What do you call it?\"\n\nDr. Pepper, a humble smile on his face, looked at the musician, then at his creation, a new melody playing on his heartstrings. \n\n\"This,\" he said, \"is Dr. Pepper.\"\n\nAnd so it was. The recipe, a secret whispered only to the wind, became a legend. The little soda shop, once overlooked, became a haven for dreamers and adventurers, all drawn to the magic brewed within, all thanks to Dr. Pepper, the doctor of fizz, who found his perfect note of mystery in the most unexpected of places. \n"
+

Teardown

PASSED test_aws 0:00:03.759515

Setup

Call

Captured stderr call
[2024-11-11T19:27:50Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-11-11T19:27:50Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
+[2024-11-11T19:27:54Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-5-sonnet-20240620-v1:0) - 3582ms. StopReason: max_tokens. Tokens(in/out): 19/99
     ---PROMPT---
     [chat] user: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
-    Here is a short story about Mt. Rainier:
-    
-    Mt. Rainier Stands Tall
-    
-    The majestic peak of Mount Rainier stood tall, reaching towards the sky. Its snow-capped summit glistened in the sunlight, a testament to the sheer scale and grandeur of this iconic Pacific Northwest landmark.
+    As the morning mist lifted, Sarah gazed up at the majestic peak of Mount Rainier, its snow-capped summit piercing the sky. She had lived in Washington her whole life, but the mountain's sheer size never failed to take her breath away.
     
-    From a distance, the mountain appeared almost impossibly large, dwarfing the surrounding landscape with its impressive stature. Ne
+    Sarah remembered her grandfather's stories about climbing Rainier in his youth. "It's so tall," he'd say, "that when you're up there, you feel like you can touch the stars
     ---Parsed Response (string)---
-    "Here is a short story about Mt. Rainier:\n\nMt. Rainier Stands Tall\n\nThe majestic peak of Mount Rainier stood tall, reaching towards the sky. Its snow-capped summit glistened in the sunlight, a testament to the sheer scale and grandeur of this iconic Pacific Northwest landmark.\n\nFrom a distance, the mountain appeared almost impossibly large, dwarfing the surrounding landscape with its impressive stature. Ne"
-

Teardown

PASSED test_openai_shorthand 0:00:09.476301

Setup

Call

Captured stderr call
[2024-11-05T19:55:29Z INFO  baml_events] Function TestOpenAIShorthand:
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 9470ms. StopReason: stop. Tokens(in/out): 18/577
+    "As the morning mist lifted, Sarah gazed up at the majestic peak of Mount Rainier, its snow-capped summit piercing the sky. She had lived in Washington her whole life, but the mountain's sheer size never failed to take her breath away.\n\nSarah remembered her grandfather's stories about climbing Rainier in his youth. \"It's so tall,\" he'd say, \"that when you're up there, you feel like you can touch the stars"
+

Teardown

PASSED test_openai_shorthand 0:00:08.077263

Setup

Call

Captured stderr call
[2024-11-11T19:28:02Z INFO  baml_events] Function TestOpenAIShorthand:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 8068ms. StopReason: stop. Tokens(in/out): 18/558
     ---PROMPT---
     [chat] system: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
-    Once upon a time, in the heart of Washington State, there stood a giant known as Mount Rainier. Towering above the landscape at an impressive 14,411 feet, Rainier wasn’t just tall; it was a sentinel, watching over the lush forests and vibrant meadows that sprawled below.
+    Once upon a time, in the heart of the Pacific Northwest, there stood a majestic giant known as Mt. Rainier. Its snow-capped peak pierced the sky, reaching heights of 14,411 feet, making it the tallest mountain in Washington. For centuries, it overlooked the lush valleys and bustling towns below, a silent sentinel that inspired stories and dreams.
     
-    In a small town at the base of the mountain lived a curious girl named Lily. Every day after school, she would rush to the park where she could see the majestic peak shimmering in the sunlight. To her, it was more than just a mountain; it was a mystery waiting to be unraveled.
+    In a quaint little village called Ashford, a young girl named Lily was fascinated by Mt. Rainier. Every morning, she would awaken to the sight of its towering presence, a constant reminder of the beauty and strength of nature. She often imagined herself climbing its rugged slopes, feeling the crisp air against her skin and gazing at the world from the peak. 
     
-    One bright Saturday morning, inspired by her dreams of adventure, Lily decided it was time to explore the trails that wound their way up Rainier’s slopes. Equipped with a backpack filled with snacks, a notebook, and a pencil, she set off on her journey.
+    One summer day, Lily decided it was time to embark on an adventure. With a small backpack filled with snacks and a notebook for sketches, she set off on the trail that twisted through emerald forests and blooming wildflowers. As she trekked, towering trees loomed overhead, but nothing compared to the view she longed for. 
     
-    As she walked, the trees whispered secrets and the wind sang gentle melodies. Lily marveled at the wildflowers that adorned her path, bursting with colors she had only seen in her art books—vivid blues, radiant yellows, and soft pinks danced in the sunlight. Each step brought her closer to the towering giant, and her excitement grew with every moment.
+    As she hiked, she encountered hikers of all ages—each one carrying their own stories of triumphs and tribulations. An elderly couple told her of their first marriage anniversary spent at the mountain’s summit, while a young boy shared how he dreamed of standing on top one day, just like the superheroes in his comic books. Their tales only fueled Lily's desire to reach the peak.
     
-    After hours of hiking, she reached a clearing where she could see the mountain in all its glory. Clouds swirled around the summit like a fluffy crown, and the sunlight made the glacial ice sparkle like diamonds. Overwhelmed by the beauty, Lily sat down on a large rock and took out her notebook.
+    Finally, after hours of climbing, the trees began to thin, revealing breathtaking vistas. The sun dipped low, painting the skies with hues of orange and pink, while Mt. Rainier towered majestically, its glaciers shimmering in the fading light. The mountain stood timeless, its beauty untouched by the passage of time.
     
-    “I want to capture this moment,” she thought, and began sketching the scene before her. As she drew, she felt a connection to the mountain, as if it was sharing its stories with her. It had stood there for thousands of years, witnessing the seasons change, the stars twinkle, and the world transform around it. 
+    Lily found a rocky outcropping to sit on, pulling out her notebook. She sketched the scene before her, trying to capture the enormity of the mountain in her lines. In that moment of solitude, she felt a connection to all those who had stood where she was, gazing at the world below. She understood that Mt. Rainier wasn’t just a mountain; it was a symbol of aspiration, resilience, and the wild spirit of the land.
     
-    Just then, a squirrel scurried by, stopping to peek at her with curious eyes. With a gentle laugh, Lily reached into her backpack for a snack and tossed a bit of granola. The squirrel chattered happily and scampered off, leaving Lily feeling even more enchanted by her surroundings.
+    As twilight descended and the stars began to twinkle, Lily made her way back down the trail, her heart full. She knew she would return to the mountain, both to conquer its peak and to continue weaving its stories into her own life.
     
-    As the sun began to dip below the horizon, painting the sky in hues of orange and pink, Lily knew it was time to head back. With her heart full of wonder and her notebook brimming with memories, she whispered a promise to the mountain. “I’ll come back to learn more about you, to explore your secrets.”
-    
-    With one last look at the majestic peak, she began her descent, already dreaming of the adventures that awaited her in the future. For in her heart, she knew that no matter how high Mt. Rainier stood, its true height was measured not in feet but in the wonder and inspiration it bestowed upon those who dared to climb.
+    In the years that followed, Mt. Rainier remained a constant in her journey—a reminder that greatness isn’t just about height, but about the adventures we seek and the stories we create along the way. And so, the tall mountain stood proudly, forever inspiring those who dared to dream.
     ---Parsed Response (string)---
-    "Once upon a time, in the heart of Washington State, there stood a giant known as Mount Rainier. Towering above the landscape at an impressive 14,411 feet, Rainier wasn’t just tall; it was a sentinel, watching over the lush forests and vibrant meadows that sprawled below.\n\nIn a small town at the base of the mountain lived a curious girl named Lily. Every day after school, she would rush to the park where she could see the majestic peak shimmering in the sunlight. To her, it was more than just a mountain; it was a mystery waiting to be unraveled.\n\nOne bright Saturday morning, inspired by her dreams of adventure, Lily decided it was time to explore the trails that wound their way up Rainier’s slopes. Equipped with a backpack filled with snacks, a notebook, and a pencil, she set off on her journey.\n\nAs she walked, the trees whispered secrets and the wind sang gentle melodies. Lily marveled at the wildflowers that adorned her path, bursting with colors she had only seen in her art books—vivid blues, radiant yellows, and soft pinks danced in the sunlight. Each step brought her closer to the towering giant, and her excitement grew with every moment.\n\nAfter hours of hiking, she reached a clearing where she could see the mountain in all its glory. Clouds swirled around the summit like a fluffy crown, and the sunlight made the glacial ice sparkle like diamonds. Overwhelmed by the beauty, Lily sat down on a large rock and took out her notebook.\n\n“I want to capture this moment,” she thought, and began sketching the scene before her. As she drew, she felt a connection to the mountain, as if it was sharing its stories with her. It had stood there for thousands of years, witnessing the seasons change, the stars twinkle, and the world transform around it. \n\nJust then, a squirrel scurried by, stopping to peek at her with curious eyes. With a gentle laugh, Lily reached into her backpack for a snack and tossed a bit of granola. The squirrel chattered happily and scampered off, leaving Lily feeling even more enchanted by her surroundings.\n\nAs the sun began to dip below the horizon, painting the sky in hues of orange and pink, Lily knew it was time to head back. With her heart full of wonder and her notebook brimming with memories, she whispered a promise to the mountain. “I’ll come back to learn more about you, to explore your secrets.”\n\nWith one last look at the majestic peak, she began her descent, already dreaming of the adventures that awaited her in the future. For in her heart, she knew that no matter how high Mt. Rainier stood, its true height was measured not in feet but in the wonder and inspiration it bestowed upon those who dared to climb."
-

Teardown

PASSED test_openai_shorthand_streaming 0:00:06.649597

Setup

Call

Captured stderr call
[2024-11-05T19:55:36Z INFO  baml_events] Function TestOpenAIShorthand:
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 6640ms. StopReason: stop. Tokens(in/out): 18/480
+    "Once upon a time, in the heart of the Pacific Northwest, there stood a majestic giant known as Mt. Rainier. Its snow-capped peak pierced the sky, reaching heights of 14,411 feet, making it the tallest mountain in Washington. For centuries, it overlooked the lush valleys and bustling towns below, a silent sentinel that inspired stories and dreams.\n\nIn a quaint little village called Ashford, a young girl named Lily was fascinated by Mt. Rainier. Every morning, she would awaken to the sight of its towering presence, a constant reminder of the beauty and strength of nature. She often imagined herself climbing its rugged slopes, feeling the crisp air against her skin and gazing at the world from the peak. \n\nOne summer day, Lily decided it was time to embark on an adventure. With a small backpack filled with snacks and a notebook for sketches, she set off on the trail that twisted through emerald forests and blooming wildflowers. As she trekked, towering trees loomed overhead, but nothing compared to the view she longed for. \n\nAs she hiked, she encountered hikers of all ages—each one carrying their own stories of triumphs and tribulations. An elderly couple told her of their first marriage anniversary spent at the mountain’s summit, while a young boy shared how he dreamed of standing on top one day, just like the superheroes in his comic books. Their tales only fueled Lily's desire to reach the peak.\n\nFinally, after hours of climbing, the trees began to thin, revealing breathtaking vistas. The sun dipped low, painting the skies with hues of orange and pink, while Mt. Rainier towered majestically, its glaciers shimmering in the fading light. The mountain stood timeless, its beauty untouched by the passage of time.\n\nLily found a rocky outcropping to sit on, pulling out her notebook. She sketched the scene before her, trying to capture the enormity of the mountain in her lines. In that moment of solitude, she felt a connection to all those who had stood where she was, gazing at the world below. She understood that Mt. Rainier wasn’t just a mountain; it was a symbol of aspiration, resilience, and the wild spirit of the land.\n\nAs twilight descended and the stars began to twinkle, Lily made her way back down the trail, her heart full. She knew she would return to the mountain, both to conquer its peak and to continue weaving its stories into her own life.\n\nIn the years that followed, Mt. Rainier remained a constant in her journey—a reminder that greatness isn’t just about height, but about the adventures we seek and the stories we create along the way. And so, the tall mountain stood proudly, forever inspiring those who dared to dream."
+

Teardown

PASSED test_openai_shorthand_streaming 0:00:13.036828

Setup

Call

Captured stderr call
[2024-11-11T19:28:15Z INFO  baml_events] Function TestOpenAIShorthand:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 13025ms. StopReason: stop. Tokens(in/out): 18/717
     ---PROMPT---
     [chat] system: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
-    Once upon a time in the heart of the Pacific Northwest, there stood a majestic giant named Mt. Rainier. With its snow-capped peak piercing the sky and cloaked in a veil of clouds, the mountain reigned over the lush green forests and sparkling rivers that danced at its base. 
+    Once upon a time in a small town nestled in the shadow of Mt. Rainier, there lived a young girl named Lily. Every morning, she would rise early to greet the sun and watch as its golden rays kissed the snow-capped peak of the majestic mountain. To her, it was not just a mountain; it was a giant guardian, ever watchful and protective over her town.
+    
+    Lily was filled with wonder about the great mountain. She often imagined herself climbing to its summit, dancing on its clouds, and having conversations with the birds that soared above. But despite her dreams, she also understood the mountain's towering height, which struck awe in the hearts of the townsfolk.
+    
+    One sunny day, equipped with a backpack filled with snacks and her trusty sketchbook, Lily set out on an adventure. She had convinced her best friend, Max, to join her on a hike to a viewpoint known as "Eagle's Perch." The trail, though challenging, promised breathtaking views of Mt. Rainier.
     
-    Every morning, as the first rays of sunlight kissed the mountain's summit, it seemed to stretch a little taller, shimmering in hues of pink and gold. The animals around, from the curious deer to the playful otters, would look up in awe. They whispered to one another about how, on some days, Mt. Rainier would appear to touch the sky itself.
+    As they trekked through the dense forest, the air filled with the sweet scent of pine and wildflowers. They laughed, shared stories, and encouraged one another as they climbed over roots and rocks. With every step, the towering mountain loomed closer, its beauty more mesmerizing than ever. The sunlight caught the glistening snow on the peak, creating a halo that seemed to beckon them forward.
     
-    One summer, a young girl named Lila decided to embark on an adventure with her family to the foot of the great mountain. Her heart raced with excitement as they trekked through fields of wildflowers, their colors painting the landscape like a vibrant tapestry. With every step, the mountain seemed to grow larger, embodying a presence that felt almost magical.
+    After what felt like hours of hiking, they finally arrived at Eagle's Perch. Lily's breath hitched in her throat as she took in the panoramic view. The town below looked like a miniature model, and Mt. Rainier stood proudly, high above it all, a testament to nature's grandeur. 
     
-    At the base of Rainier, Lila’s father pointed up at the peak and said, “Look how tall it is! It feels like you could reach out and touch the clouds if you try hard enough!” Lila laughed, imagining climbing to the snowy top and having a tea party with the clouds. 
+    As Max pulled out his camera to capture the moment, Lily sat down with her sketchbook, eager to translate her awe onto the page. She began to draw the mountain, its icy crown and rugged slopes, the way it dominated the skyline. Lost in her art, time seemed to stand still.
     
-    As they continued their hike, Lila noticed how the mountain called to her. It whispered tales of ancient stories, of glacial rivers and legendary explorers who once stood where she stood. She imagined herself amidst those brave souls, gazing down at the vast expanse below.
+    Suddenly, a soft rustling interrupted her concentration. Lily looked up to find a wise old owl perched on a nearby branch, its golden eyes observing her with curiosity. She smiled and whispered, “Hello, Mr. Owl. Isn’t Mt. Rainier incredible?”
     
-    That evening, as the sun dipped behind the mountain, painting the sky in shades of lavender and orange, Lila sat on a rock and gazed at Mt. Rainier. It towered majestically, a silent guardian of the land. In that moment, she understood that the mountain was not just tall, but it was also a symbol of adventure, wonder, and resilience. 
+    The owl blinked slowly, as if considering her words. “Indeed, young one. But what makes it tall is not just its height; it is the stories it holds. Every season, every storm, and every smile shared under its gaze adds to its majesty.”
     
-    With a heart full of dreams, Lila vowed to climb it one day. Mt. Rainier might be an imposing giant, but in her eyes, it was an invitation to explore the heights of possibility. And from then on, every tall tree, high hill, and lofty dream reminded her of the giant that stood watch over her beloved home, inspiring her to reach for the stars.
+    Lily’s eyes sparkled with understanding. She returned to her sketch, not just drawing the mountain, but also envisioning the laughter of children playing, the stories told around campfires, and the warmth of community gathered beneath its towers. She realized that Mt. Rainier was not just an imposing figure but a source of inspiration and connection for everyone.
+    
+    As the sun began to set, casting brilliant hues of orange and pink across the sky, Lily and Max headed back down the trail, their hearts full of adventure. They promised to return, to explore further, and to continue sharing stories beneath the mighty mountain. 
+    
+    From that day on, every time Lily gazed at Mt. Rainier, she did so with renewed respect. It was tall, yes—towering and majestic—but it was also a tale woven into her very being, reminding her that sometimes, the most significant heights are not measured in feet, but in the bonds created and the stories shared under its watchful gaze.
     ---Parsed Response (string)---
-    "Once upon a time in the heart of the Pacific Northwest, there stood a majestic giant named Mt. Rainier. With its snow-capped peak piercing the sky and cloaked in a veil of clouds, the mountain reigned over the lush green forests and sparkling rivers that danced at its base. \n\nEvery morning, as the first rays of sunlight kissed the mountain's summit, it seemed to stretch a little taller, shimmering in hues of pink and gold. The animals around, from the curious deer to the playful otters, would look up in awe. They whispered to one another about how, on some days, Mt. Rainier would appear to touch the sky itself.\n\nOne summer, a young girl named Lila decided to embark on an adventure with her family to the foot of the great mountain. Her heart raced with excitement as they trekked through fields of wildflowers, their colors painting the landscape like a vibrant tapestry. With every step, the mountain seemed to grow larger, embodying a presence that felt almost magical.\n\nAt the base of Rainier, Lila’s father pointed up at the peak and said, “Look how tall it is! It feels like you could reach out and touch the clouds if you try hard enough!” Lila laughed, imagining climbing to the snowy top and having a tea party with the clouds. \n\nAs they continued their hike, Lila noticed how the mountain called to her. It whispered tales of ancient stories, of glacial rivers and legendary explorers who once stood where she stood. She imagined herself amidst those brave souls, gazing down at the vast expanse below.\n\nThat evening, as the sun dipped behind the mountain, painting the sky in shades of lavender and orange, Lila sat on a rock and gazed at Mt. Rainier. It towered majestically, a silent guardian of the land. In that moment, she understood that the mountain was not just tall, but it was also a symbol of adventure, wonder, and resilience. \n\nWith a heart full of dreams, Lila vowed to climb it one day. Mt. Rainier might be an imposing giant, but in her eyes, it was an invitation to explore the heights of possibility. And from then on, every tall tree, high hill, and lofty dream reminded her of the giant that stood watch over her beloved home, inspiring her to reach for the stars."
-

Teardown

PASSED test_anthropic_shorthand 0:00:03.363343

Setup

Call

Captured stderr call
[2024-11-05T19:55:39Z INFO  baml_events] Function TestAnthropicShorthand:
-    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3356ms. StopReason: "end_turn". Tokens(in/out): 19/444
+    "Once upon a time in a small town nestled in the shadow of Mt. Rainier, there lived a young girl named Lily. Every morning, she would rise early to greet the sun and watch as its golden rays kissed the snow-capped peak of the majestic mountain. To her, it was not just a mountain; it was a giant guardian, ever watchful and protective over her town.\n\nLily was filled with wonder about the great mountain. She often imagined herself climbing to its summit, dancing on its clouds, and having conversations with the birds that soared above. But despite her dreams, she also understood the mountain's towering height, which struck awe in the hearts of the townsfolk.\n\nOne sunny day, equipped with a backpack filled with snacks and her trusty sketchbook, Lily set out on an adventure. She had convinced her best friend, Max, to join her on a hike to a viewpoint known as \"Eagle's Perch.\" The trail, though challenging, promised breathtaking views of Mt. Rainier.\n\nAs they trekked through the dense forest, the air filled with the sweet scent of pine and wildflowers. They laughed, shared stories, and encouraged one another as they climbed over roots and rocks. With every step, the towering mountain loomed closer, its beauty more mesmerizing than ever. The sunlight caught the glistening snow on the peak, creating a halo that seemed to beckon them forward.\n\nAfter what felt like hours of hiking, they finally arrived at Eagle's Perch. Lily's breath hitched in her throat as she took in the panoramic view. The town below looked like a miniature model, and Mt. Rainier stood proudly, high above it all, a testament to nature's grandeur. \n\nAs Max pulled out his camera to capture the moment, Lily sat down with her sketchbook, eager to translate her awe onto the page. She began to draw the mountain, its icy crown and rugged slopes, the way it dominated the skyline. Lost in her art, time seemed to stand still.\n\nSuddenly, a soft rustling interrupted her concentration. Lily looked up to find a wise old owl perched on a nearby branch, its golden eyes observing her with curiosity. She smiled and whispered, “Hello, Mr. Owl. Isn’t Mt. Rainier incredible?”\n\nThe owl blinked slowly, as if considering her words. “Indeed, young one. But what makes it tall is not just its height; it is the stories it holds. Every season, every storm, and every smile shared under its gaze adds to its majesty.”\n\nLily’s eyes sparkled with understanding. She returned to her sketch, not just drawing the mountain, but also envisioning the laughter of children playing, the stories told around campfires, and the warmth of community gathered beneath its towers. She realized that Mt. Rainier was not just an imposing figure but a source of inspiration and connection for everyone.\n\nAs the sun began to set, casting brilliant hues of orange and pink across the sky, Lily and Max headed back down the trail, their hearts full of adventure. They promised to return, to explore further, and to continue sharing stories beneath the mighty mountain. \n\nFrom that day on, every time Lily gazed at Mt. Rainier, she did so with renewed respect. It was tall, yes—towering and majestic—but it was also a tale woven into her very being, reminding her that sometimes, the most significant heights are not measured in feet, but in the bonds created and the stories shared under its watchful gaze."
+

Teardown

PASSED test_anthropic_shorthand 0:00:03.637927

Setup

Call

Captured stderr call
[2024-11-11T19:28:18Z INFO  baml_events] Function TestAnthropicShorthand:
+    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3629ms. StopReason: "end_turn". Tokens(in/out): 19/380
     ---PROMPT---
     [chat] user: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
     Here is a short story about Mount Rainier:
     
-    The Majestic Mt. Rainier
+    The Towering Titan
     
-    As the sun began to peek over the distant horizon, its golden rays slowly illuminated the towering peak of Mount Rainier. Standing tall at 14,411 feet, the massive stratovolcano dominated the landscape, its snow-capped summit reaching up towards the heavens.
+    As the sun slowly rose over the horizon, its golden rays began to illuminate the magnificent sight before me. There, standing tall and proud, was the majestic Mount Rainier, its snow-capped peak reaching up towards the heavens.
     
-    Sarah stood in awe, her eyes transfixed on the mountain's grandeur. She had hiked these trails many times, but the sheer scale and beauty of Mt. Rainier never ceased to amaze her. The mountain's rugged volcanic slopes, carved by glaciers over millennia, seemed to exude a primal power that stirred something deep within her soul.
+    I had always known that Rainier was an impressive mountain, but nothing could have prepared me for the sheer scale and grandeur of this towering titan. At 14,411 feet (4,392 meters) high, it is the tallest mountain in the Cascade Range and the most prominent peak in the contiguous United States.
     
-    As she began her ascent, Sarah felt a sense of humility wash over her. Compared to the towering giant before her, she was but a speck, a mere mortal dwarfed by the majesty of nature. Each step brought her closer to the summit, but the peak seemed to recede further into the distance, a testament to the mountain's true enormity.
+    As I gazed upon its rugged, glaciated slopes, I was struck by a sense of awe and wonder. The mountain seemed to command the very landscape, its presence dominating the horizon and dwarfing the surrounding peaks. It was a true testament to the raw power and beauty of nature.
     
-    The climb was arduous, testing her physical and mental limits, but Sarah pressed on, driven by a relentless determination to reach the top. Finally, after hours of grueling effort, she emerged onto the breathtaking vista of the summit, her heart swelling with a profound sense of accomplishment.
+    I couldn't help but feel humbled by the sheer size and scale of Rainier. It was a humbling reminder of the incredible forces that have shaped our planet over millions of years, and the enduring strength and resilience of these majestic mountains.
     
-    From this lofty perch, Sarah gazed out over the vast, untamed wilderness that surrounded her. In every direction, the landscape was dominated by the towering presence of Mount Rainier, a timeless and majestic sentinel that had borne witness to the ebb and flow of human history.
+    As the sun continued to rise, the mountain's hues shifted, from the deep blues and purples of the early morning to the dazzling whites and grays of the snow and ice. It was a mesmerizing display, one that left me feeling both small and insignificant, and yet deeply connected to the natural world around me.
     
-    In that moment, Sarah felt a deep connection to the mountain, a kinship that transcended the boundaries of time and space. She knew that she would return to this place, again and again, drawn by the siren call of its grandeur and the transformative power of its presence.
+    In that moment, I knew that I had witnessed something truly special – a glimpse into the grand and timeless beauty of our world, embodied in the towering presence of Mount Rainier.
     ---Parsed Response (string)---
-    "Here is a short story about Mount Rainier:\n\nThe Majestic Mt. Rainier\n\nAs the sun began to peek over the distant horizon, its golden rays slowly illuminated the towering peak of Mount Rainier. Standing tall at 14,411 feet, the massive stratovolcano dominated the landscape, its snow-capped summit reaching up towards the heavens.\n\nSarah stood in awe, her eyes transfixed on the mountain's grandeur. She had hiked these trails many times, but the sheer scale and beauty of Mt. Rainier never ceased to amaze her. The mountain's rugged volcanic slopes, carved by glaciers over millennia, seemed to exude a primal power that stirred something deep within her soul.\n\nAs she began her ascent, Sarah felt a sense of humility wash over her. Compared to the towering giant before her, she was but a speck, a mere mortal dwarfed by the majesty of nature. Each step brought her closer to the summit, but the peak seemed to recede further into the distance, a testament to the mountain's true enormity.\n\nThe climb was arduous, testing her physical and mental limits, but Sarah pressed on, driven by a relentless determination to reach the top. Finally, after hours of grueling effort, she emerged onto the breathtaking vista of the summit, her heart swelling with a profound sense of accomplishment.\n\nFrom this lofty perch, Sarah gazed out over the vast, untamed wilderness that surrounded her. In every direction, the landscape was dominated by the towering presence of Mount Rainier, a timeless and majestic sentinel that had borne witness to the ebb and flow of human history.\n\nIn that moment, Sarah felt a deep connection to the mountain, a kinship that transcended the boundaries of time and space. She knew that she would return to this place, again and again, drawn by the siren call of its grandeur and the transformative power of its presence."
-

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.164320

Setup

Call

Captured stderr call
[2024-11-05T19:55:42Z INFO  baml_events] Function TestAnthropicShorthand:
-    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3155ms. StopReason: "end_turn". Tokens(in/out): 19/366
+    "Here is a short story about Mount Rainier:\n\nThe Towering Titan\n\nAs the sun slowly rose over the horizon, its golden rays began to illuminate the magnificent sight before me. There, standing tall and proud, was the majestic Mount Rainier, its snow-capped peak reaching up towards the heavens.\n\nI had always known that Rainier was an impressive mountain, but nothing could have prepared me for the sheer scale and grandeur of this towering titan. At 14,411 feet (4,392 meters) high, it is the tallest mountain in the Cascade Range and the most prominent peak in the contiguous United States.\n\nAs I gazed upon its rugged, glaciated slopes, I was struck by a sense of awe and wonder. The mountain seemed to command the very landscape, its presence dominating the horizon and dwarfing the surrounding peaks. It was a true testament to the raw power and beauty of nature.\n\nI couldn't help but feel humbled by the sheer size and scale of Rainier. It was a humbling reminder of the incredible forces that have shaped our planet over millions of years, and the enduring strength and resilience of these majestic mountains.\n\nAs the sun continued to rise, the mountain's hues shifted, from the deep blues and purples of the early morning to the dazzling whites and grays of the snow and ice. It was a mesmerizing display, one that left me feeling both small and insignificant, and yet deeply connected to the natural world around me.\n\nIn that moment, I knew that I had witnessed something truly special – a glimpse into the grand and timeless beauty of our world, embodied in the towering presence of Mount Rainier."
+

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.438224

Setup

Call

Captured stderr call
[2024-11-11T19:28:22Z INFO  baml_events] Function TestAnthropicShorthand:
+    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3406ms. StopReason: "end_turn". Tokens(in/out): 19/430
     ---PROMPT---
     [chat] user: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
-    Here is a short story about the towering beauty of Mount Rainier:
+    Here is a short story about Mt. Rainier:
     
-    Reaching for the Sky
+    The Majestic Mountain
     
-    The morning sun peeked above the horizon, bathing the landscape in a warm glow. As Sarah stepped outside, her eyes were immediately drawn to the magnificent peak that dominated the skyline. Mount Rainier stood tall and proud, its snow-capped summit reaching over 14,000 feet into the crisp, blue sky. 
+    As the sun began to rise over the Cascade mountain range, its warm golden rays slowly crept up the towering, snow-capped peak of Mount Rainier. Standing tall at 14,411 feet above sea level, the ancient volcano dominated the horizon, its grandeur inspiring a sense of awe in all who gazed upon it.
     
-    Sarah had always been in awe of this natural wonder. Even from miles away, the sheer size and scale of the mountain was humbling. She remembered the first time she had laid eyes on it, how the sight had taken her breath away. There was something truly majestic about its presence - a timeless, stoic beauty that commanded respect.
+    Emily had lived in the Pacific Northwest her entire life, but she never grew tired of seeing Mount Rainier loom in the distance. Each morning, as she sipped her coffee and looked out the window, she couldn't help but marvel at its sheer size and power. The mountain was a constant, steadfast presence, a reminder of the incredible forces of nature that had shaped this land over millions of years.
     
-    As Sarah gazed up at the towering peak, she felt a sense of wonder wash over her. The mountain seemed to radiate an ancient power, a connection to the forces that had shaped the earth itself. Its glaciers and rocky crags told a story of eons of change, of volcanic activity and weathering that had formed this awe-inspiring natural wonder.
+    Today, Emily decided, she would venture closer to the mountain. She packed a backpack with supplies and headed out, following the winding road that led up into the national park. As she drove higher, the world around her transformed - dense forests gave way to alpine meadows dotted with wildflowers, and the air grew crisp and thin.
     
-    Slowly, Sarah began to make her way towards the mountain, her steps filled with a sense of reverence. She knew that she could never truly fathom the depth of its history or the grandeur of its form, but in that moment, she felt a deep appreciation for its place in the world. Mount Rainier was not just a mountain - it was a testament to the raw power and beauty of the natural world, a reminder of our own insignificance in the face of such a towering, magnificent presence.
+    Finally, she reached the trailhead and set off on foot, her gaze fixed upon the majestic peak looming ever closer. The hike was challenging, but with each step, Emily felt a growing sense of connection to this ancient, awe-inspiring wonder of nature. When she finally reached a lookout point, she stood in stunned silence, taking in the breathtaking panorama before her.
+    
+    Mount Rainier stood tall and proud, its glaciers glittering in the sunlight like diamonds. Emily felt small and humbled in its presence, yet also filled with a deep appreciation for the power and beauty of the natural world. In that moment, she knew she would carry this experience with her forever, a reminder of the grandeur that exists when we take the time to connect with the landscapes that surround us.
     ---Parsed Response (string)---
-    "Here is a short story about the towering beauty of Mount Rainier:\n\nReaching for the Sky\n\nThe morning sun peeked above the horizon, bathing the landscape in a warm glow. As Sarah stepped outside, her eyes were immediately drawn to the magnificent peak that dominated the skyline. Mount Rainier stood tall and proud, its snow-capped summit reaching over 14,000 feet into the crisp, blue sky. \n\nSarah had always been in awe of this natural wonder. Even from miles away, the sheer size and scale of the mountain was humbling. She remembered the first time she had laid eyes on it, how the sight had taken her breath away. There was something truly majestic about its presence - a timeless, stoic beauty that commanded respect.\n\nAs Sarah gazed up at the towering peak, she felt a sense of wonder wash over her. The mountain seemed to radiate an ancient power, a connection to the forces that had shaped the earth itself. Its glaciers and rocky crags told a story of eons of change, of volcanic activity and weathering that had formed this awe-inspiring natural wonder.\n\nSlowly, Sarah began to make her way towards the mountain, her steps filled with a sense of reverence. She knew that she could never truly fathom the depth of its history or the grandeur of its form, but in that moment, she felt a deep appreciation for its place in the world. Mount Rainier was not just a mountain - it was a testament to the raw power and beauty of the natural world, a reminder of our own insignificance in the face of such a towering, magnificent presence."
-

Teardown

PASSED test_fallback_to_shorthand 0:00:00.880085

Setup

Call

Captured stderr call
[2024-11-05T19:55:43Z INFO  baml_events] Function TestFallbackToShorthand:
+    "Here is a short story about Mt. Rainier:\n\nThe Majestic Mountain\n\nAs the sun began to rise over the Cascade mountain range, its warm golden rays slowly crept up the towering, snow-capped peak of Mount Rainier. Standing tall at 14,411 feet above sea level, the ancient volcano dominated the horizon, its grandeur inspiring a sense of awe in all who gazed upon it.\n\nEmily had lived in the Pacific Northwest her entire life, but she never grew tired of seeing Mount Rainier loom in the distance. Each morning, as she sipped her coffee and looked out the window, she couldn't help but marvel at its sheer size and power. The mountain was a constant, steadfast presence, a reminder of the incredible forces of nature that had shaped this land over millions of years.\n\nToday, Emily decided, she would venture closer to the mountain. She packed a backpack with supplies and headed out, following the winding road that led up into the national park. As she drove higher, the world around her transformed - dense forests gave way to alpine meadows dotted with wildflowers, and the air grew crisp and thin.\n\nFinally, she reached the trailhead and set off on foot, her gaze fixed upon the majestic peak looming ever closer. The hike was challenging, but with each step, Emily felt a growing sense of connection to this ancient, awe-inspiring wonder of nature. When she finally reached a lookout point, she stood in stunned silence, taking in the breathtaking panorama before her.\n\nMount Rainier stood tall and proud, its glaciers glittering in the sunlight like diamonds. Emily felt small and humbled in its presence, yet also filled with a deep appreciation for the power and beauty of the natural world. In that moment, she knew she would carry this experience with her forever, a reminder of the grandeur that exists when we take the time to connect with the landscapes that surround us."
+

Teardown

PASSED test_fallback_to_shorthand 0:00:00.793172

Setup

Call

Captured stderr call
[2024-11-11T19:28:23Z INFO  baml_events] Function TestFallbackToShorthand:
     (1 other previous tries)
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 633ms. StopReason: stop. Tokens(in/out): 18/20
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 561ms. StopReason: stop. Tokens(in/out): 18/21
     ---PROMPT---
     [chat] system: Say a haiku about Mt Rainier is tall.
     
     ---LLM REPLY---
-    Majestic and grand,  
-    Mt. Rainier kisses sky,  
-    Above all, it stands.
+    Majestic and proud,  
+    Mt. Rainier pierces sky,  
+    Whispers of the clouds.
     ---Parsed Response (string)---
-    "Majestic and grand,  \nMt. Rainier kisses sky,  \nAbove all, it stands."
-

Teardown

PASSED test_aws_streaming 0:00:02.213066

Setup

Call

Captured stderr call
[2024-11-05T19:55:43Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
-[2024-11-05T19:55:43Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
-[2024-11-05T19:55:45Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 2200ms. StopReason: unknown. Tokens(in/out): 19/100
+    "Majestic and proud,  \nMt. Rainier pierces sky,  \nWhispers of the clouds."
+

Teardown

FAILED test_aws_streaming 0:00:00.319182

baml_py.BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "AwsBedrock", model: Some("anthropic.claude-3-5-sonnet-20240620-v1:0"), prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about Mt Rainier is tall")] }]), request_options: {"api_key": String("")}, start_time: SystemTime { tv_sec: 1731353303, tv_nsec: 114527000 }, latency: 308.279084ms, message: "ServiceError(\n    ServiceError {\n        source: ThrottlingException(\n            ThrottlingException {\n                message: Some(\n                    \"Too many requests, please wait before trying again.\",\n                ),\n                meta: ErrorMetadata {\n                    code: Some(\n                        \"ThrottlingException\",\n                    ),\n                    message: Some(\n                        \"Too many requests, please wait before trying again.\",\n                    ),\n                    extras: Some(\n                        {\n                            \"aws_request_id\": \"758ee731-5022-4f89-8299-a27622e30ef0\",\n                        },\n                    ),\n                },\n            },\n        ),\n        raw: Response {\n            status: StatusCode(\n                429,\n            ),\n            headers: Headers {\n                headers: {\n                    \"date\": HeaderValue {\n                        _private: H0(\n                            \"Mon, 11 Nov 2024 19:28:23 GMT\",\n                        ),\n                    },\n                    \"content-type\": HeaderValue {\n                        _private: H0(\n                            \"application/json\",\n                        ),\n                    },\n                    \"content-length\": HeaderValue {\n                        _private: H0(\n                            \"65\",\n                        ),\n                    },\n                    \"x-amzn-requestid\": HeaderValue {\n                        _private: H0(\n                            \"758ee731-5022-4f89-8299-a27622e30ef0\",\n                        ),\n                    },\n                    \"x-amzn-errortype\": HeaderValue {\n                        _private: H0(\n                            \"ThrottlingException:http://internal.amazon.com/coral/com.amazon.bedrock/\",\n                        ),\n                    },\n                },\n            },\n            body: SdkBody {\n                inner: Once(\n                    Some(\n                        b\"{\\\"message\\\":\\\"Too many requests, please wait before trying again.\\\"}\",\n                    ),\n                ),\n                retryable: true,\n            },\n            extensions: Extensions {\n                extensions_02x: Extensions,\n                extensions_1x: Extensions,\n            },\n        },\n    },\n)", code: RateLimited }

Setup

Call

>   ???
+
+tests/test_functions.py:424: 
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+../../engine/language_client_python/python_src/baml_py/stream.py:81: in get_final_response
+    return self.__final_coerce((await asyncio.wrap_future(final)))
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+x = 
+
+>     lambda x: cast(str, x.cast_to(types, types)),
+      self.__ctx_manager.get(),
+    )
+E   baml_py.BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "AwsBedrock", model: Some("anthropic.claude-3-5-sonnet-20240620-v1:0"), prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about Mt Rainier is tall")] }]), request_options: {"api_key": String("")}, start_time: SystemTime { tv_sec: 1731353303, tv_nsec: 114527000 }, latency: 308.279084ms, message: "ServiceError(\n    ServiceError {\n        source: ThrottlingException(\n            ThrottlingException {\n                message: Some(\n                    \"Too many requests, please wait before trying again.\",\n                ),\n                meta: ErrorMetadata {\n                    code: Some(\n                        \"ThrottlingException\",\n                    ),\n                    message: Some(\n                        \"Too many requests, please wait before trying again.\",\n                    ),\n                    extras: Some(\n                        {\n                            \"aws_request_id\": \"758ee731-5022-4f89-8299-a27622e30ef0\",\n                        },\n                    ),\n                },\n            },\n        ),\n        raw: Response {\n            status: StatusCode(\n                429,\n            ),\n            headers: Headers {\n                headers: {\n                    \"date\": HeaderValue {\n                        _private: H0(\n                            \"Mon, 11 Nov 2024 19:28:23 GMT\",\n                        ),\n                    },\n                    \"content-type\": HeaderValue {\n                        _private: H0(\n                            \"application/json\",\n                        ),\n                    },\n                    \"content-length\": HeaderValue {\n                        _private: H0(\n                            \"65\",\n                        ),\n                    },\n                    \"x-amzn-requestid\": HeaderValue {\n                        _private: H0(\n                            \"758ee731-5022-4f89-8299-a27622e30ef0\",\n                        ),\n                    },\n                    \"x-amzn-errortype\": HeaderValue {\n                        _private: H0(\n                            \"ThrottlingException:http://internal.amazon.com/coral/com.amazon.bedrock/\",\n                        ),\n                    },\n                },\n            },\n            body: SdkBody {\n                inner: Once(\n                    Some(\n                        b\"{\\\"message\\\":\\\"Too many requests, please wait before trying again.\\\"}\",\n                    ),\n                ),\n                retryable: true,\n            },\n            extensions: Extensions {\n                extensions_02x: Extensions,\n                extensions_1x: Extensions,\n            },\n        },\n    },\n)", code: RateLimited }
+
+baml_client/async_client.py:5055: BamlClientHttpError
Captured stderr call
[2024-11-11T19:28:23Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-11-11T19:28:23Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
+[2024-11-11T19:28:23Z WARN  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-5-sonnet-20240620-v1:0) - 308ms
     ---PROMPT---
     [chat] user: Write a nice short story about Mt Rainier is tall
     
-    ---LLM REPLY---
-    Here is a short story about Mt. Rainier:
-    
-    Rising high above the lush, green forests of the Pacific Northwest, Mt. Rainier stands tall and majestic. Its snow-capped peak, over 14,000 feet in elevation, commands awe and respect from all who gaze upon it.
-    
-    For the hikers and mountaineers who attempt to reach the summit, the journey is both physically and mentally challenging. The climb is arduous,
-    ---Parsed Response (string)---
-    "Here is a short story about Mt. Rainier:\n\nRising high above the lush, green forests of the Pacific Northwest, Mt. Rainier stands tall and majestic. Its snow-capped peak, over 14,000 feet in elevation, commands awe and respect from all who gaze upon it.\n\nFor the hikers and mountaineers who attempt to reach the summit, the journey is both physically and mentally challenging. The climb is arduous,"
-

Teardown

PASSED test_streaming 0:00:03.561350

Setup

Call

Captured stderr call
[2024-11-05T19:55:49Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 3553ms. StopReason: stop. Tokens(in/out): 19/305
+    ---REQUEST OPTIONS---
+    api_key: ""
+    ---ERROR (RateLimited (429))---
+    ServiceError(
+        ServiceError {
+            source: ThrottlingException(
+                ThrottlingException {
+                    message: Some(
+                        "Too many requests, please wait before trying again.",
+                    ),
+                    meta: ErrorMetadata {
+                        code: Some(
+                            "ThrottlingException",
+                        ),
+                        message: Some(
+                            "Too many requests, please wait before trying again.",
+                        ),
+                        extras: Some(
+                            {
+                                "aws_request_id": "758ee731-5022-4f89-8299-a27622e30ef0",
+                            },
+                        ),
+                    },
+                },
+            ),
+            raw: Response {
+                status: StatusCode(
+                    429,
+                ),
+                headers: Headers {
+                    headers: {
+                        "date": HeaderValue {
+                            _private: H0(
+                                "Mon, 11 Nov 2024 19:28:23 GMT",
+                            ),
+                        },
+                        "content-type": HeaderValue {
+                            _private: H0(
+                                "application/json",
+                            ),
+                        },
+                        "content-length": HeaderValue {
+                            _private: H0(
+                                "65",
+                            ),
+                        },
+                        "x-amzn-requestid": HeaderValue {
+                            _private: H0(
+                                "758ee731-5022-4f89-8299-a27622e30ef0",
+                            ),
+                        },
+                        "x-amzn-errortype": HeaderValue {
+                            _private: H0(
+                                "ThrottlingException:http://internal.amazon.com/coral/com.amazon.bedrock/",
+                            ),
+                        },
+                    },
+                },
+                body: SdkBody {
+                    inner: Once(
+                        Some(
+                            b"{\"message\":\"Too many requests, please wait before trying again.\"}",
+                        ),
+                    ),
+                    retryable: true,
+                },
+                extensions: Extensions {
+                    extensions_02x: Extensions,
+                    extensions_1x: Extensions,
+                },
+            },
+        },
+    )
+

Teardown

PASSED test_streaming 0:00:03.571474

Setup

Call

Captured stderr call
[2024-11-11T19:28:27Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 3562ms. StopReason: stop. Tokens(in/out): 19/305
     ---PROMPT---
     [chat] system: Tell me a short story about Programming languages are fun to create
     
     ---LLM REPLY---
-    Once upon a time in a world filled with endless creativity and imagination, a group of young programmers decided to embark on a journey to create their very own programming language. They were inspired by the beauty and elegance of existing languages, but wanted to add their own unique twist to the coding world.
+    Once upon a time, in a magical land of imagination and innovation, there lived a young and curious wizard named Oliver. Oliver had always been fascinated by the art of programming and had spent many nights experimenting with different languages and algorithms.
+    
+    One day, Oliver had a brilliant idea - he decided to create his very own programming language. He gathered his tools and set to work, combining the best features of his favorite languages with his own unique twist.
     
-    They spent countless hours brainstorming ideas, sketching out designs, and meticulously crafting each line of code. As they worked together, they discovered the joy of combining logic and creativity to bring their language to life. They experimented with new features, played with different syntaxes, and tested out various functions to see what worked best.
+    As he coded away, lines of syntax and functions danced across his screen like colorful ribbons in the wind. He carefully crafted each element, giving his language a personality and charm all its own.
     
-    As their language began to take shape, they marveled at how each decision they made had a ripple effect on the entire system. They learned to anticipate the needs of their users, to think from different perspectives, and to constantly refine and improve their creation.
+    Finally, after many hours of hard work and dedication, Oliver stood back and marveled at his creation - a sleek and powerful programming language, ready to be unleashed upon the world.
     
-    Finally, after many months of hard work and dedication, their programming language was complete. They released it to the world with a sense of pride and excitement, eager to see how others would use and build upon their creation.
+    As he shared his new language with other wizards and programmers, they were amazed by its simplicity and elegance. They quickly adopted Oliver's language, using it to bring their own ideas to life in ways they had never imagined.
     
-    And as developers around the globe began to adopt and use their language, the young programmers realized that the true joy of creating a programming language was not just in the act of coding itself, but in the knowledge that they had contributed something meaningful and innovative to the ever-evolving world of technology. And so, they continued to dream, to create, and to push the boundaries of what was possible, one line of code at a time.
+    And so, Oliver's programming language became a legend in the magical land, inspiring others to create their own languages and pushing the boundaries of what was thought possible.
+    
+    And as for Oliver, he smiled contentedly, knowing that he had created something truly special - a language that brought joy and magic to all who used it. And so, the tale of the wizard programmer and his enchanted language lived on, reminding us all that programming languages are not just tools, but feats of creativity and wonder.
     ---Parsed Response (string)---
-    "Once upon a time in a world filled with endless creativity and imagination, a group of young programmers decided to embark on a journey to create their very own programming language. They were inspired by the beauty and elegance of existing languages, but wanted to add their own unique twist to the coding world.\n\nThey spent countless hours brainstorming ideas, sketching out designs, and meticulously crafting each line of code. As they worked together, they discovered the joy of combining logic and creativity to bring their language to life. They experimented with new features, played with different syntaxes, and tested out various functions to see what worked best.\n\nAs their language began to take shape, they marveled at how each decision they made had a ripple effect on the entire system. They learned to anticipate the needs of their users, to think from different perspectives, and to constantly refine and improve their creation.\n\nFinally, after many months of hard work and dedication, their programming language was complete. They released it to the world with a sense of pride and excitement, eager to see how others would use and build upon their creation.\n\nAnd as developers around the globe began to adopt and use their language, the young programmers realized that the true joy of creating a programming language was not just in the act of coding itself, but in the knowledge that they had contributed something meaningful and innovative to the ever-evolving world of technology. And so, they continued to dream, to create, and to push the boundaries of what was possible, one line of code at a time."
-

Teardown

PASSED test_streaming_uniterated 0:00:04.736298

Setup

Call

Captured stderr call
[2024-11-05T19:55:54Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 4726ms. StopReason: stop. Tokens(in/out): 19/316
+    "Once upon a time, in a magical land of imagination and innovation, there lived a young and curious wizard named Oliver. Oliver had always been fascinated by the art of programming and had spent many nights experimenting with different languages and algorithms.\n\nOne day, Oliver had a brilliant idea - he decided to create his very own programming language. He gathered his tools and set to work, combining the best features of his favorite languages with his own unique twist.\n\nAs he coded away, lines of syntax and functions danced across his screen like colorful ribbons in the wind. He carefully crafted each element, giving his language a personality and charm all its own.\n\nFinally, after many hours of hard work and dedication, Oliver stood back and marveled at his creation - a sleek and powerful programming language, ready to be unleashed upon the world.\n\nAs he shared his new language with other wizards and programmers, they were amazed by its simplicity and elegance. They quickly adopted Oliver's language, using it to bring their own ideas to life in ways they had never imagined.\n\nAnd so, Oliver's programming language became a legend in the magical land, inspiring others to create their own languages and pushing the boundaries of what was thought possible.\n\nAnd as for Oliver, he smiled contentedly, knowing that he had created something truly special - a language that brought joy and magic to all who used it. And so, the tale of the wizard programmer and his enchanted language lived on, reminding us all that programming languages are not just tools, but feats of creativity and wonder."
+

Teardown

PASSED test_streaming_uniterated 0:00:03.757225

Setup

Call

Captured stderr call
[2024-11-11T19:28:30Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 3747ms. StopReason: stop. Tokens(in/out): 19/304
     ---PROMPT---
     [chat] system: Tell me a short story about The color blue makes me sad
     
     ---LLM REPLY---
-    Once there was a little girl named Rosie who had always loved the color blue. It reminded her of the clear skies on a sunny day and the peaceful ocean waters. She used to wear blue dresses and paint her room in shades of blue.
+    Once there was a girl named Lily who had always felt a deep connection to the color blue. She found comfort in the cool, calming hue that surrounded her at every turn. But as she grew older, she began to notice a shift in her relationship with the color.
     
-    However, as Rosie grew older, she began to associate the color blue with sadness. It started when her beloved grandmother passed away and blue flowers were placed on her grave. Then, a close friend moved away, leaving Rosie feeling a deep sense of loss. The blue sky that she once found so peaceful now seemed to mock her with its vast emptiness.
+    The more Lily immersed herself in the blue world, the sadder she felt. The azure skies that once brought her joy now seemed gloomy and foreboding. The gentle waves of the sea, once a source of peace, now brought a deep sense of melancholy.
     
-    Rosie found herself avoiding anything blue, unable to shake the feeling of sadness that engulfed her whenever she saw the color. She even stopped wearing her favorite blue dresses and started painting her room in warmer tones to chase away the melancholy that blue brought.
+    Lily couldn't understand why the color she had always loved now made her so sad. She tried to avoid anything blue, but it seemed to follow her everywhere she went. The more she pushed it away, the more it seemed to seep into every corner of her life.
     
-    One day, as Rosie was walking in the park, she came across a beautiful blue butterfly fluttering among the flowers. At first, she felt a pang of sadness, but then she realized that the butterfly was a sign of hope and renewal. Just like the butterfly emerging from its cocoon, Rosie could emerge from her sadness and find joy in the color blue once again.
+    One day, as Lily sat by the ocean, watching the waves crash against the shore, she realized the truth. The color blue wasn't making her sad. It was simply reflecting the emotions she had been suppressing for so long. The sadness was already inside her, and the blue was just a mirror showing her the depths of her own sorrow.
     
-    From that day on, Rosie made peace with the color blue. She embraced it as a reminder that sadness is just a part of life, but that there is always beauty and hope waiting to be discovered. And so, the color blue no longer made Rosie sad, but instead served as a source of strength and resilience in the face of life's challenges.
+    With this realization, Lily embraced the color blue once again. She allowed herself to feel the sadness and move through it, knowing that only by acknowledging her feelings could she find true healing. And as she did, the color blue transformed once more, becoming a source of strength and understanding, a reminder that even in sadness, there is beauty and growth.
     ---Parsed Response (string)---
-    "Once there was a little girl named Rosie who had always loved the color blue. It reminded her of the clear skies on a sunny day and the peaceful ocean waters. She used to wear blue dresses and paint her room in shades of blue.\n\nHowever, as Rosie grew older, she began to associate the color blue with sadness. It started when her beloved grandmother passed away and blue flowers were placed on her grave. Then, a close friend moved away, leaving Rosie feeling a deep sense of loss. The blue sky that she once found so peaceful now seemed to mock her with its vast emptiness.\n\nRosie found herself avoiding anything blue, unable to shake the feeling of sadness that engulfed her whenever she saw the color. She even stopped wearing her favorite blue dresses and started painting her room in warmer tones to chase away the melancholy that blue brought.\n\nOne day, as Rosie was walking in the park, she came across a beautiful blue butterfly fluttering among the flowers. At first, she felt a pang of sadness, but then she realized that the butterfly was a sign of hope and renewal. Just like the butterfly emerging from its cocoon, Rosie could emerge from her sadness and find joy in the color blue once again.\n\nFrom that day on, Rosie made peace with the color blue. She embraced it as a reminder that sadness is just a part of life, but that there is always beauty and hope waiting to be discovered. And so, the color blue no longer made Rosie sad, but instead served as a source of strength and resilience in the face of life's challenges."
-

Teardown

PASSED test_streaming_sync 0:00:04.580829

Setup

Call

Captured stderr call
[2024-11-05T19:55:58Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 4574ms. StopReason: stop. Tokens(in/out): 19/313
+    "Once there was a girl named Lily who had always felt a deep connection to the color blue. She found comfort in the cool, calming hue that surrounded her at every turn. But as she grew older, she began to notice a shift in her relationship with the color.\n\nThe more Lily immersed herself in the blue world, the sadder she felt. The azure skies that once brought her joy now seemed gloomy and foreboding. The gentle waves of the sea, once a source of peace, now brought a deep sense of melancholy.\n\nLily couldn't understand why the color she had always loved now made her so sad. She tried to avoid anything blue, but it seemed to follow her everywhere she went. The more she pushed it away, the more it seemed to seep into every corner of her life.\n\nOne day, as Lily sat by the ocean, watching the waves crash against the shore, she realized the truth. The color blue wasn't making her sad. It was simply reflecting the emotions she had been suppressing for so long. The sadness was already inside her, and the blue was just a mirror showing her the depths of her own sorrow.\n\nWith this realization, Lily embraced the color blue once again. She allowed herself to feel the sadness and move through it, knowing that only by acknowledging her feelings could she find true healing. And as she did, the color blue transformed once more, becoming a source of strength and understanding, a reminder that even in sadness, there is beauty and growth."
+

Teardown

PASSED test_streaming_sync 0:00:02.798666

Setup

Call

Captured stderr call
[2024-11-11T19:28:33Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 2790ms. StopReason: stop. Tokens(in/out): 19/267
     ---PROMPT---
     [chat] system: Tell me a short story about Programming languages are fun to create
     
     ---LLM REPLY---
-    Once upon a time, in a land where technology and innovation flourished, there lived a group of passionate programmers who loved to push the boundaries of what was possible. One day, a young programmer named Alex had a brilliant idea - to create their very own programming language.
-    
-    With excitement and determination, Alex set out on the journey of creating their own programming language from scratch. They began by defining the syntax and structure of the language, carefully designing each feature to be both powerful and easy to use. They drew inspiration from their favorite languages and added unique twists of their own, creating a language that was truly one-of-a-kind.
+    Once upon a time, in a world where creativity and innovation reigned supreme, a group of brilliant minds came together to create their own programming language. They were inspired by the endless possibilities and the beauty of code, and they wanted to develop a language that would make programming both powerful and fun.
     
-    As the days turned into weeks, Alex poured their heart and soul into perfecting every aspect of the language. They tested and debugged tirelessly, overcoming countless challenges along the way. But with each obstacle overcome, Alex's passion only grew stronger, fueled by the joy of seeing their creation come to life.
+    After many hours of brainstorming, designing, and testing, they finally unveiled their creation to the world. Their programming language was a masterpiece, with elegant syntax, powerful features, and a user-friendly interface. Programmers from all corners of the globe were mesmerized by its capabilities and quickly embraced it as their new favorite tool.
     
-    Finally, after many long hours and late nights, Alex's programming language was complete. They proudly named it "InnovateScript" and released it into the world for others to use and enjoy. And to their delight, programmers from far and wide embraced the language, finding it to be a joy to work with and a powerful tool for their projects.
+    As more and more people started using the language, a vibrant community emerged, sharing ideas, collaborating on projects, and pushing the boundaries of what was thought possible. The programming language became a symbol of creativity and innovation, inspiring the next generation of programmers to dream big and think outside the box.
     
-    And so, Alex's programming language lived on, inspiring new generations of programmers to dream big, create boldly, and push the boundaries of what was possible in the world of technology. And they all lived happily ever after, knowing that programming languages truly were a fun and magical creation.
+    And so, the creators of the language watched with pride as their creation took on a life of its own, empowering people to bring their ideas to life and revolutionize the world of technology. For them, creating a programming language was not just about writing code – it was about sparking a passion for coding and unleashing the limitless potential of the human mind. And that, they knew, was the true magic of programming languages.
     ---Parsed Response (string)---
-    "Once upon a time, in a land where technology and innovation flourished, there lived a group of passionate programmers who loved to push the boundaries of what was possible. One day, a young programmer named Alex had a brilliant idea - to create their very own programming language.\n\nWith excitement and determination, Alex set out on the journey of creating their own programming language from scratch. They began by defining the syntax and structure of the language, carefully designing each feature to be both powerful and easy to use. They drew inspiration from their favorite languages and added unique twists of their own, creating a language that was truly one-of-a-kind.\n\nAs the days turned into weeks, Alex poured their heart and soul into perfecting every aspect of the language. They tested and debugged tirelessly, overcoming countless challenges along the way. But with each obstacle overcome, Alex's passion only grew stronger, fueled by the joy of seeing their creation come to life.\n\nFinally, after many long hours and late nights, Alex's programming language was complete. They proudly named it \"InnovateScript\" and released it into the world for others to use and enjoy. And to their delight, programmers from far and wide embraced the language, finding it to be a joy to work with and a powerful tool for their projects.\n\nAnd so, Alex's programming language lived on, inspiring new generations of programmers to dream big, create boldly, and push the boundaries of what was possible in the world of technology. And they all lived happily ever after, knowing that programming languages truly were a fun and magical creation."
-

Teardown

PASSED test_streaming_uniterated_sync 0:00:04.282157

Setup

Call

Captured stderr call
[2024-11-05T19:56:03Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 4274ms. StopReason: stop. Tokens(in/out): 19/399
+    "Once upon a time, in a world where creativity and innovation reigned supreme, a group of brilliant minds came together to create their own programming language. They were inspired by the endless possibilities and the beauty of code, and they wanted to develop a language that would make programming both powerful and fun.\n\nAfter many hours of brainstorming, designing, and testing, they finally unveiled their creation to the world. Their programming language was a masterpiece, with elegant syntax, powerful features, and a user-friendly interface. Programmers from all corners of the globe were mesmerized by its capabilities and quickly embraced it as their new favorite tool.\n\nAs more and more people started using the language, a vibrant community emerged, sharing ideas, collaborating on projects, and pushing the boundaries of what was thought possible. The programming language became a symbol of creativity and innovation, inspiring the next generation of programmers to dream big and think outside the box.\n\nAnd so, the creators of the language watched with pride as their creation took on a life of its own, empowering people to bring their ideas to life and revolutionize the world of technology. For them, creating a programming language was not just about writing code – it was about sparking a passion for coding and unleashing the limitless potential of the human mind. And that, they knew, was the true magic of programming languages."
+

Teardown

PASSED test_streaming_uniterated_sync 0:00:05.731819

Setup

Call

Captured stderr call
[2024-11-11T19:28:39Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 5724ms. StopReason: stop. Tokens(in/out): 19/425
     ---PROMPT---
     [chat] system: Tell me a short story about The color blue makes me sad
     
     ---LLM REPLY---
-    Once upon a time, there was a young girl named Lily who always felt a deep sadness whenever she saw the color blue. It reminded her of the endless ocean that took her father away from her when she was just a little girl.
-    
-    Lily's father was a sailor who loved the sea, but one stormy night, his ship was lost at sea, leaving Lily and her mother to grieve his loss. Since then, the color blue became a constant reminder of her father's absence, and every time she saw it, her heart ached with sorrow.
+    Once there was a girl named Lily who had always been drawn to the color blue. She loved the deep, calming shade of the sky on a clear day and the way the ocean shimmered in the sunlight. Blue had always been her favorite color, but as she grew older, she found that the color blue began to make her feel a sense of sadness.
     
-    Despite her sadness, Lily found solace in painting. She would spend hours in her room, creating beautiful works of art that expressed her emotions and helped her cope with her feelings of loss. She painted vibrant landscapes and colorful flowers, but she always avoided the color blue.
+    It all started when Lily's best friend, Sarah, moved away to a different city. Sarah had always been there for Lily, and they had shared so many happy memories together. But as Sarah's departure drew near, Lily found herself feeling increasingly sad every time she saw the color blue. It reminded her of the vastness of the ocean that separated them, and the endless sky that seemed to stretch on forever, just like the distance between them.
     
-    One day, a wise old artist visited Lily and saw her struggle with the color blue. He encouraged her to embrace her sadness and channel it into her art. He told her that sadness could be a source of inspiration and that the color blue could be a symbol of healing and growth.
+    As the days went by, Lily found it harder and harder to shake off the feeling of sadness that the color blue brought her. She tried to avoid anything blue, but it was everywhere – in the clothes she wore, the sky above her, and the sea that beckoned her. She missed her friend more than words could say, and the color blue only served as a constant reminder of that loss.
     
-    Inspired by the artist's words, Lily decided to paint a new masterpiece. She picked up her paintbrush and bravely dipped it into the deep blue paint. As she worked, she poured her grief and love into the canvas, creating a stunning portrait of the ocean at dusk.
+    But one day, as Lily was sitting by the ocean, watching the waves crash against the shore, she realized something. The color blue may have made her sad, but it also held a beauty and a serenity that she couldn't deny. She thought of all the happy memories she had shared with Sarah, and how the color blue had been a part of so many of them. And in that moment, Lily realized that while the color blue may bring sadness, it also held a deep sense of comfort and familiarity that she couldn't ignore.
     
-    When she finished, Lily looked at her painting and felt a sense of peace wash over her. The color blue no longer made her sad, but instead, it brought her comfort and a sense of connection to her father. She realized that through her art, she could keep his memory alive and find beauty in the color that once brought her pain.
-    
-    From that day on, Lily embraced the color blue as a reminder of her father's love and the healing power of art. And whenever she felt sad, she would paint her emotions onto the canvas, transforming her sorrow into something beautiful and meaningful.
+    And so, Lily learned to embrace the color blue once again, not as a reminder of loss, but as a reminder of the love and memories she shared with her friend. The color blue would always have a bittersweet tinge for her, but it would also be a constant reminder of the beauty and joy that can be found even in moments of sadness.
     ---Parsed Response (string)---
-    "Once upon a time, there was a young girl named Lily who always felt a deep sadness whenever she saw the color blue. It reminded her of the endless ocean that took her father away from her when she was just a little girl.\n\nLily's father was a sailor who loved the sea, but one stormy night, his ship was lost at sea, leaving Lily and her mother to grieve his loss. Since then, the color blue became a constant reminder of her father's absence, and every time she saw it, her heart ached with sorrow.\n\nDespite her sadness, Lily found solace in painting. She would spend hours in her room, creating beautiful works of art that expressed her emotions and helped her cope with her feelings of loss. She painted vibrant landscapes and colorful flowers, but she always avoided the color blue.\n\nOne day, a wise old artist visited Lily and saw her struggle with the color blue. He encouraged her to embrace her sadness and channel it into her art. He told her that sadness could be a source of inspiration and that the color blue could be a symbol of healing and growth.\n\nInspired by the artist's words, Lily decided to paint a new masterpiece. She picked up her paintbrush and bravely dipped it into the deep blue paint. As she worked, she poured her grief and love into the canvas, creating a stunning portrait of the ocean at dusk.\n\nWhen she finished, Lily looked at her painting and felt a sense of peace wash over her. The color blue no longer made her sad, but instead, it brought her comfort and a sense of connection to her father. She realized that through her art, she could keep his memory alive and find beauty in the color that once brought her pain.\n\nFrom that day on, Lily embraced the color blue as a reminder of her father's love and the healing power of art. And whenever she felt sad, she would paint her emotions onto the canvas, transforming her sorrow into something beautiful and meaningful."
-

Teardown

PASSED test_streaming_claude 0:00:01.036682

Setup

Call

Captured stdout call
msgs:
-Here's a haiku about Mt. Rainier:
+    "Once there was a girl named Lily who had always been drawn to the color blue. She loved the deep, calming shade of the sky on a clear day and the way the ocean shimmered in the sunlight. Blue had always been her favorite color, but as she grew older, she found that the color blue began to make her feel a sense of sadness.\n\nIt all started when Lily's best friend, Sarah, moved away to a different city. Sarah had always been there for Lily, and they had shared so many happy memories together. But as Sarah's departure drew near, Lily found herself feeling increasingly sad every time she saw the color blue. It reminded her of the vastness of the ocean that separated them, and the endless sky that seemed to stretch on forever, just like the distance between them.\n\nAs the days went by, Lily found it harder and harder to shake off the feeling of sadness that the color blue brought her. She tried to avoid anything blue, but it was everywhere – in the clothes she wore, the sky above her, and the sea that beckoned her. She missed her friend more than words could say, and the color blue only served as a constant reminder of that loss.\n\nBut one day, as Lily was sitting by the ocean, watching the waves crash against the shore, she realized something. The color blue may have made her sad, but it also held a beauty and a serenity that she couldn't deny. She thought of all the happy memories she had shared with Sarah, and how the color blue had been a part of so many of them. And in that moment, Lily realized that while the color blue may bring sadness, it also held a deep sense of comfort and familiarity that she couldn't ignore.\n\nAnd so, Lily learned to embrace the color blue once again, not as a reminder of loss, but as a reminder of the love and memories she shared with her friend. The color blue would always have a bittersweet tinge for her, but it would also be a constant reminder of the beauty and joy that can be found even in moments of sadness."
+

Teardown

PASSED test_streaming_claude 0:00:01.012323

Setup

Call

Captured stdout call
msgs:
+Here's a haiku about Mt. Rainier's height:
 
-Rainier stands supreme
-Above Northwest clouds and pines
-Ancient ice gleaming
+Rainier stands proud, high
+Piercing through clouds in the sky
+Nature's royal crown
 final:
-Here's a haiku about Mt. Rainier:
+Here's a haiku about Mt. Rainier's height:
 
-Rainier stands supreme
-Above Northwest clouds and pines
-Ancient ice gleaming
-
Captured stderr call
[2024-11-05T19:56:04Z INFO  baml_events] Function PromptTestClaude:
-    Client: Sonnet (claude-3-5-sonnet-20241022) - 1016ms. StopReason: "end_turn". Tokens(in/out): 19/34
+Rainier stands proud, high
+Piercing through clouds in the sky
+Nature's royal crown
+
Captured stderr call
[2024-11-11T19:28:40Z INFO  baml_events] Function PromptTestClaude:
+    Client: Sonnet (claude-3-5-sonnet-20241022) - 988ms. StopReason: "end_turn". Tokens(in/out): 19/39
     ---PROMPT---
     [chat] user: Tell me a haiku about Mt Rainier is tall
     
     ---LLM REPLY---
-    Here's a haiku about Mt. Rainier:
+    Here's a haiku about Mt. Rainier's height:
     
-    Rainier stands supreme
-    Above Northwest clouds and pines
-    Ancient ice gleaming
+    Rainier stands proud, high
+    Piercing through clouds in the sky
+    Nature's royal crown
     ---Parsed Response (string)---
-    "Here's a haiku about Mt. Rainier:\n\nRainier stands supreme\nAbove Northwest clouds and pines\nAncient ice gleaming"
-

Teardown

FAILED test_streaming_gemini 0:00:02.539860

baml_py.BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "Gemini", model: Some("gemini-1.5-pro-001"), prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about Dr.Pepper")] }]), request_options: {"safetySettings": Object {"threshold": String("BLOCK_LOW_AND_ABOVE"), "category": String("HARM_CATEGORY_HATE_SPEECH")}}, start_time: SystemTime { tv_sec: 1730836564, tv_nsec: 188563000 }, latency: 2.535240917s, message: "Failed to parse event: Error(\"missing field `content`\", line: 1, column: 359)", code: UnsupportedResponse(2) }

Setup

Call

@pytest.mark.asyncio
-    async def test_streaming_gemini():
-        stream = b.stream.TestGemini(input="Dr.Pepper")
-        msgs: list[str] = []
-        async for msg in stream:
-            if msg is not None:
-                msgs.append(msg)
->       final = await stream.get_final_response()
+    "Here's a haiku about Mt. Rainier's height:\n\nRainier stands proud, high\nPiercing through clouds in the sky\nNature's royal crown"
+

Teardown

PASSED test_streaming_gemini 0:00:06.790744

Setup

Call

Captured stdout call
msgs:
+Dottie Pepperidge, known universally as Dr. Pepper by her adoring fifth-graders, wasn't your average teacher. She didn't just teach history; she brought it to life. When they learned about ancient Egypt, desks were pushed aside for a week-long pyramid construction project (cardboard and glue never held so much meaning). On Roman history week, everyone wore togas to school (even Principal Stern, albeit begrudgingly). 
 
-tests/test_functions.py:543: 
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
-../../engine/language_client_python/python_src/baml_py/stream.py:81: in get_final_response
-    return self.__final_coerce((await asyncio.wrap_future(final)))
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
+This week, it was the Renaissance. The classroom buzzed with excitement. Dr. Pepper, a mischievous glint in her eye, had promised a surprise. After a lively discussion on Leonardo da Vinci, she unveiled it. 
 
-x = 
+"Today," she announced dramatically, "we paint!"
 
->     lambda x: cast(str, x.cast_to(types, types)),
-      self.__ctx_manager.get(),
-    )
-E   baml_py.BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "Gemini", model: Some("gemini-1.5-pro-001"), prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about Dr.Pepper")] }]), request_options: {"safetySettings": Object {"threshold": String("BLOCK_LOW_AND_ABOVE"), "category": String("HARM_CATEGORY_HATE_SPEECH")}}, start_time: SystemTime { tv_sec: 1730836564, tv_nsec: 188563000 }, latency: 2.535240917s, message: "Failed to parse event: Error(\"missing field `content`\", line: 1, column: 359)", code: UnsupportedResponse(2) }
+Groans of "But we're terrible!" were quickly replaced with eager grabbing of smocks and brushes. Dr. Pepper grinned. This was her favorite part – seeing their hesitation melt into pure, joyful creation.
+
+As the children painted, splattering color with abandon, Dr. Pepper observed. Tommy, usually bouncing off the walls, focused intently on his brushstrokes. Quiet Lily, her face lit with a rare smile, was creating a masterpiece of vibrant hues. In those moments, surrounded by the joyous chaos, Dr. Pepper felt an immense satisfaction. 
+
+It wasn't just history they were learning, she realized, it was self-expression, confidence, and the pure joy of creation. And that, she thought, wiping a stray splash of blue paint from her cheek, was the most rewarding lesson of all. 
+
+final:
+Dottie Pepperidge, known universally as Dr. Pepper by her adoring fifth-graders, wasn't your average teacher. She didn't just teach history; she brought it to life. When they learned about ancient Egypt, desks were pushed aside for a week-long pyramid construction project (cardboard and glue never held so much meaning). On Roman history week, everyone wore togas to school (even Principal Stern, albeit begrudgingly). 
+
+This week, it was the Renaissance. The classroom buzzed with excitement. Dr. Pepper, a mischievous glint in her eye, had promised a surprise. After a lively discussion on Leonardo da Vinci, she unveiled it. 
+
+"Today," she announced dramatically, "we paint!"
 
-baml_client/async_client.py:5406: BamlClientHttpError
Captured stderr call
[2024-11-05T19:56:06Z WARN  baml_events] Function TestGemini:
-    Client: Gemini (gemini-1.5-pro-001) - 2535ms
+Groans of "But we're terrible!" were quickly replaced with eager grabbing of smocks and brushes. Dr. Pepper grinned. This was her favorite part – seeing their hesitation melt into pure, joyful creation.
+
+As the children painted, splattering color with abandon, Dr. Pepper observed. Tommy, usually bouncing off the walls, focused intently on his brushstrokes. Quiet Lily, her face lit with a rare smile, was creating a masterpiece of vibrant hues. In those moments, surrounded by the joyous chaos, Dr. Pepper felt an immense satisfaction. 
+
+It wasn't just history they were learning, she realized, it was self-expression, confidence, and the pure joy of creation. And that, she thought, wiping a stray splash of blue paint from her cheek, was the most rewarding lesson of all. 
+
+
Captured stderr call
[2024-11-11T19:28:47Z INFO  baml_events] Function TestGemini:
+    Client: Gemini (gemini-1.5-pro-001) - 6765ms. StopReason: Stop. Tokens(in/out): unknown/unknown
     ---PROMPT---
     [chat] user: Write a nice short story about Dr.Pepper
     
-    ---REQUEST OPTIONS---
-    safetySettings: {"threshold":"BLOCK_LOW_AND_ABOVE","category":"HARM_CATEGORY_HATE_SPEECH"}
-    ---ERROR (BadResponse 2)---
-    Failed to parse event: Error("missing field `content`", line: 1, column: 359)
-

Teardown

PASSED test_tracing_async_only 0:00:04.998515

Setup

Call

Captured stdout call
STATS TraceStats(failed=0, started=15, finalized=15, submitted=15, sent=15, done=15)
-
Captured stderr call
[2024-11-05T19:56:07Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 678ms. StopReason: stop. Tokens(in/out): 50/20
+    ---LLM REPLY---
+    Dottie Pepperidge, known universally as Dr. Pepper by her adoring fifth-graders, wasn't your average teacher. She didn't just teach history; she brought it to life. When they learned about ancient Egypt, desks were pushed aside for a week-long pyramid construction project (cardboard and glue never held so much meaning). On Roman history week, everyone wore togas to school (even Principal Stern, albeit begrudgingly). 
+    
+    This week, it was the Renaissance. The classroom buzzed with excitement. Dr. Pepper, a mischievous glint in her eye, had promised a surprise. After a lively discussion on Leonardo da Vinci, she unveiled it. 
+    
+    "Today," she announced dramatically, "we paint!"
+    
+    Groans of "But we're terrible!" were quickly replaced with eager grabbing of smocks and brushes. Dr. Pepper grinned. This was her favorite part – seeing their hesitation melt into pure, joyful creation.
+    
+    As the children painted, splattering color with abandon, Dr. Pepper observed. Tommy, usually bouncing off the walls, focused intently on his brushstrokes. Quiet Lily, her face lit with a rare smile, was creating a masterpiece of vibrant hues. In those moments, surrounded by the joyous chaos, Dr. Pepper felt an immense satisfaction. 
+    
+    It wasn't just history they were learning, she realized, it was self-expression, confidence, and the pure joy of creation. And that, she thought, wiping a stray splash of blue paint from her cheek, was the most rewarding lesson of all. 
+    
+    ---Parsed Response (string)---
+    "Dottie Pepperidge, known universally as Dr. Pepper by her adoring fifth-graders, wasn't your average teacher. She didn't just teach history; she brought it to life. When they learned about ancient Egypt, desks were pushed aside for a week-long pyramid construction project (cardboard and glue never held so much meaning). On Roman history week, everyone wore togas to school (even Principal Stern, albeit begrudgingly). \n\nThis week, it was the Renaissance. The classroom buzzed with excitement. Dr. Pepper, a mischievous glint in her eye, had promised a surprise. After a lively discussion on Leonardo da Vinci, she unveiled it. \n\n\"Today,\" she announced dramatically, \"we paint!\"\n\nGroans of \"But we're terrible!\" were quickly replaced with eager grabbing of smocks and brushes. Dr. Pepper grinned. This was her favorite part – seeing their hesitation melt into pure, joyful creation.\n\nAs the children painted, splattering color with abandon, Dr. Pepper observed. Tommy, usually bouncing off the walls, focused intently on his brushstrokes. Quiet Lily, her face lit with a rare smile, was creating a masterpiece of vibrant hues. In those moments, surrounded by the joyous chaos, Dr. Pepper felt an immense satisfaction. \n\nIt wasn't just history they were learning, she realized, it was self-expression, confidence, and the pure joy of creation. And that, she thought, wiping a stray splash of blue paint from her cheek, was the most rewarding lesson of all. \n"
+

Teardown

PASSED test_tracing_async_only 0:00:04.691202

Setup

Call

Captured stdout call
STATS TraceStats(failed=0, started=15, finalized=15, submitted=15, sent=15, done=15)
+
Captured stderr call
[2024-11-11T19:28:48Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 559ms. StopReason: stop. Tokens(in/out): 50/20
     ---PROMPT---
     [chat] system: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -950,16 +1156,16 @@
     
     ---LLM REPLY---
     {
-      "prop1": "Hello, JSON!",
+      "prop1": "Hello, World!",
       "prop2": 540
     }
     ---Parsed Response (class TestOutputClass)---
     {
-      "prop1": "Hello, JSON!",
+      "prop1": "Hello, World!",
       "prop2": 540
     }
-[2024-11-05T19:56:08Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 796ms. StopReason: stop. Tokens(in/out): 50/20
+[2024-11-11T19:28:48Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 567ms. StopReason: stop. Tokens(in/out): 50/20
     ---PROMPT---
     [chat] system: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -982,8 +1188,8 @@
       "prop1": "Hello, World!",
       "prop2": 540
     }
-[2024-11-05T19:56:09Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 588ms. StopReason: stop. Tokens(in/out): 50/19
+[2024-11-11T19:28:49Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 585ms. StopReason: stop. Tokens(in/out): 50/20
     ---PROMPT---
     [chat] system: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -998,16 +1204,16 @@
     
     ---LLM REPLY---
     {
-      "prop1": "String data",
+      "prop1": "Hello, world!",
       "prop2": 540
     }
     ---Parsed Response (class TestOutputClass)---
     {
-      "prop1": "String data",
+      "prop1": "Hello, world!",
       "prop2": 540
     }
-[2024-11-05T19:56:11Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 705ms. StopReason: stop. Tokens(in/out): 50/19
+[2024-11-11T19:28:51Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 580ms. StopReason: stop. Tokens(in/out): 50/20
     ---PROMPT---
     [chat] system: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -1022,17 +1228,17 @@
     
     ---LLM REPLY---
     {
-      "prop1": "Sample string",
+      "prop1": "Hello, world!",
       "prop2": 540
     }
     ---Parsed Response (class TestOutputClass)---
     {
-      "prop1": "Sample string",
+      "prop1": "Hello, world!",
       "prop2": 540
     }
-

Teardown

PASSED test_tracing_sync 0:00:00.001328

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.421198

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:12.931142

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.480602

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.143204

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.624562

Setup

Call

Captured stdout call
{'name': 'Harrison', 'hair_color': <Color.BLACK: 'BLACK'>, 'last_name': [], 'height': 1.83, 'hobbies': [<Hobby.SPORTS: 'SPORTS'>]}
-
Captured stderr call
[2024-11-05T19:56:30Z INFO  baml_events] Function ExtractPeople:
-    Client: GPT4 (gpt-4o-2024-08-06) - 1619ms. StopReason: stop. Tokens(in/out): 177/53
+

Teardown

PASSED test_tracing_sync 0:00:00.001074

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.493659

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:13.895948

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.315141

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.392317

Setup

Call

Teardown

PASSED test_dynamic 0:00:03.241872

Setup

Call

Captured stdout call
{'name': 'Harrison', 'hair_color': <Color.BLACK: 'BLACK'>, 'last_name': [], 'height': 1.83, 'hobbies': [<Hobby.SPORTS: 'SPORTS'>]}
+
Captured stderr call
[2024-11-11T19:29:13Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-08-06) - 3230ms. StopReason: stop. Tokens(in/out): 177/49
     ---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.
     
@@ -1060,9 +1266,7 @@
         "hair_color": "BLACK",
         "last_name": [],
         "height": 1.83,
-        "hobbies": [
-          "sports"
-        ]
+        "hobbies": ["sports"]
       }
     ]
     ```
@@ -1078,10 +1282,10 @@
         ]
       }
     ]
-

Teardown

PASSED test_dynamic_class_output 0:00:01.183615

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_dynamic_class_output 0:00:01.135770

Setup

Call

Captured stdout call
[]
 {"hair_color":"black"}
-
Captured stderr call
[2024-11-05T19:56:31Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 660ms. StopReason: stop. Tokens(in/out): 49/10
+
Captured stderr call
[2024-11-11T19:29:13Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 449ms. StopReason: stop. Tokens(in/out): 49/10
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1100,8 +1304,8 @@
     {
       "hair_color": "black"
     }
-[2024-11-05T19:56:31Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 513ms. StopReason: stop. Tokens(in/out): 49/10
+[2024-11-11T19:29:14Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 674ms. StopReason: stop. Tokens(in/out): 49/10
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1120,9 +1324,9 @@
     {
       "hair_color": "black"
     }
-

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:01.248148

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-11-05T19:56:32Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1234ms. StopReason: stop. Tokens(in/out): 97/55
+

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:01.031539

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-11-11T19:29:15Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1017ms. StopReason: stop. Tokens(in/out): 97/55
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1163,7 +1367,7 @@
       "hair_color": "black",
       "height": 6.0
     }
-

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.946501

Setup

Call

Captured stdout call
streamed  name=None hair_color=None
+

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.817210

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}
@@ -1240,8 +1444,8 @@
 streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color='black'
 streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': 'black'}
 {"name":{"first_name":"Mark","last_name":"Gonzalez"},"hair_color":"black"}
-
Captured stderr call
[2024-11-05T19:56:33Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 934ms. StopReason: stop. Tokens(in/out): 73/35
+
Captured stderr call
[2024-11-11T19:29:16Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 806ms. StopReason: stop. Tokens(in/out): 73/35
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1272,7 +1476,7 @@
       },
       "hair_color": "black"
     }
-

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.853403

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.547751

Setup

Call

Captured stdout call
[]
 streamed  {'hair_color': '{'}
 streamed  {'hair_color': '{'}
 streamed  {'hair_color': '{\n  "'}
@@ -1289,8 +1493,8 @@
 final  hair_color='black'
 final  {'hair_color': 'black'}
 final  {"hair_color":"black"}
-
Captured stderr call
[2024-11-05T19:56:34Z INFO  baml_events] Function MyFunc:
-    Client: MyClient (gpt-4o-mini-2024-07-18) - 845ms. StopReason: stop. Tokens(in/out): 48/14
+
Captured stderr call
[2024-11-11T19:29:16Z INFO  baml_events] Function MyFunc:
+    Client: MyClient (gpt-4o-mini-2024-07-18) - 539ms. StopReason: stop. Tokens(in/out): 48/14
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1311,23 +1515,23 @@
     {
       "hair_color": "black"
     }
-

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.775472

Setup

Call

Captured stderr call
[2024-11-05T19:56:36Z INFO  baml_events] Function DynamicListInputOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1764ms. StopReason: stop. Tokens(in/out): 135/79
+

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.235725

Setup

Call

Captured stderr call
[2024-11-11T19:29:17Z INFO  baml_events] Function DynamicListInputOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1223ms. StopReason: stop. Tokens(in/out): 135/79
     ---PROMPT---
     [chat] system: Here is some input data:
     ----
     [{
-        "new_key": "hi1",
         "blah": {
             "nestedKey1": "nestedVal",
         },
         "testKey": "myTest",
+        "new_key": "hi1",
     }, {
+        "testKey": "myTest",
         "blah": {
             "nestedKey1": "nestedVal",
         },
         "new_key": "hi",
-        "testKey": "myTest",
     }]
     ----
     
@@ -1377,8 +1581,8 @@
         }
       }
     ]
-

Teardown

PASSED test_dynamic_types_new_enum 0:00:00.854973

Setup

Call

Captured stderr call
[2024-11-05T19:56:37Z INFO  baml_events] Function ExtractPeople:
-    Client: GPT4 (gpt-4o-2024-08-06) - 849ms. StopReason: stop. Tokens(in/out): 149/32
+

Teardown

PASSED test_dynamic_types_new_enum 0:00:00.910498

Setup

Call

Captured stderr call
[2024-11-11T19:29:18Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-08-06) - 901ms. StopReason: stop. Tokens(in/out): 149/32
     ---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.
     
@@ -1408,8 +1612,8 @@
         "animalLiked": "GIRAFFE"
       }
     ]
-

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.523412

Setup

Call

Captured stderr call
[2024-11-05T19:56:37Z INFO  baml_events] Function ExtractHobby:
-    Client: GPT4 (gpt-4o-2024-08-06) - 515ms. StopReason: stop. Tokens(in/out): 65/12
+

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.620114

Setup

Call

Captured stderr call
[2024-11-11T19:29:19Z INFO  baml_events] Function ExtractHobby:
+    Client: GPT4 (gpt-4o-2024-08-06) - 612ms. StopReason: stop. Tokens(in/out): 65/12
     ---PROMPT---
     [chat] system: Answer with a JSON Array using this schema:
     [
@@ -1427,8 +1631,8 @@
       "Golfing",
       "MUSIC"
     ]
-

Teardown

PASSED test_dynamic_literals 0:00:01.460618

Setup

Call

Captured stderr call
[2024-11-05T19:56:39Z INFO  baml_events] Function ExtractPeople:
-    Client: GPT4 (gpt-4o-2024-08-06) - 1451ms. StopReason: stop. Tokens(in/out): 149/32
+

Teardown

PASSED test_dynamic_literals 0:00:00.808782

Setup

Call

Captured stderr call
[2024-11-11T19:29:20Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-08-06) - 801ms. StopReason: stop. Tokens(in/out): 149/32
     ---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.
     
@@ -1458,23 +1662,23 @@
         "animalLiked": "GIRAFFE"
       }
     ]
-

Teardown

PASSED test_dynamic_inputs_list 0:00:01.127203

Setup

Call

Captured stderr call
[2024-11-05T19:56:40Z INFO  baml_events] Function DynamicListInputOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1114ms. StopReason: stop. Tokens(in/out): 134/78
+

Teardown

PASSED test_dynamic_inputs_list 0:00:01.061539

Setup

Call

Captured stderr call
[2024-11-11T19:29:21Z INFO  baml_events] Function DynamicListInputOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1049ms. StopReason: stop. Tokens(in/out): 134/78
     ---PROMPT---
     [chat] system: Here is some input data:
     ----
     [{
+        "testKey": "myTest",
+        "new_key": "hi",
         "blah": {
             "nestedKey1": "nestedVal",
         },
-        "new_key": "hi",
-        "testKey": "myTest",
     }, {
-        "new_key": "hi",
         "blah": {
             "nestedKey1": "nestedVal",
         },
         "testKey": "myTest",
+        "new_key": "hi",
     }]
     ----
     
@@ -1524,12 +1728,12 @@
         }
       }
     ]
-

Teardown

PASSED test_dynamic_output_map 0:00:01.220837

Setup

Call

Captured stdout call
[]
-final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', 'height': '6 feet'}
-final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard', 'height': '6 feet'}}
-final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard","height":"6 feet"}}
-
Captured stderr call
[2024-11-05T19:56:41Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1213ms. StopReason: stop. Tokens(in/out): 80/44
+

Teardown

PASSED test_dynamic_output_map 0:00:00.892150

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-11-11T19:29:22Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 884ms. StopReason: stop. Tokens(in/out): 80/44
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1546,29 +1750,29 @@
     {
       "hair_color": "black",
       "attributes": {
+        "height": "6 feet",
         "eye_color": "blue",
-        "facial_hair": "beard",
-        "height": "6 feet"
+        "facial_hair": "beard"
       }
     }
     ---Parsed Response (class DynamicOutput)---
     {
       "hair_color": "black",
       "attributes": {
+        "height": "6 feet",
         "eye_color": "blue",
-        "facial_hair": "beard",
-        "height": "6 feet"
+        "facial_hair": "beard"
       }
     }
-

Teardown

PASSED test_dynamic_output_union 0:00:02.389659

Setup

Call

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

Teardown

PASSED test_dynamic_output_union 0:00:02.680483

Setup

Call

Captured stdout call
[]
+final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30 years old'} height={'feet': 6.0, 'inches': None}
+final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30 years old'}, 'height': {'feet': 6.0, 'inches': None}}
+final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard","age":"30 years old"},"height":{"feet":6.0,"inches":null}}
 final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard'} 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-11-05T19:56:42Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1028ms. StopReason: stop. Tokens(in/out): 114/65
+
Captured stderr call
[2024-11-11T19:29:24Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1731ms. StopReason: stop. Tokens(in/out): 114/56
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1589,15 +1793,15 @@
     
     ---LLM REPLY---
     {
-      "hair_color": "black",
-      "attributes": {
-        "eye_color": "blue",
-        "facial_hair": "beard",
-        "age": "30"
+      hair_color: "black",
+      attributes: {
+        eye_color: "blue",
+        facial_hair: "beard",
+        age: "30 years old"
       },
-      "height": {
-        "feet": 6,
-        "inches": null
+      height: {
+        feet: 6,
+        inches: null
       }
     }
     ---Parsed Response (class DynamicOutput)---
@@ -1606,15 +1810,15 @@
       "attributes": {
         "eye_color": "blue",
         "facial_hair": "beard",
-        "age": "30"
+        "age": "30 years old"
       },
       "height": {
         "feet": 6.0,
         "inches": null
       }
     }
-[2024-11-05T19:56:43Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1329ms. StopReason: stop. Tokens(in/out): 116/53
+[2024-11-11T19:29:24Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 920ms. StopReason: stop. Tokens(in/out): 116/53
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1655,24 +1859,7 @@
         "meters": 1.8
       }
     }
-

Teardown

PASSED test_nested_class_streaming 0:00:09.939487

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

Teardown

PASSED test_nested_class_streaming 0:00:07.976151

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}
@@ -1680,110 +1867,73 @@
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': '', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': '', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-final  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-
Captured stderr call
[2024-11-05T19:56:53Z INFO  baml_events] Function FnOutputClassNested:
-    Client: Ollama (llama2) - 9920ms. StopReason: stop. Tokens(in/out): unknown/unknown
+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': 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': 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': None, '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.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-11-11T19:29:32Z INFO  baml_events] Function FnOutputClassNested:
+    Client: Ollama (llama2) - 7964ms. StopReason: stop. Tokens(in/out): unknown/unknown
     ---PROMPT---
     [chat] system: Return a made up json blob that matches this schema:
     Answer in JSON using this schema:
@@ -1803,35 +1953,31 @@
     JSON:
     
     ---LLM REPLY---
-    Sure! Here is a JSON blob that matches the schema you provided:
-    
     {
-      "prop1": "example",
+      "prop1": "Hello",
       "prop2": {
-        "prop1": "value1",
-        "prop2": "value2",
+        "prop1": "World",
+        "prop2": "json",
         "inner": {
           "prop2": 42,
           "prop3": 3.14,
-        },
-      },
+        }
+      }
     }
-    
-    Note that I've added a few additional fields to the inner object in the JSON blob to demonstrate how you can use the schema to generate a more complex structure.
     ---Parsed Response (class TestClassNested)---
     {
-      "prop1": "example",
+      "prop1": "Hello",
       "prop2": {
-        "prop1": "value1",
-        "prop2": "value2",
+        "prop1": "World",
+        "prop2": "json",
         "inner": {
           "prop2": 42,
           "prop3": 3.14
         }
       }
     }
-

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.525763

Setup

Call

Captured stderr call
[2024-11-05T19:56:54Z INFO  baml_events] Function ExpectFailure:
-    Client: MyClient (gpt-3.5-turbo-0125) - 519ms. StopReason: stop. Tokens(in/out): 14/7
+

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.423741

Setup

Call

Captured stderr call
[2024-11-11T19:29:33Z INFO  baml_events] Function ExpectFailure:
+    Client: MyClient (gpt-3.5-turbo-0125) - 419ms. StopReason: stop. Tokens(in/out): 14/7
     ---PROMPT---
     [chat] system: What is the capital of England?
     
@@ -1839,8 +1985,8 @@
     The capital of England is London.
     ---Parsed Response (string)---
     "The capital of England is London."
-

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:01.153132

Setup

Call

Captured stderr call
[2024-11-05T19:56:55Z INFO  baml_events] Function ExpectFailure:
-    Client: MyClient () - 1147ms. StopReason: "STOP". Tokens(in/out): 7/10
+

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:00.925397

Setup

Call

Captured stderr call
[2024-11-11T19:29:34Z INFO  baml_events] Function ExpectFailure:
+    Client: MyClient () - 918ms. StopReason: "STOP". Tokens(in/out): 7/10
     ---PROMPT---
     [chat] user: What is the capital of England?
     
@@ -1849,8 +1995,8 @@
     
     ---Parsed Response (string)---
     "The capital of England is **London**. \n"
-

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:00.936245

Setup

Call

Captured stderr call
[2024-11-05T19:56:56Z INFO  baml_events] Function ExpectFailure:
-    Client: MyClient () - 929ms. StopReason: "STOP". Tokens(in/out): 7/10
+

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:00.944689

Setup

Call

Captured stderr call
[2024-11-11T19:29:35Z INFO  baml_events] Function ExpectFailure:
+    Client: MyClient () - 939ms. StopReason: "STOP". Tokens(in/out): 7/10
     ---PROMPT---
     [chat] user: What is the capital of England?
     
@@ -1859,12 +2005,12 @@
     
     ---Parsed Response (string)---
     "The capital of England is **London**. \n"
-

Teardown

PASSED test_event_log_hook 0:00:01.457974

Setup

Call

Captured stdout call
Event log hook1: 
+

Teardown

PASSED test_event_log_hook 0:00:01.178086

Setup

Call

Captured stdout call
Event log hook1: 
 Event log event  BamlLogEvent {
     metadata: {
-        event_id: "39841730-2a5f-4f7c-be23-ef8bb221325c",
+        event_id: "a9d6364a-68f0-4648-a7b5-d5e591609011",
         parent_id: None,
-        root_event_id: "39841730-2a5f-4f7c-be23-ef8bb221325c"
+        root_event_id: "a9d6364a-68f0-4648-a7b5-d5e591609011"
     },
     prompt: "[
   {
@@ -1878,10 +2024,10 @@
 ]",
     raw_output: "["a", "b", "c"]",
     parsed_output: "["a", "b", "c"]",
-    start_time: "2024-11-05T19:56:56.948Z"
+    start_time: "2024-11-11T19:29:35.631Z"
 }
-
Captured stderr call
[2024-11-05T19:56:57Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 622ms. StopReason: stop. Tokens(in/out): 23/9
+
Captured stderr call
[2024-11-11T19:29:36Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 453ms. StopReason: stop. Tokens(in/out): 23/9
     ---PROMPT---
     [chat] system: Return this value back to me: ["a", "b", "c"]
     
@@ -1889,102 +2035,175 @@
     ["a", "b", "c"]
     ---Parsed Response (string)---
     "[\"a\", \"b\", \"c\"]"
-

Teardown

PASSED test_aws_bedrock 0:00:02.289054

Setup

Call

Captured stdout call
streamed  'Here'
-streamed  'Here is'
-streamed  'Here is a short'
-streamed  'Here is a short story about'
-streamed  'Here is a short story about lightning in a rock'
-streamed  'Here is a short story about lightning in a rock:'
-streamed  'Here is a short story about lightning in a rock:\n\nThe'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Thunderstone'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Thunderstone\n\nAs the storm'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Thunderstone\n\nAs the storm clouds'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Thunderstone\n\nAs the storm clouds gathere'
-streamed  ' is a short story about lightning in a rock:\n\nThe Thunderstone\n\nAs the storm clouds gathered overhea'
-streamed  's a short story about lightning in a rock:\n\nThe Thunderstone\n\nAs the storm clouds gathered overhead,'
-streamed  ' short story about lightning in a rock:\n\nThe Thunderstone\n\nAs the storm clouds gathered overhead, ja'
-streamed  ' story about lightning in a rock:\n\nThe Thunderstone\n\nAs the storm clouds gathered overhead, jagged f'
-streamed  'ng in a rock:\n\nThe Thunderstone\n\nAs the storm clouds gathered overhead, jagged forks of lightning cr'
-streamed  ' Thunderstone\n\nAs the storm clouds gathered overhead, jagged forks of lightning crackled through the'
-streamed  'nderstone\n\nAs the storm clouds gathered overhead, jagged forks of lightning crackled through the sky'
-streamed  'derstone\n\nAs the storm clouds gathered overhead, jagged forks of lightning crackled through the sky.'
-streamed  'stone\n\nAs the storm clouds gathered overhead, jagged forks of lightning crackled through the sky. Am'
-streamed  'e storm clouds gathered overhead, jagged forks of lightning crackled through the sky. Amidst the rum'
-streamed  'rm clouds gathered overhead, jagged forks of lightning crackled through the sky. Amidst the rumbling'
-streamed  'athered overhead, jagged forks of lightning crackled through the sky. Amidst the rumbling thunder, a'
-streamed  'd overhead, jagged forks of lightning crackled through the sky. Amidst the rumbling thunder, a pecul'
-streamed  'ed forks of lightning crackled through the sky. Amidst the rumbling thunder, a peculiar rock sitting'
-streamed  'forks of lightning crackled through the sky. Amidst the rumbling thunder, a peculiar rock sitting on'
-streamed  'g crackled through the sky. Amidst the rumbling thunder, a peculiar rock sitting on the ground began'
-streamed  'rough the sky. Amidst the rumbling thunder, a peculiar rock sitting on the ground began to glow with'
-streamed  'gh the sky. Amidst the rumbling thunder, a peculiar rock sitting on the ground began to glow with an'
-streamed  'y. Amidst the rumbling thunder, a peculiar rock sitting on the ground began to glow with an intense,'
-streamed  ' the rumbling thunder, a peculiar rock sitting on the ground began to glow with an intense, electric'
-streamed  'mbling thunder, a peculiar rock sitting on the ground began to glow with an intense, electric energy'
-streamed  'ling thunder, a peculiar rock sitting on the ground began to glow with an intense, electric energy. '
-streamed  'hunder, a peculiar rock sitting on the ground began to glow with an intense, electric energy. \n\nThis'
-streamed  'er, a peculiar rock sitting on the ground began to glow with an intense, electric energy. \n\nThis was'
-streamed  ' a peculiar rock sitting on the ground began to glow with an intense, electric energy. \n\nThis was no'
-streamed  'k sitting on the ground began to glow with an intense, electric energy. \n\nThis was no ordinary stone'
-streamed  'tting on the ground began to glow with an intense, electric energy. \n\nThis was no ordinary stone. It'
-streamed  'ng on the ground began to glow with an intense, electric energy. \n\nThis was no ordinary stone. It ha'
-streamed  'the ground began to glow with an intense, electric energy. \n\nThis was no ordinary stone. It had been'
-streamed  'und began to glow with an intense, electric energy. \n\nThis was no ordinary stone. It had been struck'
-streamed  ' began to glow with an intense, electric energy. \n\nThis was no ordinary stone. It had been struck by'
-streamed  'low with an intense, electric energy. \n\nThis was no ordinary stone. It had been struck by lightning,'
-streamed  ' with an intense, electric energy. \n\nThis was no ordinary stone. It had been struck by lightning, tr'
-streamed  'lectric energy. \n\nThis was no ordinary stone. It had been struck by lightning, trapping the powerful'
-streamed  'rgy. \n\nThis was no ordinary stone. It had been struck by lightning, trapping the powerful electrical'
-streamed  's no ordinary stone. It had been struck by lightning, trapping the powerful electrical charge within'
-streamed  'dinary stone. It had been struck by lightning, trapping the powerful electrical charge within its st'
-streamed  '. It had been struck by lightning, trapping the powerful electrical charge within its stony exterior'
-streamed  'had been struck by lightning, trapping the powerful electrical charge within its stony exterior. Now'
-streamed  'been struck by lightning, trapping the powerful electrical charge within its stony exterior. Now, as'
-streamed  ' struck by lightning, trapping the powerful electrical charge within its stony exterior. Now, as the'
-streamed  'k by lightning, trapping the powerful electrical charge within its stony exterior. Now, as the storm'
-streamed  ' by lightning, trapping the powerful electrical charge within its stony exterior. Now, as the storm '
-streamed  'tning, trapping the powerful electrical charge within its stony exterior. Now, as the storm raged on'
-streamed  'tning, trapping the powerful electrical charge within its stony exterior. Now, as the storm raged on'
-streamed  'tning, trapping the powerful electrical charge within its stony exterior. Now, as the storm raged on'
-streamed  'tning, trapping the powerful electrical charge within its stony exterior. Now, as the storm raged on'
-streamed final Here is a short story about lightning in a rock:
+

Teardown

FAILED test_aws_bedrock 0:00:03.345974

baml_py.BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "AwsBedrock", model: Some("anthropic.claude-3-5-sonnet-20240620-v1:0"), prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about lightning in a rock")] }]), request_options: {"api_key": String("")}, start_time: SystemTime { tv_sec: 1731353379, tv_nsec: 419024000 }, latency: 318.961292ms, message: "ServiceError(\n    ServiceError {\n        source: ThrottlingException(\n            ThrottlingException {\n                message: Some(\n                    \"Too many requests, please wait before trying again.\",\n                ),\n                meta: ErrorMetadata {\n                    code: Some(\n                        \"ThrottlingException\",\n                    ),\n                    message: Some(\n                        \"Too many requests, please wait before trying again.\",\n                    ),\n                    extras: Some(\n                        {\n                            \"aws_request_id\": \"671bf4e1-976e-4832-8839-6ed57f64bd10\",\n                        },\n                    ),\n                },\n            },\n        ),\n        raw: Response {\n            status: StatusCode(\n                429,\n            ),\n            headers: Headers {\n                headers: {\n                    \"date\": HeaderValue {\n                        _private: H0(\n                            \"Mon, 11 Nov 2024 19:29:39 GMT\",\n                        ),\n                    },\n                    \"content-type\": HeaderValue {\n                        _private: H0(\n                            \"application/json\",\n                        ),\n                    },\n                    \"content-length\": HeaderValue {\n                        _private: H0(\n                            \"65\",\n                        ),\n                    },\n                    \"x-amzn-requestid\": HeaderValue {\n                        _private: H0(\n                            \"671bf4e1-976e-4832-8839-6ed57f64bd10\",\n                        ),\n                    },\n                    \"x-amzn-errortype\": HeaderValue {\n                        _private: H0(\n                            \"ThrottlingException:http://internal.amazon.com/coral/com.amazon.bedrock/\",\n                        ),\n                    },\n                },\n            },\n            body: SdkBody {\n                inner: Once(\n                    Some(\n                        b\"{\\\"message\\\":\\\"Too many requests, please wait before trying again.\\\"}\",\n                    ),\n                ),\n                retryable: true,\n            },\n            extensions: Extensions {\n                extensions_02x: Extensions,\n                extensions_1x: Extensions,\n            },\n        },\n    },\n)", code: RateLimited }

Setup

Call

@pytest.mark.asyncio
+    async def test_aws_bedrock():
+        ## unstreamed
+        res = await b.TestAws("lightning in a rock")
+        print("unstreamed", res)
+    
+        ## streamed
+        stream = b.stream.TestAws("lightning in a rock")
+    
+        async for msg in stream:
+            if msg:
+                print("streamed ", repr(msg[-100:]))
+    
+>       res = await stream.get_final_response()
 
-The Thunderstone
+tests/test_functions.py:1137: 
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+../../engine/language_client_python/python_src/baml_py/stream.py:81: in get_final_response
+    return self.__final_coerce((await asyncio.wrap_future(final)))
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 
-As the storm clouds gathered overhead, jagged forks of lightning crackled through the sky. Amidst the rumbling thunder, a peculiar rock sitting on the ground began to glow with an intense, electric energy. 
+x = 
 
-This was no ordinary stone. It had been struck by lightning, trapping the powerful electrical charge within its stony exterior. Now, as the storm raged on
-
Captured stderr call
[2024-11-05T19:56:58Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
-[2024-11-05T19:56:58Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
-[2024-11-05T19:57:00Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 2274ms. StopReason: unknown. Tokens(in/out): 17/98
+>     lambda x: cast(str, x.cast_to(types, types)),
+      self.__ctx_manager.get(),
+    )
+E   baml_py.BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "AwsBedrock", model: Some("anthropic.claude-3-5-sonnet-20240620-v1:0"), prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about lightning in a rock")] }]), request_options: {"api_key": String("")}, start_time: SystemTime { tv_sec: 1731353379, tv_nsec: 419024000 }, latency: 318.961292ms, message: "ServiceError(\n    ServiceError {\n        source: ThrottlingException(\n            ThrottlingException {\n                message: Some(\n                    \"Too many requests, please wait before trying again.\",\n                ),\n                meta: ErrorMetadata {\n                    code: Some(\n                        \"ThrottlingException\",\n                    ),\n                    message: Some(\n                        \"Too many requests, please wait before trying again.\",\n                    ),\n                    extras: Some(\n                        {\n                            \"aws_request_id\": \"671bf4e1-976e-4832-8839-6ed57f64bd10\",\n                        },\n                    ),\n                },\n            },\n        ),\n        raw: Response {\n            status: StatusCode(\n                429,\n            ),\n            headers: Headers {\n                headers: {\n                    \"date\": HeaderValue {\n                        _private: H0(\n                            \"Mon, 11 Nov 2024 19:29:39 GMT\",\n                        ),\n                    },\n                    \"content-type\": HeaderValue {\n                        _private: H0(\n                            \"application/json\",\n                        ),\n                    },\n                    \"content-length\": HeaderValue {\n                        _private: H0(\n                            \"65\",\n                        ),\n                    },\n                    \"x-amzn-requestid\": HeaderValue {\n                        _private: H0(\n                            \"671bf4e1-976e-4832-8839-6ed57f64bd10\",\n                        ),\n                    },\n                    \"x-amzn-errortype\": HeaderValue {\n                        _private: H0(\n                            \"ThrottlingException:http://internal.amazon.com/coral/com.amazon.bedrock/\",\n                        ),\n                    },\n                },\n            },\n            body: SdkBody {\n                inner: Once(\n                    Some(\n                        b\"{\\\"message\\\":\\\"Too many requests, please wait before trying again.\\\"}\",\n                    ),\n                ),\n                retryable: true,\n            },\n            extensions: Extensions {\n                extensions_02x: Extensions,\n                extensions_1x: Extensions,\n            },\n        },\n    },\n)", code: RateLimited }
+
+baml_client/async_client.py:5055: BamlClientHttpError
Captured stdout call
unstreamed The ancient boulder rested atop a windswept hill, its weathered surface etched with countless years of history. For millennia, it had stood silent sentinel, watching the world change around it.
+
+On a particularly stormy night, dark clouds roiled overhead, their bellies heavy with rain and electricity. As the first drops began to fall, a brilliant fork of lightning split the sky, seeking the highest point on the landscape.
+
+In an instant, the bolt found its mark
+
Captured stderr call
[2024-11-11T19:29:36Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-11-11T19:29:36Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
+[2024-11-11T19:29:39Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-5-sonnet-20240620-v1:0) - 3008ms. StopReason: max_tokens. Tokens(in/out): 17/100
     ---PROMPT---
     [chat] user: Write a nice short story about lightning in a rock
     
     ---LLM REPLY---
-    Here is a short story about lightning in a rock:
+    The ancient boulder rested atop a windswept hill, its weathered surface etched with countless years of history. For millennia, it had stood silent sentinel, watching the world change around it.
     
-    The Thunderstone
+    On a particularly stormy night, dark clouds roiled overhead, their bellies heavy with rain and electricity. As the first drops began to fall, a brilliant fork of lightning split the sky, seeking the highest point on the landscape.
     
-    As the storm clouds gathered overhead, jagged forks of lightning crackled through the sky. Amidst the rumbling thunder, a peculiar rock sitting on the ground began to glow with an intense, electric energy. 
-    
-    This was no ordinary stone. It had been struck by lightning, trapping the powerful electrical charge within its stony exterior. Now, as the storm raged on
+    In an instant, the bolt found its mark
     ---Parsed Response (string)---
-    "Here is a short story about lightning in a rock:\n\nThe Thunderstone\n\nAs the storm clouds gathered overhead, jagged forks of lightning crackled through the sky. Amidst the rumbling thunder, a peculiar rock sitting on the ground began to glow with an intense, electric energy. \n\nThis was no ordinary stone. It had been struck by lightning, trapping the powerful electrical charge within its stony exterior. Now, as the storm raged on"
-

Teardown

PASSED test_serialization_exception 0:00:00.585094

Setup

Call

Captured stdout call
Exception message from test:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...g required field: nonce2, raw_output=Hello there! How can I help you today?, prompt=[chat] system: Say "hello there".
+    "The ancient boulder rested atop a windswept hill, its weathered surface etched with countless years of history. For millennia, it had stood silent sentinel, watching the world change around it.\n\nOn a particularly stormy night, dark clouds roiled overhead, their bellies heavy with rain and electricity. As the first drops began to fall, a brilliant fork of lightning split the sky, seeking the highest point on the landscape.\n\nIn an instant, the bolt found its mark"
+[2024-11-11T19:29:39Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-11-11T19:29:39Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
+[2024-11-11T19:29:39Z WARN  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-5-sonnet-20240620-v1:0) - 318ms
+    ---PROMPT---
+    [chat] user: Write a nice short story about lightning in a rock
+    
+    ---REQUEST OPTIONS---
+    api_key: ""
+    ---ERROR (RateLimited (429))---
+    ServiceError(
+        ServiceError {
+            source: ThrottlingException(
+                ThrottlingException {
+                    message: Some(
+                        "Too many requests, please wait before trying again.",
+                    ),
+                    meta: ErrorMetadata {
+                        code: Some(
+                            "ThrottlingException",
+                        ),
+                        message: Some(
+                            "Too many requests, please wait before trying again.",
+                        ),
+                        extras: Some(
+                            {
+                                "aws_request_id": "671bf4e1-976e-4832-8839-6ed57f64bd10",
+                            },
+                        ),
+                    },
+                },
+            ),
+            raw: Response {
+                status: StatusCode(
+                    429,
+                ),
+                headers: Headers {
+                    headers: {
+                        "date": HeaderValue {
+                            _private: H0(
+                                "Mon, 11 Nov 2024 19:29:39 GMT",
+                            ),
+                        },
+                        "content-type": HeaderValue {
+                            _private: H0(
+                                "application/json",
+                            ),
+                        },
+                        "content-length": HeaderValue {
+                            _private: H0(
+                                "65",
+                            ),
+                        },
+                        "x-amzn-requestid": HeaderValue {
+                            _private: H0(
+                                "671bf4e1-976e-4832-8839-6ed57f64bd10",
+                            ),
+                        },
+                        "x-amzn-errortype": HeaderValue {
+                            _private: H0(
+                                "ThrottlingException:http://internal.amazon.com/coral/com.amazon.bedrock/",
+                            ),
+                        },
+                    },
+                },
+                body: SdkBody {
+                    inner: Once(
+                        Some(
+                            b"{\"message\":\"Too many requests, please wait before trying again.\"}",
+                        ),
+                    ),
+                    retryable: true,
+                },
+                extensions: Extensions {
+                    extensions_02x: Extensions,
+                    extensions_1x: Extensions,
+                },
+            },
+        },
+    )
+

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.042889

Setup

Call

Captured stderr call
[2024-11-11T19:29:39Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-11-11T19:29:39Z WARN  baml_events] Function TestAwsInvalidRegion:
+    Client: AwsBedrockInvalidRegion (anthropic.claude-3-5-sonnet-20240620-v1:0) - 40ms
+    ---PROMPT---
+    [chat] user: Write a nice short story about lightning in a rock
+    
+    ---REQUEST OPTIONS---
+    api_key: ""
+    ---ERROR (Unspecified error code: 2)---
+    DispatchFailure(
+        DispatchFailure {
+            source: ConnectorError {
+                kind: Io,
+                source: hyper::Error(
+                    Connect,
+                    ConnectError(
+                        "dns error",
+                        Custom {
+                            kind: Uncategorized,
+                            error: "failed to lookup address information: nodename nor servname provided, or not known",
+                        },
+                    ),
+                ),
+                connection: Unknown,
+            },
+        },
+    )
+

Teardown

PASSED test_serialization_exception 0:00:00.495733

Setup

Call

Captured stdout call
Exception message from test:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
 ) tblen=2>
-
Captured stderr call
[2024-11-05T19:57:00Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 578ms. StopReason: stop. Tokens(in/out): 12/10
+
Captured stderr call
[2024-11-11T19:29:40Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 489ms. StopReason: stop. Tokens(in/out): 12/10
     ---PROMPT---
     [chat] system: Say "hello there".
     
     ---LLM REPLY---
-    Hello there! How can I help you today?
+    Hello there! How can I assist you today?
     ---Parsed Response (Error)---
     Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
-

Teardown

PASSED test_stream_serialization_exception 0:00:00.506045

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None
+

Teardown

PASSED test_stream_serialization_exception 0:00:00.474276

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
@@ -1997,20 +2216,20 @@
 streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
-Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...g required field: nonce2, raw_output=Hello there! How can I help you today?, prompt=[chat] system: Say "hello there".
+Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
 ) tblen=3>
-
Captured stderr call
[2024-11-05T19:57:01Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 499ms. StopReason: stop. Tokens(in/out): 12/10
+
Captured stderr call
[2024-11-11T19:29:40Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 466ms. StopReason: stop. Tokens(in/out): 12/10
     ---PROMPT---
     [chat] system: Say "hello there".
     
     ---LLM REPLY---
-    Hello there! How can I help you today?
+    Hello there! How can I assist you today?
     ---Parsed Response (Error)---
     Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
-

Teardown

PASSED test_stream2_serialization_exception 0:00:00.787126

Setup

Call

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

Teardown

PASSED test_stream2_serialization_exception 0:00:00.455908

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
@@ -2025,8 +2244,8 @@
 streamed  nonce=None nonce2=None nonce3=None
 Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...required field: nonce3, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
 ) tblen=3>
-
Captured stderr call
[2024-11-05T19:57:02Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 779ms. StopReason: stop. Tokens(in/out): 12/10
+
Captured stderr call
[2024-11-11T19:29:41Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 448ms. StopReason: stop. Tokens(in/out): 12/10
     ---PROMPT---
     [chat] system: Say "hello there".
     
@@ -2037,8 +2256,8 @@
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
       - <root>: Missing required field: nonce3
-

Teardown

PASSED test_descriptions 0:00:02.109089

Setup

Call

Captured stderr call
[2024-11-05T19:57:04Z INFO  baml_events] Function SchemaDescriptions:
-    Client: GPT4o (gpt-4o-2024-08-06) - 2089ms. StopReason: stop. Tokens(in/out): 340/104
+

Teardown

PASSED test_descriptions 0:00:01.875357

Setup

Call

Captured stderr call
[2024-11-11T19:29:43Z INFO  baml_events] Function SchemaDescriptions:
+    Client: GPT4o (gpt-4o-2024-08-06) - 1860ms. StopReason: stop. Tokens(in/out): 340/108
     ---PROMPT---
     [chat] system: Return a schema with this format:
     
@@ -2115,7 +2334,9 @@
         "hi"
       ],
       "blah": "blah",
-      "nested_attrs": "nested",
+      "nested_attrs": [
+        "nested"
+      ],
       "parens": "parens1",
       "other": "other"
     }
@@ -2141,10 +2362,47 @@
       "parens": "parens1",
       "other_group": "other"
     }
-

Teardown

PASSED test_caching 0:00:04.661504

Setup

Call

Captured stdout call
Duration no caching:  3.4841630458831787
-Duration with caching:  1.174595832824707
-
Captured stderr call
[2024-11-05T19:57:07Z INFO  baml_events] Function TestCaching:
-    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 3476ms. StopReason: "end_turn". Tokens(in/out): 966/285
+

Teardown

FAILED test_caching 0:00:01.934738

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

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, an underground resistance movement reaches out, warning Alex about the dangers of dream manipulation and the potential for mass control and exploitation. Caught between these opposing forces, Alex must navigate a complex web of ethical dilemmas. They grapple with questions of free will, the nature of consciousness, and the responsibility that comes with having power over people's minds. As the consequences of their actions spiral outward, affecting the lives of loved ones and strangers alike, Alex is forced to confront the true nature of their ability and decide how—or if—it should be used.
+    
+        The story explores themes of identity, the subconscious mind, the ethics of technology, and the power of imagination. It delves into the potential consequences of a world where our most private thoughts and experiences are no longer truly our own, and examines the fine line between helping others and manipulating them for personal gain or a perceived greater good. The narrative further expands on the societal implications of such abilities, questioning the moral boundaries of altering consciousness and the potential for abuse in a world where dreams can be commodified. It challenges the reader to consider the impact of technology on personal autonomy and the ethical responsibilities of those who wield such power.
+    
+        As Alex's journey unfolds, they encounter various individuals whose lives have been touched by their dream manipulations, each presenting a unique perspective on the ethical quandaries at hand. From a classmate who gains newfound confidence to a wealthy client who becomes addicted to the dreamscapes, the ripple effects of Alex's actions are profound and far-reaching. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement highlights the dangers of unchecked power and the importance of safeguarding individual freedoms.
+    
+        Ultimately, Alex's story is one of self-discovery and moral reckoning, as they must decide whether to embrace their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their fight for freedom and autonomy. The narrative invites readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also explores the psychological impact on Alex, who must deal with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.
+    
+        The story further examines the technological advancements that have made dream manipulation possible, questioning the role of innovation in society and the potential for both progress and peril. It considers the societal divide between those who can afford to buy enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more entangled in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.
+    
+        In the end, Alex's journey is a cautionary tale about the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind.
+    """
+        rand = random.randint(0, 26)
+        story_idea += " " + rand * "a"
+        start = time.time()
+        _ = await b.TestCaching(story_idea, "be funny")
+        duration = time.time() - start
+    
+        start = time.time()
+        _ = await b.TestCaching(story_idea, "be real")
+        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.0759122371673584 < 0.8567588329315186
+
+tests/test_functions.py:1248: AssertionError
Captured stdout call
Duration no caching:  0.8567588329315186
+Duration with caching:  1.0759122371673584
+
Captured stderr call
[2024-11-11T19:29:44Z INFO  baml_events] Function TestCaching:
+    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 853ms. StopReason: "end_turn". Tokens(in/out): 966/23
     ---PROMPT---
     [chat] system: {"cache_control": Object {"type": String("ephemeral")}}::Describe this in 5 words: 
         In a near-future society where dreams have become a tradable commodity and shared experience, a lonely and socially awkward teenager named Alex discovers they possess a rare and powerful ability to not only view but also manipulate the dreams of others. Initially thrilled by this newfound power, Alex begins subtly altering the dreams of classmates and family members, helping them overcome fears, boost confidence, or experience fantastical adventures. As Alex's skills grow, so does their influence. They start selling premium dream experiences on the black market, crafting intricate and addictive dreamscapes for wealthy clients. However, the line between dream and reality begins to blur for those exposed to Alex's creations. Some clients struggle to differentiate between their true memories and the artificial ones implanted by Alex's dream manipulation.
@@ -2160,21 +2418,17 @@
         The story further examines the technological advancements that have made dream manipulation possible, questioning the role of innovation in society and the potential for both progress and peril. It considers the societal divide between those who can afford to buy enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more entangled in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.
     
         In the end, Alex's journey is a cautionary tale about the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind.
-     aaaaaaaaaaaaaaaa
+     aaaaaaaaaaaaaaaaaa
     user: be funny
     
     ---LLM REPLY---
-    Here's an attempt at making the description more humorous:
+    Here's a funny summary in 5 words:
     
-    In a weird future world, a socially awkward teen named Alex can mess with people's dreams. At first it's like, "Whoa, cool superpower!" But then Alex starts using it to basically gaslight their whole town, making classmates think they're superheroes or their parents are secretly vampires. Not surprising, this leads to some pretty hilarious consequences.
-    
-    The government and some shady resistance group both want to recruit Alex, which is pretty flattering, but Alex is too busy cashing in on the dream-hacking black market to care. They're raking in the dough selling premium dream experiences to rich clients - stuff like alien abductions, winning the lottery, meeting their celebrity crush. But things get dicey when some of these clients start permanently mixing up their dreams and reality. Oops.
-    
-    Now Alex has to figure out whether to keep living the dream (pun intended), join the feds, or team up with the rebels. Probably should have gone with option C, since the other two just want to use Alex's powers for their own sinister purposes. But hey, at least Alex will have a killer resume when this is all over - professional dream architect, government agent, and resistance fighter. Not bad for a socially awkward teen.
+    Teen's dream skills cause real nightmare.
     ---Parsed Response (string)---
-    "Here's an attempt at making the description more humorous:\n\nIn a weird future world, a socially awkward teen named Alex can mess with people's dreams. At first it's like, \"Whoa, cool superpower!\" But then Alex starts using it to basically gaslight their whole town, making classmates think they're superheroes or their parents are secretly vampires. Not surprising, this leads to some pretty hilarious consequences.\n\nThe government and some shady resistance group both want to recruit Alex, which is pretty flattering, but Alex is too busy cashing in on the dream-hacking black market to care. They're raking in the dough selling premium dream experiences to rich clients - stuff like alien abductions, winning the lottery, meeting their celebrity crush. But things get dicey when some of these clients start permanently mixing up their dreams and reality. Oops.\n\nNow Alex has to figure out whether to keep living the dream (pun intended), join the feds, or team up with the rebels. Probably should have gone with option C, since the other two just want to use Alex's powers for their own sinister purposes. But hey, at least Alex will have a killer resume when this is all over - professional dream architect, government agent, and resistance fighter. Not bad for a socially awkward teen."
-[2024-11-05T19:57:08Z INFO  baml_events] Function TestCaching:
-    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 1167ms. StopReason: "end_turn". Tokens(in/out): 966/45
+    "Here's a funny summary in 5 words:\n\nTeen's dream skills cause real nightmare."
+[2024-11-11T19:29:45Z INFO  baml_events] Function TestCaching:
+    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 1070ms. StopReason: "end_turn". Tokens(in/out): 966/37
     ---PROMPT---
     [chat] system: {"cache_control": Object {"type": String("ephemeral")}}::Describe this in 5 words: 
         In a near-future society where dreams have become a tradable commodity and shared experience, a lonely and socially awkward teenager named Alex discovers they possess a rare and powerful ability to not only view but also manipulate the dreams of others. Initially thrilled by this newfound power, Alex begins subtly altering the dreams of classmates and family members, helping them overcome fears, boost confidence, or experience fantastical adventures. As Alex's skills grow, so does their influence. They start selling premium dream experiences on the black market, crafting intricate and addictive dreamscapes for wealthy clients. However, the line between dream and reality begins to blur for those exposed to Alex's creations. Some clients struggle to differentiate between their true memories and the artificial ones implanted by Alex's dream manipulation.
@@ -2190,19 +2444,19 @@
         The story further examines the technological advancements that have made dream manipulation possible, questioning the role of innovation in society and the potential for both progress and peril. It considers the societal divide between those who can afford to buy enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more entangled in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.
     
         In the end, Alex's journey is a cautionary tale about the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind.
-     aaaaaaaaaaaaaaaa
+     aaaaaaaaaaaaaaaaaa
     user: be real
     
     ---LLM REPLY---
-    Okay, I got a bit carried away with that detailed plot summary. Let me try to describe the core premise in just 5 words:
+    Okay, let me try to summarize the key points in a more concise and direct way:
     
-    Manipulating dreams as a tradable commodity.
+    Teenager with dream manipulation powers faces ethical dilemmas.
     ---Parsed Response (string)---
-    "Okay, I got a bit carried away with that detailed plot summary. Let me try to describe the core premise in just 5 words:\n\nManipulating dreams as a tradable commodity."
-

Teardown

PASSED test_arg_exceptions 0:00:00.913289

Setup

Call

Captured stderr call
[2024-11-05T19:57:08Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
+    "Okay, let me try to summarize the key points in a more concise and direct way:\n\nTeenager with dream manipulation powers faces ethical dilemmas."
+

Teardown

PASSED test_arg_exceptions 0:00:00.719960

Setup

Call

Captured stderr call
[2024-11-11T19:29:45Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
     
-[2024-11-05T19:57:09Z WARN  baml_events] Function MyFunc:
-    Client: MyClient (<unknown>) - 169ms
+[2024-11-11T19:29:45Z WARN  baml_events] Function MyFunc:
+    Client: MyClient (<unknown>) - 122ms
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -2224,8 +2478,8 @@
         }
     }
     
-[2024-11-05T19:57:09Z WARN  baml_events] Function MyFunc:
-    Client: MyClient (<unknown>) - 162ms
+[2024-11-11T19:29:45Z WARN  baml_events] Function MyFunc:
+    Client: MyClient (<unknown>) - 100ms
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -2247,8 +2501,8 @@
         }
     }
     
-[2024-11-05T19:57:09Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 561ms. StopReason: stop. Tokens(in/out): 12/10
+[2024-11-11T19:29:45Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 486ms. StopReason: stop. Tokens(in/out): 12/10
     ---PROMPT---
     [chat] system: Say "hello there".
     
@@ -2258,14 +2512,14 @@
     Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
-

Teardown

PASSED test_map_as_param 0:00:00.003330

Setup

Call

Captured stderr call
[2024-11-05T19:57:09Z ERROR baml_runtime::tracing]   Error: myMap: a: Expected map, got `String("b")`
+

Teardown

PASSED test_map_as_param 0:00:00.002003

Setup

Call

Captured stderr call
[2024-11-11T19:29:45Z ERROR baml_runtime::tracing]   Error: myMap: a: Expected map, got `String("b")`
     
-

Teardown

PASSED test_baml_validation_error_format 0:00:00.495189

Setup

Call

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

Teardown

PASSED test_baml_validation_error_format 0:00:00.588897

Setup

Call

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

Teardown

PASSED test_no_stream_big_integer 0:00:00.373504

Setup

Call

Captured stderr call
[2024-11-05T19:57:10Z INFO  baml_events] Function StreamOneBigNumber:
-    Client: GPT4 (gpt-4o-2024-08-06) - 367ms. StopReason: stop. Tokens(in/out): 47/4
+

Teardown

PASSED test_no_stream_big_integer 0:00:00.320955

Setup

Call

Captured stderr call
[2024-11-11T19:29:46Z INFO  baml_events] Function StreamOneBigNumber:
+    Client: GPT4 (gpt-4o-2024-08-06) - 314ms. StopReason: stop. Tokens(in/out): 46/4
     ---PROMPT---
     [chat] system: Respond with only an integer, no affirmations or prefixes or anything.
     The response should be parsable as a JSON number.
     
     Please make sure the integer has 12 digits.
     
-    Answer as a: int
+    Answer as an int
     
     ---LLM REPLY---
-    102345678901
+    810379246135
     ---Parsed Response (int)---
-    102345678901
-

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.713407

Setup

Call

Captured stderr call
[2024-11-05T19:57:11Z INFO  baml_events] Function StreamBigNumbers:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 705ms. StopReason: stop. Tokens(in/out): 70/24
+    810379246135
+

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.599190

Setup

Call

Captured stderr call
[2024-11-11T19:29:47Z INFO  baml_events] Function StreamBigNumbers:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 592ms. StopReason: stop. Tokens(in/out): 70/23
     ---PROMPT---
     [chat] system: Please make sure every integer in the output has 12 digits.
     For floats, provide a mix - from 0-10 places before the decimal point,
@@ -2305,15 +2559,15 @@
     ---LLM REPLY---
     {
       "a": 123456789012,
-      "b": 12345.67890123
+      "b": 9876543.210
     }
     ---Parsed Response (class BigNumbers)---
     {
       "a": 123456789012,
-      "b": 12345.67890123
+      "b": 9876543.21
     }
-

Teardown

PASSED test_no_stream_compound_object 0:00:03.983986

Setup

Call

Captured stderr call
[2024-11-05T19:57:15Z INFO  baml_events] Function StreamingCompoundNumbers:
-    Client: GPT4 (gpt-4o-2024-08-06) - 3976ms. StopReason: stop. Tokens(in/out): 153/145
+

Teardown

PASSED test_no_stream_compound_object 0:00:03.402571

Setup

Call

Captured stderr call
[2024-11-11T19:29:50Z INFO  baml_events] Function StreamingCompoundNumbers:
+    Client: GPT4 (gpt-4o-2024-08-06) - 3394ms. StopReason: stop. Tokens(in/out): 133/150
     ---PROMPT---
     [chat] system:     Respond in pure json. Don't use any English descriptions like "Sure, I'll do that",
         nor put the result into a fenced code block.
@@ -2324,76 +2578,70 @@
     For floats, provide a mix - from 0-10 places before the decimal point,
     and 1-10 places after the decimal point. Bet.
     
+    BigNumbers {
+      a: int,
+      b: float,
+    }
+    
     Answer in JSON using this schema:
     {
-      big: {
-        a: int,
-        b: float,
-      },
-      big_nums: [
-        {
-          a: int,
-          b: float,
-        }
-      ],
-      another: {
-        a: int,
-        b: float,
-      },
+      big: BigNumbers,
+      big_nums: BigNumbers[],
+      another: BigNumbers,
     }
     
     ---LLM REPLY---
     {
       "big": {
         "a": 123456789012,
-        "b": 123456.789012345
+        "b": 1234567890.123456789
       },
       "big_nums": [
         {
           "a": 987654321098,
-          "b": 9876543210.123456
+          "b": 98765432.123456789
         },
         {
-          "a": 112233445566,
-          "b": 223344.5566
+          "a": 192837465012,
+          "b": 1234567890123.12345
         },
         {
-          "a": 998877665544,
-          "b": 112233.4455667
+          "a": 123456789012,
+          "b": 0.123456789
         }
       ],
       "another": {
-        "a": 102030405060,
-        "b": 908070.60705
+        "a": 999999999999,
+        "b": 4567890123.123
       }
     }
     ---Parsed Response (class CompoundBigNumbers)---
     {
       "big": {
         "a": 123456789012,
-        "b": 123456.789012345
+        "b": 1234567890.1234567
       },
       "big_nums": [
         {
           "a": 987654321098,
-          "b": 9876543210.123455
+          "b": 98765432.12345679
         },
         {
-          "a": 112233445566,
-          "b": 223344.5566
+          "a": 192837465012,
+          "b": 1234567890123.1235
         },
         {
-          "a": 998877665544,
-          "b": 112233.4455667
+          "a": 123456789012,
+          "b": 0.123456789
         }
       ],
       "another": {
-        "a": 102030405060,
-        "b": 908070.60705
+        "a": 999999999999,
+        "b": 4567890123.123
       }
     }
-

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:02.419003

Setup

Call

Captured stderr call
[2024-11-05T19:57:17Z INFO  baml_events] Function StreamingCompoundNumbers:
-    Client: GPT4 (gpt-4o-2024-08-06) - 2409ms. StopReason: stop. Tokens(in/out): 134/172
+

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:03.674023

Setup

Call

Captured stderr call
[2024-11-11T19:29:54Z INFO  baml_events] Function StreamingCompoundNumbers:
+    Client: GPT4 (gpt-4o-2024-08-06) - 3664ms. StopReason: stop. Tokens(in/out): 114/175
     ---PROMPT---
     [chat] system:     Please give me a friendly response before outputting json. And put the JSON
         into a fenced code block.
@@ -2402,50 +2650,44 @@
     For floats, provide a mix - from 0-10 places before the decimal point,
     and 1-10 places after the decimal point. Bet.
     
+    BigNumbers {
+      a: int,
+      b: float,
+    }
+    
     Answer in JSON using this schema:
     {
-      big: {
-        a: int,
-        b: float,
-      },
-      big_nums: [
-        {
-          a: int,
-          b: float,
-        }
-      ],
-      another: {
-        a: int,
-        b: float,
-      },
+      big: BigNumbers,
+      big_nums: BigNumbers[],
+      another: BigNumbers,
     }
     
     ---LLM REPLY---
-    Hey there! I'm excited to help you with that JSON structure. Here's your data:
+    Hello there! I'm excited to help you out with some big numbers presented in JSON format. Here you go:
     
     ```json
     {
       "big": {
         "a": 123456789012,
-        "b": 12345.6789012345
+        "b": 9876543210.12345
       },
       "big_nums": [
         {
           "a": 234567890123,
-          "b": 54321.0987654321
+          "b": 123456789012.0
         },
         {
           "a": 345678901234,
-          "b": 9999999999.123456789
+          "b": 567890123456.789
         },
         {
           "a": 456789012345,
-          "b": 9876543210.0
+          "b": 6789012345.678901
         }
       ],
       "another": {
         "a": 567890123456,
-        "b": 1234567890.12345
+        "b": 8901234567.891234
       }
     }
     ```
@@ -2453,29 +2695,29 @@
     {
       "big": {
         "a": 123456789012,
-        "b": 12345.6789012345
+        "b": 9876543210.12345
       },
       "big_nums": [
         {
           "a": 234567890123,
-          "b": 54321.0987654321
+          "b": 123456789012.0
         },
         {
           "a": 345678901234,
-          "b": 9999999999.123457
+          "b": 567890123456.789
         },
         {
           "a": 456789012345,
-          "b": 9876543210.0
+          "b": 6789012345.678901
         }
       ],
       "another": {
         "a": 567890123456,
-        "b": 1234567890.12345
+        "b": 8901234567.891233
       }
     }
-

Teardown

PASSED test_differing_unions 0:00:01.118353

Setup

Call

Captured stderr call
[2024-11-05T19:57:18Z INFO  baml_events] Function DifferentiateUnions:
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 1107ms. StopReason: stop. Tokens(in/out): 50/52
+

Teardown

PASSED test_differing_unions 0:00:01.927315

Setup

Call

Captured stderr call
[2024-11-11T19:29:56Z INFO  baml_events] Function DifferentiateUnions:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 1918ms. StopReason: stop. Tokens(in/out): 50/73
     ---PROMPT---
     [chat] system: Create a data model that represents the latter of the two classes.
     
@@ -2488,76 +2730,35 @@
     }
     
     ---LLM REPLY---
-    Here is a data model that represents the latter of the two classes in JSON format:
+    Here is a JSON representation of a data model based on the second class schema provided:
     
     ```json
     {
-      "value": 10,
-      "value2": "sample string"
+      "value": 42,
+      "value2": "example string"
     }
-    ``` 
+    ```
     
-    Feel free to adjust the values according to your specific requirements.
+    In this model, `value` is an integer, and `value2` is a string. You can replace the values accordingly to fit your specific use case.
     ---Parsed Response (class OriginalB)---
     {
-      "value": 10,
-      "value2": "sample string"
+      "value": 42,
+      "value2": "example string"
     }
-

Teardown

PASSED test_return_failing_assert 0:00:00.636227

Setup

Call

Captured stderr call
[2024-11-05T19:57:19Z WARN  baml_events] Function ReturnFailingAssert:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 630ms. StopReason: stop. Tokens(in/out): 20/1
+

Teardown

PASSED test_return_failing_assert 0:00:00.421477

Setup

Call

Captured stderr call
[2024-11-11T19:29:56Z WARN  baml_events] Function ReturnFailingAssert:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 414ms. StopReason: stop. Tokens(in/out): 19/1
     ---PROMPT---
     [chat] system: Return the next integer after 1.
     
-    Answer as a: int
+    Answer as an int
     
     ---LLM REPLY---
     2
     ---Parsed Response (Error)---
     Failed to coerce value: <root>: Assertions failed.
-

Teardown

PASSED test_parameter_failing_assert 0:00:00.003347

Setup

Call

Captured stderr call
[2024-11-05T19:57:19Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: small_int
+

Teardown

PASSED test_parameter_failing_assert 0:00:00.003229

Setup

Call

Captured stderr call
[2024-11-11T19:29:56Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: small_int
     
-

Teardown

PASSED test_failing_assert_can_stream 0:00:03.338813

Setup

Call

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

Teardown

PASSED test_failing_assert_can_stream 0:00:03.330473

Setup

Call

Captured stdout call
None
 None
 None
 None
@@ -3133,27 +3334,8 @@
 None
 None
 None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-
Captured stderr call
[2024-11-05T19:57:22Z WARN  baml_events] Function StreamFailingAssertion:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 3331ms. StopReason: stop. Tokens(in/out): 62/315
+
Captured stderr call
[2024-11-11T19:30:00Z WARN  baml_events] Function StreamFailingAssertion:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 3323ms. StopReason: stop. Tokens(in/out): 62/285
     ---PROMPT---
     [chat] system: Tell me two different stories along the theme of Yoshimi battles the pink robots with the same title.
     Please make each about 300 words long.
@@ -3166,9 +3348,9 @@
     
     ---LLM REPLY---
     {
-      "title": "Yoshimi Battles the Pink Robots",
-      "story_a": "Yoshimi was an ordinary girl living in a small town until one day, pink robots suddenly invaded her peaceful community. Armed with only her courage and determination, Yoshimi took it upon herself to battle these menacing robots. With quick thinking and resourcefulness, she devised clever strategies to outsmart the pink robots and protect her town. Despite the overwhelming odds, Yoshimi never gave up and eventually emerged victorious, earning the admiration and gratitude of her fellow townspeople. The story of Yoshimi's fearless battle against the pink robots became a legend, inspiring others to stand up against any threat that comes their way.",
-      "story_b": "In a futuristic world where pink robots ruled with an iron fist, Yoshimi was a rebellious young woman who dared to challenge their authority. These robots, programmed to enforce strict rules and suppress any form of creativity, saw Yoshimi as a threat to their regime. Determined to fight for freedom and individuality, Yoshimi led a brave rebellion against the pink robots. With her unmatched skills in combat and unwavering spirit, she took on the robots in fierce battles that shook the foundations of their oppressive society. In the final showdown, Yoshimi faced the leader of the pink robots in a dramatic confrontation that would determine the fate of their world. Through her courage and defiance, Yoshimi emerged victorious, bringing an end to the era of the pink robots and ushering in a new era of freedom and self-expression for all." 
+      "title": "Yoshimi battles the pink robots",
+      "story_a": "Yoshimi was a young scientist who had always been fascinated by robotics. When a group of pink robots suddenly invaded her city, she knew she had to take action. Armed with her knowledge and determination, Yoshimi created a powerful robot of her own to combat the pink invaders. The battle was intense, with laser beams and explosions lighting up the sky. Despite the odds being against her, Yoshimi's robot fought bravely and eventually emerged victorious. The city cheered as the last pink robot was defeated, and Yoshimi was hailed as a hero for her courage and ingenuity.",
+      "story_b": "Yoshimi was a talented martial artist who had been training for years to perfect her skills. When a horde of pink robots descended upon her dojo, Yoshimi knew she had to defend her home. With swift and precise movements, she engaged the robots in combat, dodging their attacks and delivering powerful strikes of her own. As the battle raged on, Yoshimi's determination never wavered. Despite being outnumbered, she fought with incredible strength and skill. In the end, the pink robots were no match for Yoshimi's expertise, and they were defeated one by one. The dojo was safe once again, and Yoshimi stood victorious, a true warrior in every sense of the word."
     }
     ---Parsed Response (Error)---
     Failed to coerce value: <root>: Failed while parsing required fields: missing=0, unparsed=2
@@ -3176,39 +3358,227 @@
         - <root>: Assertions failed.
       - <root>: Failed to parse field story_b: <root>: Assertions failed.
         - <root>: Assertions failed.
-

Teardown

PASSED test_block_constraints 0:00:00.559182

Setup

Call

Captured stderr call
[2024-11-05T19:57:23Z INFO  baml_events] Function MakeBlockConstraint:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 552ms. StopReason: stop. Tokens(in/out): 42/22
+

Teardown

PASSED test_simple_recursive_type 0:00:03.136111

Setup

Call

Captured stderr call
[2024-11-11T19:30:03Z INFO  baml_events] Function BuildLinkedList:
+    Client: O1 (o1-mini-2024-09-12) - 3125ms. StopReason: stop. Tokens(in/out): 81/421
     ---PROMPT---
-    [chat] system: Generate an output in the following schema with a short string and a large int.
+    [chat] user: Build a linked list from the input array of integers.
+    
+    INPUT:
+    [1, 2, 3, 4, 5]
+    
+    Node {
+      data: int,
+      next: Node or null,
+    }
     
     Answer in JSON using this schema:
     {
-      foo: int,
-      bar: string,
+      head: Node or null,
+      len: int,
     }
     
     ---LLM REPLY---
+    ```json
     {
-      "foo": 1000000,
-      "bar": "This is a short string"
+      "head": {
+        "data": 1,
+        "next": {
+          "data": 2,
+          "next": {
+            "data": 3,
+            "next": {
+              "data": 4,
+              "next": {
+                "data": 5,
+                "next": null
+              }
+            }
+          }
+        }
+      },
+      "len": 5
     }
-    ---Parsed Response (class BlockConstraint)---
-    {
-      "value": {
-        "foo": 1000000,
-        "bar": "This is a short string"
+    ```
+    ---Parsed Response (class LinkedList)---
+    {
+      "head": {
+        "data": 1,
+        "next": {
+          "data": 2,
+          "next": {
+            "data": 3,
+            "next": {
+              "data": 4,
+              "next": {
+                "data": 5,
+                "next": null
+              }
+            }
+          }
+        }
       },
-      "checks": {
-        "cross_field": {
-          "name": "cross_field",
-          "expression": "this.bar|length > this.foo",
-          "status": "failed"
+      "len": 5
+    }
+

Teardown

PASSED test_mutually_recursive_type 0:00:03.676833

Setup

Call

Captured stderr call
[2024-11-11T19:30:06Z INFO  baml_events] Function BuildTree:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 3661ms. StopReason: stop. Tokens(in/out): 216/190
+    ---PROMPT---
+    [chat] system: Given the input binary tree, transform it into a generic tree using the given schema.
+    
+    INPUT:
+    {
+        "data": 5,
+        "right": {
+            "data": 7,
+            "left": {
+                "data": 6,
+                "left": none,
+                "right": none,
+            },
+            "right": {
+                "left": none,
+                "right": none,
+                "data": 8,
+            },
+        },
+        "left": {
+            "right": {
+                "data": 4,
+                "left": none,
+                "right": none,
+            },
+            "left": {
+                "left": {
+                    "data": 2,
+                    "right": none,
+                    "left": none,
+                },
+                "right": none,
+                "data": 1,
+            },
+            "data": 3,
+        },
+    }
+    
+    Tree {
+      data: int,
+      children: Forest,
+    }
+    
+    Forest {
+      trees: Tree[],
+    }
+    
+    Answer in JSON using this schema: Tree
+    
+    ---LLM REPLY---
+    {
+        "data": 5,
+        "children": {
+            "trees": [
+                {
+                    "data": 3,
+                    "children": {
+                        "trees": [
+                            {
+                                "data": 1,
+                                "children": {
+                                    "trees": [
+                                        {
+                                            "data": 2,
+                                            "children": {
+                                                "trees": []
+                                            }
+                                        }
+                                    ]
+                                }
+                            },
+                            {
+                                "data": 4,
+                                "children": {
+                                    "trees": []
+                                }
+                            }
+                        ]
+                    }
+                },
+                {
+                    "data": 7,
+                    "children": {
+                        "trees": [
+                            {
+                                "data": 6,
+                                "children": {
+                                    "trees": []
+                                }
+                            },
+                            {
+                                "data": 8,
+                                "children": {
+                                    "trees": []
+                                }
+                            }
+                        ]
+                    }
+                }
+            ]
         }
+    }
+    ---Parsed Response (class Tree)---
+    {
+      "data": 5,
+      "children": {
+        "trees": [
+          {
+            "data": 3,
+            "children": {
+              "trees": [
+                {
+                  "data": 1,
+                  "children": {
+                    "trees": [
+                      {
+                        "data": 2,
+                        "children": {
+                          "trees": []
+                        }
+                      }
+                    ]
+                  }
+                },
+                {
+                  "data": 4,
+                  "children": {
+                    "trees": []
+                  }
+                }
+              ]
+            }
+          },
+          {
+            "data": 7,
+            "children": {
+              "trees": [
+                {
+                  "data": 6,
+                  "children": {
+                    "trees": []
+                  }
+                },
+                {
+                  "data": 8,
+                  "children": {
+                    "trees": []
+                  }
+                }
+              ]
+            }
+          }
+        ]
       }
     }
-

Teardown

PASSED test_nested_block_constraints 0:00:01.027956

Setup

Call

Captured stdout call
nbc=Checked[BlockConstraint, Literal['cross_field']](value=BlockConstraint(foo=1, bar='hello'), checks={'cross_field': Check(name='cross_field', expression='this.bar|length > this.foo', status='succeeded')})
-
Captured stderr call
[2024-11-05T19:57:24Z INFO  baml_events] Function MakeNestedBlockConstraint:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1019ms. StopReason: stop. Tokens(in/out): 52/24
+

Teardown

SKIPPED test_block_constraints 0:00:00.000387

Skipped: async def function and no async plugin installed (see warnings)

Setup

Call

('/Users/vbv/Library/Caches/pypoetry/virtualenvs/python-integ-tests-lSPb1NE9-py3.12/lib/python3.12/site-packages/_pytest/python.py', 149, 'Skipped: async def function and no async plugin installed (see warnings)')

Teardown

PASSED test_nested_block_constraints 0:00:00.805415

Setup

Call

Captured stdout call
nbc=Checked[BlockConstraint, Literal['cross_field']](value=BlockConstraint(foo=1, bar='hello'), checks={'cross_field': Check(name='cross_field', expression='this.bar|length > this.foo', status='succeeded')})
+
Captured stderr call
[2024-11-11T19:30:07Z INFO  baml_events] Function MakeNestedBlockConstraint:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 795ms. StopReason: stop. Tokens(in/out): 52/24
     ---PROMPT---
     [chat] system: Generate an output where the inner foo is 1 and the inner bar is "hello".
       Answer in JSON using this schema:
@@ -3242,8 +3612,8 @@
         }
       }
     }
-

Teardown

PASSED test_block_constraint_arguments 0:00:00.004030

Setup

Call

Captured stderr call
[2024-11-05T19:57:24Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+

Teardown

PASSED test_block_constraint_arguments 0:00:00.003396

Setup

Call

Captured stderr call
[2024-11-11T19:30:07Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-[2024-11-05T19:57:24Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+[2024-11-11T19:30:07Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-

Teardown

tests/test_pydantic.py 3 0:00:00.003597

PASSED test_model_validate_success 0:00:00.000850

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.001981

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000766

Setup

Call

Teardown

\ No newline at end of file +

Teardown

tests/test_pydantic.py 3 0:00:00.002465

PASSED test_model_validate_success 0:00:00.001196

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000838

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000432

Setup

Call

Teardown

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

Test Report

Started: 2024-11-09 18:10:19
Suites (1)
0 passed
1 failed
0 pending
Tests (64)
61 passed
3 failed
0 pending
Integ tests > should work for all inputs
single bool
passed
0.432s
Integ tests > should work for all inputs
single string list
passed
0.454s
Integ tests > should work for all inputs
return literal union
failed
0.419s
BamlValidationError: BamlValidationError: Failed to parse LLM response: Failed to coerce value: <root>: Failed to find any (1 | true | "string output") in 3 items
-  - <root>: Expected 1, got Object([("response", String("true"))]).
-  - <root>: Expected true, got Object([("response", String("true"))]).
-  - <root>: Expected "string output", got Object([("response", String("true"))]).
-    at Function.from (/workspaces/baml/engine/language_client_typescript/index.js:33:28)
-    at from (/workspaces/baml/engine/language_client_typescript/index.js:58:32)
-    at BamlAsyncClient.LiteralUnionsTest (/workspaces/baml/integ-tests/typescript/baml_client/async_client.ts:1412:50)
-    at Object.<anonymous> (/workspaces/baml/integ-tests/typescript/tests/integ-tests.test.ts:42:19)
Integ tests > should work for all inputs
single class
passed
0.451s
Integ tests > should work for all inputs
multiple classes
passed
0.658s
Integ tests > should work for all inputs
single enum list
passed
0.67s
Integ tests > should work for all inputs
single float
passed
0.41s
Integ tests > should work for all inputs
single int
passed
0.44s
Integ tests > should work for all inputs
single literal int
passed
0.421s
Integ tests > should work for all inputs
single literal bool
passed
0.614s
Integ tests > should work for all inputs
single literal string
passed
0.376s
Integ tests > should work for all inputs
single class with literal prop
passed
0.561s
Integ tests > should work for all inputs
single class with literal union prop
passed
0.419s
Integ tests > should work for all inputs
single optional string
passed
0.608s
Integ tests > should work for all inputs
single map string to string
passed
0.595s
Integ tests > should work for all inputs
single map string to class
passed
0.652s
Integ tests > should work for all inputs
single map string to map
passed
0.54s
Integ tests
should work for all outputs
passed
10.16s
Integ tests
works with retries1
passed
1.26s
Integ tests
works with retries2
passed
2.644s
Integ tests
works with fallbacks
passed
2.462s
Integ tests
should work with image from url
passed
1.122s
Integ tests
should work with image from base 64
passed
1.381s
Integ tests
should work with audio base 64
passed
1.621s
Integ tests
should work with audio from url
passed
1.91s
Integ tests
should support streaming in OpenAI
passed
2.528s
Integ tests
should support streaming in Gemini
passed
10.035s
Integ tests
should support AWS
passed
3.46s
Integ tests
should support streaming in AWS
failed
0.603s
Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "AwsBedrock", model: Some("anthropic.claude-3-5-sonnet-20240620-v1:0"), prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about Dr. Pepper")] }]), request_options: {"api_key": String("")}, start_time: SystemTime { tv_sec: 1731175866, tv_nsec: 889754865 }, latency: 497.52378ms, message: "ServiceError(\n    ServiceError {\n        source: ThrottlingException(\n            ThrottlingException {\n                message: Some(\n                    \"Too many requests, please wait before trying again.\",\n                ),\n                meta: ErrorMetadata {\n                    code: Some(\n                        \"ThrottlingException\",\n                    ),\n                    message: Some(\n                        \"Too many requests, please wait before trying again.\",\n                    ),\n                    extras: Some(\n                        {\n                            \"aws_request_id\": \"eda1765e-9667-45d9-9eaa-329221db8b1d\",\n                        },\n                    ),\n                },\n            },\n        ),\n        raw: Response {\n            status: StatusCode(\n                429,\n            ),\n            headers: Headers {\n                headers: {\n                    \"date\": HeaderValue {\n                        _private: H0(\n                            \"Sat, 09 Nov 2024 18:11:07 GMT\",\n                        ),\n                    },\n                    \"content-type\": HeaderValue {\n                        _private: H0(\n                            \"application/json\",\n                        ),\n                    },\n                    \"content-length\": HeaderValue {\n                        _private: H0(\n                            \"65\",\n                        ),\n                    },\n                    \"x-amzn-requestid\": HeaderValue {\n                        _private: H0(\n                            \"eda1765e-9667-45d9-9eaa-329221db8b1d\",\n                        ),\n                    },\n                    \"x-amzn-errortype\": HeaderValue {\n                        _private: H0(\n                            \"ThrottlingException:http://internal.amazon.com/coral/com.amazon.bedrock/\",\n                        ),\n                    },\n                },\n            },\n            body: SdkBody {\n                inner: Once(\n                    Some(\n                        b\"{\\\"message\\\":\\\"Too many requests, please wait before trying again.\\\"}\",\n                    ),\n                ),\n                retryable: true,\n            },\n            extensions: Extensions {\n                extensions_02x: Extensions,\n                extensions_1x: Extensions,\n            },\n        },\n    },\n)", code: RateLimited }
-    at BamlStream.parsed [as getFinalResponse] (/workspaces/baml/engine/language_client_typescript/stream.js:58:39)
-    at Object.<anonymous> (/workspaces/baml/integ-tests/typescript/tests/integ-tests.test.ts:274:19)
Integ tests
should allow overriding the region
passed
0.026s
Integ tests
should support OpenAI shorthand
passed
15.494s
Integ tests
should support OpenAI shorthand streaming
passed
9.617s
Integ tests
should support anthropic shorthand
passed
2.873s
Integ tests
should support anthropic shorthand streaming
passed
3.741s
Integ tests
should support streaming without iterating
passed
2.686s
Integ tests
should support streaming in Claude
passed
1.423s
Integ tests
should support vertex
passed
8.94s
Integ tests
supports tracing sync
passed
0.016s
Integ tests
supports tracing async
passed
2.746s
Integ tests
should work with dynamic types single
passed
1.235s
Integ tests
should work with dynamic types enum
passed
0.743s
Integ tests
should work with dynamic literals
passed
0.761s
Integ tests
should work with dynamic types class
passed
1.022s
Integ tests
should work with dynamic inputs class
passed
0.63s
Integ tests
should work with dynamic inputs list
passed
0.526s
Integ tests
should work with dynamic output map
passed
0.811s
Integ tests
should work with dynamic output union
passed
2.288s
Integ tests
should work with nested classes
failed
0.12s
Error: BamlError: BamlClientError: Something went wrong with the LLM client: reqwest::Error { kind: Request, url: Url { scheme: "http", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("localhost")), port: Some(11434), path: "/v1/chat/completions", query: None, fragment: None }, source: hyper_util::client::legacy::Error(Connect, ConnectError("tcp connect error", Os { code: 111, kind: ConnectionRefused, message: "Connection refused" })) }
-    at BamlStream.parsed [as getFinalResponse] (/workspaces/baml/engine/language_client_typescript/stream.js:58:39)
+

Test Report

Started: 2024-11-11 15:23:46
Suites (1)
0 passed
1 failed
0 pending
Tests (64)
63 passed
1 failed
0 pending
Integ tests > should work for all inputs
single bool
passed
0.687s
Integ tests > should work for all inputs
single string list
passed
0.483s
Integ tests > should work for all inputs
return literal union
passed
0.416s
Integ tests > should work for all inputs
single class
passed
0.445s
Integ tests > should work for all inputs
multiple classes
passed
0.69s
Integ tests > should work for all inputs
single enum list
passed
0.389s
Integ tests > should work for all inputs
single float
passed
0.436s
Integ tests > should work for all inputs
single int
passed
0.612s
Integ tests > should work for all inputs
single literal int
passed
0.352s
Integ tests > should work for all inputs
single literal bool
passed
0.352s
Integ tests > should work for all inputs
single literal string
passed
0.43s
Integ tests > should work for all inputs
single class with literal prop
passed
0.81s
Integ tests > should work for all inputs
single class with literal union prop
passed
0.551s
Integ tests > should work for all inputs
single optional string
passed
0.38s
Integ tests > should work for all inputs
single map string to string
passed
0.774s
Integ tests > should work for all inputs
single map string to class
passed
0.948s
Integ tests > should work for all inputs
single map string to map
passed
0.656s
Integ tests
should work for all outputs
passed
4.797s
Integ tests
works with retries1
passed
1.059s
Integ tests
works with retries2
passed
2.064s
Integ tests
works with fallbacks
passed
1.607s
Integ tests
should work with image from url
passed
1.075s
Integ tests
should work with image from base 64
passed
1.103s
Integ tests
should work with audio base 64
passed
0.802s
Integ tests
should work with audio from url
passed
4.315s
Integ tests
should support streaming in OpenAI
passed
3.357s
Integ tests
should support streaming in Gemini
passed
10.198s
Integ tests
should support AWS
passed
4.281s
Integ tests
should support streaming in AWS
failed
1.621s
Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "AwsBedrock", model: Some("anthropic.claude-3-5-sonnet-20240620-v1:0"), prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about Dr. Pepper")] }]), request_options: {"api_key": String("")}, start_time: SystemTime { tv_sec: 1731360271, tv_nsec: 598100000 }, latency: 1.61346525s, message: "ServiceError(\n    ServiceError {\n        source: ThrottlingException(\n            ThrottlingException {\n                message: Some(\n                    \"Too many requests, please wait before trying again.\",\n                ),\n                meta: ErrorMetadata {\n                    code: Some(\n                        \"ThrottlingException\",\n                    ),\n                    message: Some(\n                        \"Too many requests, please wait before trying again.\",\n                    ),\n                    extras: Some(\n                        {\n                            \"aws_request_id\": \"94e852da-1f5a-4dd2-80d1-a5603ddf6d75\",\n                        },\n                    ),\n                },\n            },\n        ),\n        raw: Response {\n            status: StatusCode(\n                429,\n            ),\n            headers: Headers {\n                headers: {\n                    \"date\": HeaderValue {\n                        _private: H0(\n                            \"Mon, 11 Nov 2024 21:24:33 GMT\",\n                        ),\n                    },\n                    \"content-type\": HeaderValue {\n                        _private: H0(\n                            \"application/json\",\n                        ),\n                    },\n                    \"content-length\": HeaderValue {\n                        _private: H0(\n                            \"65\",\n                        ),\n                    },\n                    \"x-amzn-requestid\": HeaderValue {\n                        _private: H0(\n                            \"94e852da-1f5a-4dd2-80d1-a5603ddf6d75\",\n                        ),\n                    },\n                    \"x-amzn-errortype\": HeaderValue {\n                        _private: H0(\n                            \"ThrottlingException:http://internal.amazon.com/coral/com.amazon.bedrock/\",\n                        ),\n                    },\n                },\n            },\n            body: SdkBody {\n                inner: Once(\n                    Some(\n                        b\"{\\\"message\\\":\\\"Too many requests, please wait before trying again.\\\"}\",\n                    ),\n                ),\n                retryable: true,\n            },\n            extensions: Extensions {\n                extensions_02x: Extensions,\n                extensions_1x: Extensions,\n            },\n        },\n    },\n)", code: RateLimited }
+    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:274:19)
Integ tests
should allow overriding the region
passed
0.005s
Integ tests
should support OpenAI shorthand
passed
10.32s
Integ tests
should support OpenAI shorthand streaming
passed
10.353s
Integ tests
should support anthropic shorthand
passed
2.65s
Integ tests
should support anthropic shorthand streaming
passed
2.642s
Integ tests
should support streaming without iterating
passed
2.552s
Integ tests
should support streaming in Claude
passed
1.014s
Integ tests
should support vertex
passed
10.081s
Integ tests
supports tracing sync
passed
0.009s
Integ tests
supports tracing async
passed
2.162s
Integ tests
should work with dynamic types single
passed
0.966s
Integ tests
should work with dynamic types enum
passed
0.759s
Integ tests
should work with dynamic literals
passed
0.896s
Integ tests
should work with dynamic types class
passed
0.858s
Integ tests
should work with dynamic inputs class
passed
0.528s
Integ tests
should work with dynamic inputs list
passed
0.768s
Integ tests
should work with dynamic output map
passed
1.016s
Integ tests
should work with dynamic output union
passed
2.143s
Integ tests
should work with nested classes
passed
1.952s
Integ tests
should work with dynamic client
passed
0.413s
Integ tests
should work with 'onLogEvent'
passed
1.881s
Integ tests
should work with a sync client
passed
0.673s
Integ tests
should raise an error when appropriate
passed
0.747s
Integ tests
should raise a BAMLValidationError
passed
0.573s
Integ tests
should reset environment variables correctly
passed
1.21s
Integ tests
should use aliases when serializing input objects - classes
passed
0.958s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.794s
Integ tests
should use aliases when serializing input objects - enums
passed
0.337s
Integ tests
should use aliases when serializing input objects - lists
passed
0.45s
Integ tests
constraints: should handle checks in return types
passed
0.699s
Integ tests
constraints: should handle checks in returned unions
passed
0.879s
Integ tests
constraints: should handle block-level checks
passed
0.636s
Integ tests
constraints: should handle nested-block-level checks
passed
0.599s
Integ tests
simple recursive type
passed
2.395s
Integ tests
mutually recursive type
passed
2.263s
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:47: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:53:15)
got response key
+true
+52
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:176: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: 1731360242, tv_nsec: 596785000 }, latency: 165.278666ms, 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:2710:18)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:173:7) {
+  code: 'GenericFailure'
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:185: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: 1731360244, tv_nsec: 672557000 }, latency: 178.301292ms, 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:2735:18)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:182:7) {
+  code: 'GenericFailure'
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:344:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:83:38)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:81:22)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:353: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:347:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:83:38)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:81:22)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:353: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:350:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:83:38)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:81:22)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:353: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:365:15)
     at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:540:9)
-    at processTimers (node:internal/timers:514:7)
-    at Object.<anonymous> (/workspaces/baml/integ-tests/typescript/tests/integ-tests.test.ts:584:19)
Integ tests
should work with dynamic client
passed
0.672s
Integ tests
should work with 'onLogEvent'
passed
2.038s
Integ tests
should work with a sync client
passed
0.54s
Integ tests
should raise an error when appropriate
passed
1.007s
Integ tests
should raise a BAMLValidationError
passed
0.466s
Integ tests
should reset environment variables correctly
passed
1.647s
Integ tests
should use aliases when serializing input objects - classes
passed
0.952s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.86s
Integ tests
should use aliases when serializing input objects - enums
passed
0.485s
Integ tests
should use aliases when serializing input objects - lists
passed
0.499s
Integ tests
constraints: should handle checks in return types
passed
0.744s
Integ tests
constraints: should handle checks in returned unions
passed
1.321s
Integ tests
constraints: should handle block-level checks
passed
0.739s
Integ tests
constraints: should handle nested-block-level checks
passed
0.705s
Integ tests
simple recursive type
passed
1.221s
Integ tests
mutually recursive type
passed
2.435s
\ No newline at end of file + at listOnTimeout (node:internal/timers:538:9) + at processTimers (node:internal/timers:512:7) + at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38 + at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13 + at async Promise.all (index 0) + at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22) + at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38 + at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13 + at async Promise.all (index 0) + at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:376:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:5)
dummy hi1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:376:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:5)
dummy hi2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:376:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:5)
dummy hi3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:390:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:44)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:28)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:406:5)
hello world
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:376: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:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:395:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:17)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:395:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:17)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:395:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:17)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:376:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:395:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:17)
dummy secondDummyFuncArg
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:403:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:17)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:403:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:17)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:403:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:17)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:376:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:403:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:17)
dummy thirdDummyFuncArg
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:409:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:44)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:28)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:415:5)
hello world
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:419: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:443: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:512: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:514: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:514: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:522:13)
final  {
+  hair_color: 'black',
+  attributes: { height: '6 feet', eye_color: 'blue', facial_hair: 'beard' }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:546: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:548: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:548: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:548: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:556: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:567:13)
final  {
+  hair_color: 'black',
+  attributes: { eye_color: 'blue', facial_hair: 'beard', age: '30' },
+  height: { meters: 1.8 }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: '', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: 'value', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580: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:580:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:580:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:605:15)
+    at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:70:17)
onLogEvent {
+  metadata: {
+    eventId: 'fb9e29fa-78ec-42f1-9030-fa5b1008d31c',
+    rootEventId: 'fb9e29fa-78ec-42f1-9030-fa5b1008d31c'
+  },
+  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-11-11T21:25:25.641Z'
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:605:15)
+    at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:70:17)
onLogEvent {
+  metadata: {
+    eventId: 'a00f3238-afe3-4707-b679-fb6d5fbec4ad',
+    rootEventId: 'a00f3238-afe3-4707-b679-fb6d5fbec4ad'
+  },
+  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-11-11T21:25:26.143Z'
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:639:15)
Error: Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "MyClient", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Given a string, extract info using the schema:\n\nMy name is Harrison. My hair is black and I'm 6 feet tall.\n\nAnswer in JSON using this schema:\n{\n}")] }]), request_options: {"model": String("gpt-4o-mini")}, start_time: SystemTime { tv_sec: 1731360327, tv_nsec: 999678000 }, latency: 150.208542ms, message: "Request failed: {\n    \"error\": {\n        \"message\": \"Incorrect API key provided: INVALID_KEY. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+    at BamlAsyncClient.parsed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:1485:18)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:636:7) {
+  code: 'GenericFailure'
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:647:17)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:643:5)
BamlValidationError: BamlValidationError: Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
+  - <root>: Missing required field: nonce
+  - <root>: Missing required field: nonce2
+    at Function.from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:33:28)
+    at from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:58:32)
+    at BamlAsyncClient.DummyOutputFunction (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:537:50)
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:645:9
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:643:5) {
+  prompt: '[\x1B[2mchat\x1B[0m] \x1B[43msystem: \x1B[0mSay "hello there".\n',
+  raw_output: 'Hello there! How can I assist you today?'
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:659:17)
error BamlValidationError: BamlValidationError: Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
+  - <root>: Missing required field: nonce
+  - <root>: Missing required field: nonce2
+    at Function.from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:33:28)
+    at from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:58:32)
+    at BamlAsyncClient.DummyOutputFunction (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:537:50)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:655:7) {
+  prompt: '[\x1B[2mchat\x1B[0m] \x1B[43msystem: \x1B[0mSay "hello there".\n',
+  raw_output: 'Hello there! How can I help you today?'
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:759:13)
{"nbc":{"value":{"foo":1,"bar":"hello"},"checks":{"cross_field":{"name":"cross_field","expression":"this.bar|length > this.foo","status":"succeeded"}}}}
\ No newline at end of file diff --git a/integ-tests/typescript/tests/integ-tests.test.ts b/integ-tests/typescript/tests/integ-tests.test.ts index efd3b7cec..c6ae77512 100644 --- a/integ-tests/typescript/tests/integ-tests.test.ts +++ b/integ-tests/typescript/tests/integ-tests.test.ts @@ -704,50 +704,6 @@ describe('Integ tests', () => { expect(people.length).toBeGreaterThan(0) }) - it('should handle non-terminal finish reason', async () => { - const cr = new ClientRegistry() - cr.addLlmClient('MyClient', 'openai', { model: 'gpt-4o-mini', max_tokens: 1, finish_reason_allowlist: ['stop'] }) - cr.setPrimary('MyClient') - - try { - await b.TestCaching('Tell me a story about food!', "fiction", { - clientRegistry: cr, - }) - fail('Expected BamlValidationError to be thrown') - } catch (error: any) { - if (error instanceof BamlValidationError) { - console.log('Exception message:', error) - expect(error.message).toContain('Non-terminal finish reason') - } else { - fail('Expected error to be an instance of BamlValidationError') - } - } - }) - - it('should handle non-terminal finish reason in streaming', async () => { - const cr = new ClientRegistry() - cr.addLlmClient('MyClient', 'openai', { model: 'gpt-4o-mini', max_tokens: 1, finish_reason_allowlist: ['stop'] }) - cr.setPrimary('MyClient') - - try { - const stream = b.stream.TestCaching('Tell me a story about food!', "fiction", { - clientRegistry: cr, - }) - for await (const msg of stream) { - console.log('streamed', msg) - } - await stream.getFinalResponse() - fail('Expected BamlValidationError to be thrown') - } catch (error: any) { - if (error instanceof BamlValidationError) { - console.log('Exception message:', error) - expect(error.message).toContain('Non-terminal finish reason') - } else { - fail('Expected error to be an instance of BamlValidationError') - } - } - }); - it('should use aliases when serializing input objects - classes', async () => { const res = await b.AliasedInputClass({ key: 'hello', key2: 'world' }) expect(res).toContain('color') @@ -914,7 +870,6 @@ describe('Integ tests', () => { }, }) }) -}) afterAll(async () => { flush() diff --git a/tools/versions/engine.cfg b/tools/versions/engine.cfg index c4d42f58a..e4afd4768 100644 --- a/tools/versions/engine.cfg +++ b/tools/versions/engine.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.67.0 +current_version = 0.68.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 34a52998d..404ecfae7 100644 --- a/tools/versions/integ-tests.cfg +++ b/tools/versions/integ-tests.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.67.0 +current_version = 0.68.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 fd5c233de..f649dfd17 100644 --- a/tools/versions/python.cfg +++ b/tools/versions/python.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.67.0 +current_version = 0.68.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 f3865972b..718decc9d 100644 --- a/tools/versions/ruby.cfg +++ b/tools/versions/ruby.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.67.0 +current_version = 0.68.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 7b16b2bf1..a668780da 100644 --- a/tools/versions/typescript.cfg +++ b/tools/versions/typescript.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.67.0 +current_version = 0.68.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 d81286081..08d3fad12 100644 --- a/tools/versions/vscode.cfg +++ b/tools/versions/vscode.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.67.0 +current_version = 0.68.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 4d0f27c6c..56a74b7c3 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.67.0", + "version": "0.68.0", "publisher": "Boundary", "repository": "https://github.com/BoundaryML/baml", "homepage": "https://www.boundaryml.com",