From ad742ba33238370057f49df361f017341cafb4a4 Mon Sep 17 00:00:00 2001 From: Vaibhav Gupta Date: Tue, 3 Dec 2024 22:33:47 -0800 Subject: [PATCH] Run integ tests for 0.70.0 --- integ-tests/python/baml_client/inlinedbaml.py | 2 +- integ-tests/python/report.html | 3432 ++--------------- integ-tests/ruby/baml_client/inlined.rb | 2 +- .../typescript/baml_client/inlinedbaml.ts | 2 +- integ-tests/typescript/test-report.html | 1243 +++++- 5 files changed, 1592 insertions(+), 3089 deletions(-) diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py index 77e075a28..408a0a73e 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.69.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.69.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.69.0\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.69.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.70.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.0\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.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 836cd8432..8839053a9 100644 --- a/integ-tests/python/report.html +++ b/integ-tests/python/report.html @@ -3,1468 +3,82 @@
Test Report

Summary

100
2 failed 98 passed

Tests

tests/test_functions.py 295 0:03:17.317594

PASSED test_env_vars_reset 0:00:01.619202

Setup

Call

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

Summary

100
1 failed 99 passed

Tests

tests/test_functions.py 196 0:03:06.912160

PASSED test_env_vars_reset 0:00:01.598847

Setup

Call

Captured stdout call
Context depth is greater than 0!
 Except but ending trace!
 Context depth is greater than 0!
-
Captured stderr call
[2024-11-26T16:55:45Z WARN  baml_events] Function ExtractPeople:
-    Client: GPT4 (<unknown>) - 164ms
-    ---PROMPT---
-    [chat] system: You are an expert extraction algorithm. Only extract relevant information from the text. If you do not know the value of an attribute asked to extract, return null for the attribute's value.
-    
-    Answer with a JSON Array using this schema:
-    [
-      {
-        name: string or null,
-        hair_color: 'RED' or 'BLUE' or 'GREEN' or 'YELLOW' or 'BLACK' or 'WHITE' or null,
-      }
-    ]
-    user: My name is Harrison. My hair is black and I'm 6 feet tall. I'm pretty good around the hoop.
-    
-    ---REQUEST OPTIONS---
-    model: "gpt-4o"
-    ---ERROR (InvalidAuthentication (401))---
-    Request failed: https://api.openai.com/v1/chat/completions
-    {
-        "error": {
-            "message": "Incorrect API key provided: sk-12345*7890. You can find your API key at https://platform.openai.com/account/api-keys.",
-            "type": "invalid_request_error",
-            "param": null,
-            "code": "invalid_api_key"
-        }
-    }
-    
-[2024-11-26T16:55:46Z INFO  baml_events] Function ExtractPeople:
-    Client: GPT4 (gpt-4o-2024-08-06) - 1058ms. 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.
-    
-    Answer with a JSON Array using this schema:
-    [
-      {
-        name: string or null,
-        hair_color: 'RED' or 'BLUE' or 'GREEN' or 'YELLOW' or 'BLACK' or 'WHITE' or null,
-      }
-    ]
-    user: My name is Harrison. My hair is black and I'm 6 feet tall. I'm pretty good around the hoop.
-    
-    ---LLM REPLY---
-    [
-      {
-        "name": "Harrison",
-        "hair_color": "BLACK"
-      }
-    ]
-    ---Parsed Response (list<class Person>)---
-    [
-      {
-        "name": "Harrison",
-        "hair_color": "BLACK"
-      }
-    ]
-

Teardown

PASSED test_sync 0:00:00.365498

Setup

Call

Captured stdout call
got response key
+

Teardown

PASSED test_sync 0:00:00.447907

Setup

Call

Captured stdout call
got response key
 true
 52
-
Captured stderr call
[2024-11-26T16:55:46Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 363ms. StopReason: stop. Tokens(in/out): 19/5
-    ---PROMPT---
-    [chat] user: Print these values back to me:
-    key
-    true
-    52
-    
-    ---LLM REPLY---
-    key
-    true
-    52
-    ---Parsed Response (string)---
-    "key\ntrue\n52"
-

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.871252

Setup

Call

Captured stderr call
[2024-11-26T16:55:47Z INFO  baml_events] Function TestFnNamedArgsSingleBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 869ms. StopReason: stop. Tokens(in/out): 15/1
-    ---PROMPT---
-    [chat] user: Return this value back to me: true
-    
-    ---LLM REPLY---
-    true
-    ---Parsed Response (string)---
-    "true"
-

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.402276

Setup

Call

Captured stderr call
[2024-11-26T16:55:48Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 399ms. StopReason: stop. Tokens(in/out): 23/9
-    ---PROMPT---
-    [chat] user: Return this value back to me: ["a", "b", "c"]
+

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.306592

Setup

Call

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.506679

Setup

Call

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.289915

Setup

Call

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.624947

Setup

Call

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.728360

Setup

Call

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.453278

Setup

Call

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001295

Setup

Call

Captured stderr call
[2024-12-04T06:30:44Z ERROR baml_runtime::tracing]   Error: a: Failed to evaluate assert: Error evaluating constraint: unknown method: object has no method named length (in <string>:1)
     
-    ---LLM REPLY---
-    ["a", "b", "c"]
-    ---Parsed Response (string)---
-    "[\"a\", \"b\", \"c\"]"
-

Teardown

FAILED TestAllInputs::test_return_literal_union 0:00:00.504889

baml_py.internal_monkeypatch.BamlValidationError: BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: : Failed to find any (1 | true | "string output") in 3 items
-  - : Expected 1, got Object([("response", Boolean(true))]).
-  - : Expected true, got Object([("response", Boolean(true))]).
-  - : Expected "string output", got Object([("response", Boolean(true))])., raw_output={
-  "response": true
-}, prompt=[chat] user: Return one of these values: 
-Answer in JSON using any of these schemas:
-1 or true or "string output"
-)

Setup

Call

self = 
+

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.368634

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.445836

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.344927

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.427340

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.354604

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.471760

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.776402

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.512772

Setup

Call

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:00.372423

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.702836

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.460990

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.568221

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.384364

Setup

Call

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:00.750769

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.649376

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:00.499413

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:05.532121

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.750962

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:02.252015

Setup

Call

Teardown

PASSED test_should_work_with_vertex 0:00:08.748015

Setup

Call

Teardown

PASSED test_should_work_with_image_base64 0:00:01.301831

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.151316

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.193011

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:02.273093

Setup

Call

Captured stdout call
Expected error LLM call failed: LLMErrorResponse { client: "RetryClientExponential", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1733293876, tv_nsec: 974347000 }, latency: 171.149125ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+

Teardown

PASSED test_works_with_fallbacks 0:00:01.816097

Setup

Call

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.033483

Setup

Call

Teardown

PASSED test_claude 0:00:00.972559

Setup

Call

Teardown

PASSED test_gemini 0:00:09.202791

Setup

Call

Captured stdout call
LLM output from Gemini: Mildred adjusted her cat-eye glasses, squinting at the neon sign flickering above the dusty gas station. "Dr. Pepper," it buzzed, half the letters burnt out. "You sure this is the place, Earl?"
 
->   ???
+Earl, a portly beagle mix, snuffled at the cracked asphalt. "Positive. This is where the legend sleeps."
 
-tests/test_functions.py:115: 
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+Mildred, a renowned historian specializing in the obscure and forgotten, patted her companion's head. They were on the trail of the fabled Dr. Pepper, not the sugary drink, but the man rumored to have invented it. Legend claimed he vanished decades ago, leaving behind whispers and a single, cryptic message: "The answer lies where the bubbles dance."
 
-self = 
-input = 'a', baml_options = {}
+The gas station attendant, a teenager with a bored expression and a name tag that read "Scooter," shrugged when Mildred inquired about Dr. Pepper. "Never heard of him. This place has been abandoned for years."
 
-    async def LiteralUnionsTest(
-        self,
-        input: str,
-        baml_options: BamlCallOptions = {},
-    ) -> Union[Literal[1], Literal[True], Literal["string output"]]:
-      __tb__ = baml_options.get("tb", None)
-      if __tb__ is not None:
-        tb = __tb__._tb # type: ignore (we know how to use this private attribute)
-      else:
-        tb = None
-      __cr__ = baml_options.get("client_registry", None)
-    
-      raw = await self.__runtime.call_function(
-        "LiteralUnionsTest",
-        {
-          "input": input,
-        },
-        self.__ctx_manager.get(),
-        tb,
-        __cr__,
-      )
->     return cast(Union[Literal[1], Literal[True], Literal["string output"]], raw.cast_to(types, types))
-E     baml_py.internal_monkeypatch.BamlValidationError: BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: : Failed to find any (1 | true | "string output") in 3 items
-E       - : Expected 1, got Object([("response", Boolean(true))]).
-E       - : Expected true, got Object([("response", Boolean(true))]).
-E       - : Expected "string output", got Object([("response", Boolean(true))])., raw_output={
-E       "response": true
-E     }, prompt=[chat] user: Return one of these values: 
-E     Answer in JSON using any of these schemas:
-E     1 or true or "string output"
-E     )
+Undeterred, Mildred explored the dusty aisles. Earl, sniffing at a forgotten bag of chips, suddenly barked. He pawed at a loose floorboard, revealing a hidden compartment. Inside, nestled amongst cobwebs and faded newspaper clippings, lay a leather-bound journal.
 
-baml_client/async_client.py:1408: BamlValidationError
Captured stderr call
[2024-11-26T16:55:48Z WARN  baml_events] Function LiteralUnionsTest:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 502ms. StopReason: stop. Tokens(in/out): 31/8
-    ---PROMPT---
-    [chat] user: Return one of these values: 
-    Answer in JSON using any of these schemas:
-    1 or true or "string output"
-    
-    ---LLM REPLY---
-    {
-      "response": true
-    }
-    ---Parsed Response (Error)---
-    Failed to coerce value: <root>: Failed to find any (1 | true | "string output") in 3 items
-      - <root>: Expected 1, got Object([("response", Boolean(true))]).
-      - <root>: Expected true, got Object([("response", Boolean(true))]).
-      - <root>: Expected "string output", got Object([("response", Boolean(true))]).
-

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.690783

Setup

Call

Captured stderr call
[2024-11-26T16:55:49Z INFO  baml_events] Function PredictAge:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 683ms. StopReason: stop. Tokens(in/out): 116/36
-    ---PROMPT---
-    [chat] user: Using your understanding of the historical popularity
-    of names, predict the age of a person with the name
-    Greg in years. Also predict their genus and
-    species. It's Homo sapiens (with exactly that spelling
-    and capitalization). I'll give you a hint: If the name
-    is "Greg", his age is 41.
-    
-    Answer in JSON using this schema:
-    {
-      planetary_age: {
-        age: int,
-      } or {
-        age: int,
-      },
-      certainty: int,
-      species: string,
-    }
-    
-    ---LLM REPLY---
-    {
-      "planetary_age": {
-        "age": 41
-      },
-      "certainty": 95,
-      "species": "Homo sapiens"
-    }
-    ---Parsed Response (class FooAny)---
-    {
-      "planetary_age": {
-        "age": {
-          "value": 41,
-          "checks": {
-            "young_enough": {
-              "name": "young_enough",
-              "expression": "this < 30",
-              "status": "failed"
-            }
-          }
-        }
-      },
-      "certainty": {
-        "value": 95,
-        "checks": {
-          "unreasonably_certain": {
-            "name": "unreasonably_certain",
-            "expression": "this == 102931",
-            "status": "failed"
-          }
-        }
-      },
-      "species": {
-        "value": "Homo sapiens",
-        "checks": {
-          "trivial": {
-            "name": "trivial",
-            "expression": "this == \"Homo sapiens\"",
-            "status": "succeeded"
-          },
-          "regex_good": {
-            "name": "regex_good",
-            "expression": "this|regex_match(\"Homo\")",
-            "status": "succeeded"
-          },
-          "regex_bad": {
-            "name": "regex_bad",
-            "expression": "this|regex_match(\"neanderthalensis\")",
-            "status": "failed"
-          }
-        }
-      }
-    }
-

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.771390

Setup

Call

Captured stderr call
[2024-11-26T16:55:50Z INFO  baml_events] Function ExtractContactInfo:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 761ms. StopReason: stop. Tokens(in/out): 98/35
-    ---PROMPT---
-    [chat] user: Extract a primary contact info, and if possible a secondary contact
-    info, from this document:
-    
-    Reach me at help@boundaryml.com, or 111-222-3333 if needed.
-    
-    Answer in JSON using this schema:
-    {
-      primary: {
-        value: string,
-      } or {
-        value: string,
-      },
-      secondary: {
-        value: string,
-      } or {
-        value: string,
-      } or null,
-    }
-    
-    ---LLM REPLY---
-    {
-      primary: {
-        value: "help@boundaryml.com"
-      },
-      secondary: {
-        value: "111-222-3333"
-      }
-    }
-    ---Parsed Response (class ContactInfo)---
-    {
-      "primary": {
-        "value": "help@boundaryml.com"
-      },
-      "secondary": {
-        "value": "111-222-3333"
-      }
-    }
-

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.919024

Setup

Call

Captured stderr call
[2024-11-26T16:55:50Z WARN  baml_events] Function ReturnMalformedConstraints:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 916ms. StopReason: stop. Tokens(in/out): 28/9
-    ---PROMPT---
-    [chat] user: Return the integer after 1
-    
-    Answer in JSON using this schema:
-    {
-      foo: int,
-    }
-    
-    ---LLM REPLY---
-    {
-      "foo": 2
-    }
-    ---Parsed Response (Error)---
-    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.001280

Setup

Call

Captured stderr call
[2024-11-26T16:55:50Z 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.379368

Setup

Call

Captured stderr call
[2024-11-26T16:55:51Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 377ms. StopReason: stop. Tokens(in/out): 19/5
-    ---PROMPT---
-    [chat] user: Print these values back to me:
-    key
-    true
-    52
-    
-    ---LLM REPLY---
-    key
-    true
-    52
-    ---Parsed Response (string)---
-    "key\ntrue\n52"
-

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.464965

Setup

Call

Captured stderr call
[2024-11-26T16:55:51Z INFO  baml_events] Function TestMulticlassNamedArgs:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 462ms. StopReason: stop. Tokens(in/out): 25/11
-    ---PROMPT---
-    [chat] user: Print these values back to me:
-    key
-    true
-    52
-    key
-    true
-    64
-    
-    ---LLM REPLY---
-    key
-    true
-    52
-    key
-    true
-    64
-    ---Parsed Response (string)---
-    "key\ntrue\n52\nkey\ntrue\n64"
-

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.606994

Setup

Call

Captured stderr call
[2024-11-26T16:55:52Z INFO  baml_events] Function TestFnNamedArgsSingleEnumList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 605ms. StopReason: stop. Tokens(in/out): 18/4
-    ---PROMPT---
-    [chat] user: Print these values back to me:
-    ["TWO"]
-    
-    ---LLM REPLY---
-    ["TWO"]
-    ---Parsed Response (string)---
-    "[\"TWO\"]"
-

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.317750

Setup

Call

Captured stderr call
[2024-11-26T16:55:52Z INFO  baml_events] Function TestFnNamedArgsSingleFloat:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 315ms. StopReason: stop. Tokens(in/out): 18/3
-    ---PROMPT---
-    [chat] user: Return this value back to me: 3.12
-    
-    ---LLM REPLY---
-    3.12
-    ---Parsed Response (string)---
-    "3.12"
-

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.462908

Setup

Call

Captured stderr call
[2024-11-26T16:55:53Z INFO  baml_events] Function TestFnNamedArgsSingleInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 461ms. StopReason: stop. Tokens(in/out): 17/2
-    ---PROMPT---
-    [chat] user: Return this value back to me: 3566
-    
-    ---LLM REPLY---
-    3566
-    ---Parsed Response (string)---
-    "3566"
-

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.420210

Setup

Call

Captured stderr call
[2024-11-26T16:55:53Z INFO  baml_events] Function TestNamedArgsLiteralInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 418ms. StopReason: stop. Tokens(in/out): 16/1
-    ---PROMPT---
-    [chat] user: Return this value back to me: 1
-    
-    ---LLM REPLY---
-    1
-    ---Parsed Response (string)---
-    "1"
-

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.303175

Setup

Call

Captured stderr call
[2024-11-26T16:55:53Z INFO  baml_events] Function TestNamedArgsLiteralBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 299ms. StopReason: stop. Tokens(in/out): 15/1
-    ---PROMPT---
-    [chat] user: Return this value back to me: true
-    
-    ---LLM REPLY---
-    true
-    ---Parsed Response (string)---
-    "true"
-

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.314409

Setup

Call

Captured stderr call
[2024-11-26T16:55:54Z INFO  baml_events] Function TestNamedArgsLiteralString:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 312ms. StopReason: stop. Tokens(in/out): 16/2
-    ---PROMPT---
-    [chat] user: Return this value back to me: My String
-    
-    ---LLM REPLY---
-    My String
-    ---Parsed Response (string)---
-    "My String"
-

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:00.720734

Setup

Call

Captured stderr call
[2024-11-26T16:55:54Z INFO  baml_events] Function FnLiteralClassInputOutput:
-    Client: GPT4 (gpt-4o-2024-08-06) - 717ms. StopReason: stop. Tokens(in/out): 30/13
-    ---PROMPT---
-    [chat] user: Return the same object you were given.
-    Answer in JSON using this schema:
-    {
-      prop: "hello",
-    }
-    
-    ---LLM REPLY---
-    ```json
-    {
-      "prop": "hello"
-    }
-    ```
-    ---Parsed Response (class LiteralClassHello)---
-    {
-      "prop": "hello"
-    }
-

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:01.320595

Setup

Call

Captured stderr call
[2024-11-26T16:55:56Z INFO  baml_events] Function FnLiteralUnionClassInputOutput:
-    Client: GPT4 (gpt-4o-2024-08-06) - 1316ms. StopReason: stop. Tokens(in/out): 49/13
-    ---PROMPT---
-    [chat] user: Return the same object you were given.
-    Answer in JSON using any of these schemas:
-    {
-      prop: "one",
-    } or {
-      prop: "two",
-    }{
-        "prop": "one",
-    }
-    
-    ---LLM REPLY---
-    ```json
-    {
-      "prop": "one"
-    }
-    ```
-    ---Parsed Response (class LiteralClassOne)---
-    {
-      "prop": "one"
-    }
-

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:03.919335

Setup

Call

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

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.526154

Setup

Call

Captured stderr call
[2024-11-26T16:56:00Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 522ms. StopReason: stop. Tokens(in/out): 28/14
-    ---PROMPT---
-    [chat] user: Return this value back to me: {"lorem": {
-        "word": "ipsum",
-    }}
-    
-    ---LLM REPLY---
-    {"lorem": {
-        "word": "ipsum",
-    }}
-    ---Parsed Response (map<string, class StringToClassEntry>)---
-    {
-      "lorem": {
-        "word": "ipsum"
-      }
-    }
-

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.520990

Setup

Call

Captured stderr call
[2024-11-26T16:56:01Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToMap:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 518ms. StopReason: stop. Tokens(in/out): 25/11
-    ---PROMPT---
-    [chat] user: Return this value back to me: {"lorem": {"word": "ipsum"}}
-    
-    ---LLM REPLY---
-    {"lorem": {"word": "ipsum"}}
-    ---Parsed Response (map<string, map<string, string>>)---
-    {
-      "lorem": {
-        "word": "ipsum"
-      }
-    }
-

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:00.674149

Setup

Call

Captured stderr call
[2024-11-26T16:56:01Z INFO  baml_events] Function InOutEnumMapKey:
-    Client: openai/gpt-4o (gpt-4o-2024-08-06) - 670ms. StopReason: stop. Tokens(in/out): 43/20
-    ---PROMPT---
-    [chat] user: Merge these: {"A": "A"} {"B": "B"}
-    
-    Answer in JSON using this schema:
-    map<'A' or 'B' or 'C', string>
-    
-    ---LLM REPLY---
-    ```json
-    {
-        "A": "A",
-        "B": "B"
-    }
-    ```
-    ---Parsed Response (map<string, string>)---
-    {
-      "A": "A",
-      "B": "B"
-    }
-

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.905860

Setup

Call

Captured stderr call
[2024-11-26T16:56:02Z INFO  baml_events] Function InOutLiteralStringUnionMapKey:
-    Client: openai/gpt-4o (gpt-4o-2024-08-06) - 901ms. StopReason: stop. Tokens(in/out): 48/20
-    ---PROMPT---
-    [chat] user: Merge these:
-    
-    {"one": "1"}
-    
-    {"two": "2"}
-    
-    Answer in JSON using this schema:
-    map<"one" or "two" or "three" or "four", string>
-    
-    ---LLM REPLY---
-    ```json
-    {
-      "one": "1",
-      "two": "2"
-    }
-    ```
-    ---Parsed Response (map<string, string>)---
-    {
-      "one": "1",
-      "two": "2"
-    }
-

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:00.855693

Setup

Call

Captured stderr call
[2024-11-26T16:56:03Z INFO  baml_events] Function InOutSingleLiteralStringMapKey:
-    Client: openai/gpt-4o (gpt-4o-2024-08-06) - 852ms. StopReason: stop. Tokens(in/out): 35/10
-    ---PROMPT---
-    [chat] user: Return the same map you were given:
-    
-    {"key": "1"}
-    
-    Answer in JSON using this schema:
-    map<"key", string>
-    
-    ---LLM REPLY---
-    ```json
-    {"key": "1"}
-    ```
-    ---Parsed Response (map<string, string>)---
-    {
-      "key": "1"
-    }
-

Teardown

PASSED test_should_work_for_all_outputs 0:00:04.958059

Setup

Call

Captured stderr call
[2024-11-26T16:56:04Z INFO  baml_events] Function FnOutputBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 329ms. StopReason: stop. Tokens(in/out): 15/1
-    ---PROMPT---
-    [chat] user: Return a true: Answer as a bool
-    
-    ---LLM REPLY---
-    True
-    ---Parsed Response (bool)---
-    true
-[2024-11-26T16:56:04Z INFO  baml_events] Function FnOutputInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 499ms. StopReason: stop. Tokens(in/out): 17/1
-    ---PROMPT---
-    [chat] user: Return the integer 5 with no additional context.
-    
-    ---LLM REPLY---
-    5
-    ---Parsed Response (int)---
-    5
-[2024-11-26T16:56:04Z INFO  baml_events] Function FnOutputLiteralInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 399ms. StopReason: stop. Tokens(in/out): 18/7
-    ---PROMPT---
-    [chat] user: Return an integer: Answer using this specific value:
-    5
-    
-    ---LLM REPLY---
-    The integer would be: 5
-    ---Parsed Response (int)---
-    5
-[2024-11-26T16:56:05Z INFO  baml_events] Function FnOutputLiteralBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 339ms. StopReason: stop. Tokens(in/out): 18/1
-    ---PROMPT---
-    [chat] user: Return a false: Answer using this specific value:
-    false
-    
-    ---LLM REPLY---
-    false
-    ---Parsed Response (bool)---
-    false
-[2024-11-26T16:56:05Z INFO  baml_events] Function FnOutputLiteralString:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 427ms. StopReason: stop. Tokens(in/out): 21/4
-    ---PROMPT---
-    [chat] user: Return a string: Answer using this specific value:
-    "example output"
-    
-    ---LLM REPLY---
-    "example output"
-    ---Parsed Response (string)---
-    "example output"
-[2024-11-26T16:56:06Z INFO  baml_events] Function FnOutputClassList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 797ms. StopReason: stop. Tokens(in/out): 46/63
-    ---PROMPT---
-    [chat] user: Return a JSON array that follows this schema: 
-    Answer with a JSON Array using this schema:
-    [
-      {
-        prop1: string,
-        prop2: int,
-      }
-    ]
-    
-    JSON:
-    
-    ---LLM REPLY---
-    [
-      {
-        "prop1": "Apple",
-        "prop2": 5
-      },
-      {
-        "prop1": "Banana",
-        "prop2": 3
-      },
-      {
-        "prop1": "Orange",
-        "prop2": 7
-      }
-    ]
-    ---Parsed Response (list<class TestOutputClass>)---
-    [
-      {
-        "prop1": "Apple",
-        "prop2": 5
-      },
-      {
-        "prop1": "Banana",
-        "prop2": 3
-      },
-      {
-        "prop1": "Orange",
-        "prop2": 7
-      }
-    ]
-[2024-11-26T16:56:06Z INFO  baml_events] Function FnOutputClassWithEnum:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 523ms. StopReason: stop. Tokens(in/out): 48/19
-    ---PROMPT---
-    [chat] user: Return a made up json blob that matches this schema:
-    Answer in JSON using this schema:
-    {
-      prop1: string,
-      prop2: 'ONE' or 'TWO',
-    }
-    ---
-    
-    JSON:
-    
-    ---LLM REPLY---
-    {
-      "prop1": "Hello world",
-      "prop2": "ONE"
-    }
-    ---Parsed Response (class TestClassWithEnum)---
-    {
-      "prop1": "Hello world",
-      "prop2": "ONE"
-    }
-[2024-11-26T16:56:07Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 520ms. StopReason: stop. Tokens(in/out): 50/18
-    ---PROMPT---
-    [chat] user: Return a JSON blob with this schema: 
-    Answer in JSON using this schema:
-    {
-      prop1: string,
-      prop2: int,
-    }
-    
-    For the prop2, always return a 540
-    
-    JSON:
-    
-    ---LLM REPLY---
-    {
-      "prop1": "Hello",
-      "prop2": 540
-    }
-    ---Parsed Response (class TestOutputClass)---
-    {
-      "prop1": "Hello",
-      "prop2": 540
-    }
-[2024-11-26T16:56:08Z INFO  baml_events] Function FnEnumListOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 527ms. StopReason: stop. Tokens(in/out): 51/11
-    ---PROMPT---
-    [chat] user: Print out two of these values randomly selected from the list below in a json array.
-    
-    Answer with a JSON Array using this schema:
-    [
-      'ONE' or 'TWO' or 'THREE'
-    ]
-    
-    Answer:
-    
-    ---LLM REPLY---
-    [
-      'ONE',
-      'THREE'
-    ]
-    ---Parsed Response (list<enum EnumOutput>)---
-    [
-      "ONE",
-      "THREE"
-    ]
-[2024-11-26T16:56:08Z INFO  baml_events] Function FnEnumOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 571ms. StopReason: stop. Tokens(in/out): 42/23
-    ---PROMPT---
-    [chat] user: Choose one of these values randomly. Before you give the answer, write out an unrelated haiku about the ocean.
-    
-    VALUE_ENUM
-    ----
-    - ONE
-    - TWO
-    - THREE
-    
-    ---LLM REPLY---
-    Waves crash upon shore
-    Majestic and powerful
-    Ocean's timeless roar
-    
-    Randomly chosen value: TWO
-    ---Parsed Response (enum EnumOutput)---
-    "TWO"
-

Teardown

PASSED test_should_work_with_image_url 0:00:01.227375

Setup

Call

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

Teardown

PASSED test_should_work_with_image_list 0:00:02.086553

Setup

Call

Captured stderr call
[2024-11-26T16:56:11Z INFO  baml_events] Function TestImageListInput:
-    Client: GPT4o (gpt-4o-2024-08-06) - 2084ms. StopReason: stop. Tokens(in/out): 528/7
-    ---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 have shades of green.
-    ---Parsed Response (string)---
-    "Both images have shades of green."
-

Teardown

PASSED test_should_work_with_vertex 0:00:07.674229

Setup

Call

Captured stderr call
[2024-11-26T16:56:19Z INFO  baml_events] Function TestVertex:
-    Client: Vertex () - 7671ms. StopReason: "STOP". Tokens(in/out): 8/363
-    ---PROMPT---
-    [chat] user: Write a nice short story about donkey kong
-    
-    ---LLM REPLY---
-    The last rays of sun were painting the jungle canopy in shades of orange and purple. Donkey Kong, his fur dusted with golden light, sat atop his banana hoard, a melancholic sigh escaping his chest. He missed them. The humans, with their funny clothes and even funnier habit of stealing his bananas. 
-    
-    It hadn't always been this way. Donkey Kong vividly remembered the days of chasing that plucky plumber, Mario, through elaborate barrel mazes. The thrill of the chase, the ingenuity of his traps, the frustrated yelps of the plumber – it had all been a game, a strange sort of friendship built on stolen bananas and daring escapes.
-    
-    But things had changed. Mario hadn't been seen in the jungle for years. Rumors whispered through the trees, tales of a distant princess and a world beyond the island. Donkey Kong, despite his gruff exterior, felt a pang of loneliness. 
-    
-    Suddenly, a familiar sound pierced the evening quiet. The distinctive *thump-thump-thump* of Mario's jumps. Donkey Kong's head shot up, his heart pounding like a jungle drum. Could it be?
-    
-    Emerging from the foliage, looking a little older, a little wearier, was Mario. He smiled sheepishly at Donkey Kong, holding up a single, glistening banana.
-    
-    "Brought you this one, old friend," Mario said, his voice carrying across the clearing. "Figured it was time for another game, wouldn't you say?"
-    
-    Donkey Kong roared, a sound full of joy and anticipation, and beat his chest.  He might miss the peace, but some friendships, much like stolen bananas, were just too sweet to resist.  The chase, Donkey Kong realized with a grin, was back on. 
-    
-    ---Parsed Response (string)---
-    "The last rays of sun were painting the jungle canopy in shades of orange and purple. Donkey Kong, his fur dusted with golden light, sat atop his banana hoard, a melancholic sigh escaping his chest. He missed them. The humans, with their funny clothes and even funnier habit of stealing his bananas. \n\nIt hadn't always been this way. Donkey Kong vividly remembered the days of chasing that plucky plumber, Mario, through elaborate barrel mazes. The thrill of the chase, the ingenuity of his traps, the frustrated yelps of the plumber – it had all been a game, a strange sort of friendship built on stolen bananas and daring escapes.\n\nBut things had changed. Mario hadn't been seen in the jungle for years. Rumors whispered through the trees, tales of a distant princess and a world beyond the island. Donkey Kong, despite his gruff exterior, felt a pang of loneliness. \n\nSuddenly, a familiar sound pierced the evening quiet. The distinctive *thump-thump-thump* of Mario's jumps. Donkey Kong's head shot up, his heart pounding like a jungle drum. Could it be?\n\nEmerging from the foliage, looking a little older, a little wearier, was Mario. He smiled sheepishly at Donkey Kong, holding up a single, glistening banana.\n\n\"Brought you this one, old friend,\" Mario said, his voice carrying across the clearing. \"Figured it was time for another game, wouldn't you say?\"\n\nDonkey Kong roared, a sound full of joy and anticipation, and beat his chest.  He might miss the peace, but some friendships, much like stolen bananas, were just too sweet to resist.  The chase, Donkey Kong realized with a grin, was back on. \n"
-

Teardown

PASSED test_should_work_with_image_base64 0:00:01.754712

Setup

Call

Captured stderr call
[2024-11-26T16:56:21Z INFO  baml_events] Function TestImageInput:
-    Client: GPT4o (gpt-4o-2024-08-06) - 1742ms. 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 in vest.
-    ---Parsed Response (string)---
-    "Green ogre in vest."
-

Teardown

PASSED test_should_work_with_audio_base64 0:00:00.922804

Setup

Call

Captured stderr call
[2024-11-26T16:56:22Z INFO  baml_events] Function AudioInput:
-    Client: Gemini (gemini-1.5-pro-001) - 916ms. 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>
-    
-    ---LLM REPLY---
-    Yes 
-    
-    ---Parsed Response (string)---
-    "Yes \n"
-

Teardown

PASSED test_should_work_with_audio_url 0:00:01.341258

Setup

Call

Captured stderr call
[2024-11-26T16:56:23Z INFO  baml_events] Function AudioInput:
-    Client: Gemini (gemini-1.5-pro-001) - 1090ms. 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>
-    
-    ---LLM REPLY---
-    No 
-    
-    ---Parsed Response (string)---
-    "No \n"
-

Teardown

PASSED test_works_with_retries2 0:00:02.238205

Setup

Call

Captured stdout call
Expected error LLM call failed: LLMErrorResponse { client: "RetryClientExponential", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1732640185, tv_nsec: 664748000 }, latency: 208.712417ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
-
Captured stderr call
[2024-11-26T16:56:25Z WARN  baml_events] Function TestRetryExponential:
-    (3 other previous tries)
-    Client: RetryClientExponential (<unknown>) - 208ms
-    ---PROMPT---
-    [chat] user: Say a haiku
-    
-    ---REQUEST OPTIONS---
-    model: "gpt-3.5-turbo"
-    ---ERROR (InvalidAuthentication (401))---
-    Request failed: https://api.openai.com/v1/chat/completions
-    {
-        "error": {
-            "message": "Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.",
-            "type": "invalid_request_error",
-            "param": null,
-            "code": "invalid_api_key"
-        }
-    }
-    
-

Teardown

PASSED test_works_with_fallbacks 0:00:02.096143

Setup

Call

Captured stderr call
[2024-11-26T16:56:27Z INFO  baml_events] Function TestFallbackClient:
-    (5 other previous tries)
-    Client: GPT35 (gpt-3.5-turbo-0125) - 525ms. StopReason: stop. Tokens(in/out): 14/16
-    ---PROMPT---
-    [chat] user: Say a haiku about mexico.
-    
-    ---LLM REPLY---
-    Vibrant colors bloom
-    Ancient rhythms fill the air
-    Mexico's beauty
-    ---Parsed Response (string)---
-    "Vibrant colors bloom\nAncient rhythms fill the air\nMexico's beauty"
-

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.039650

Setup

Call

Captured stderr call
[2024-11-26T16:56:28Z WARN  baml_events] Function TestSingleFallbackClient:
-    Client: FaultyAzureClient (<unknown>) - 37ms
-    ---PROMPT---
-    [chat] user: Say a haiku about mexico.
-    
-    ---REQUEST OPTIONS---
-    model: "unknown-model"
-    max_tokens: 4096
-    ---ERROR (Unspecified error code: 2)---
-    reqwest::Error { kind: Request, url: Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("unknown-resource-id.openai.azure.com")), port: None, path: "/openai/deployments/unknown-deployment-id/chat/completions", query: None, fragment: None }, source: hyper_util::client::legacy::Error(Connect, ConnectError("dns error", Custom { kind: Uncategorized, error: "failed to lookup address information: nodename nor servname provided, or not known" })) }
-

Teardown

PASSED test_claude 0:00:01.080573

Setup

Call

Captured stderr call
[2024-11-26T16:56:29Z INFO  baml_events] Function PromptTestClaude:
-    Client: Sonnet (claude-3-5-sonnet-20241022) - 1077ms. StopReason: "end_turn". Tokens(in/out): 19/31
-    ---PROMPT---
-    [chat] user: Tell me a haiku about Mt Rainier is tall
-    
-    ---LLM REPLY---
-    Here's a haiku about Mount Rainier:
-    
-    Rainier stands supreme
-    Fourteen thousand feet skyward
-    Guardian of home
-    ---Parsed Response (string)---
-    "Here's a haiku about Mount Rainier:\n\nRainier stands supreme\nFourteen thousand feet skyward\nGuardian of home"
-

Teardown

PASSED test_gemini 0:00:07.972470

Setup

Call

Captured stdout call
LLM output from Gemini: Mildred adjusted her thick glasses and peered through the dusty antique shop window.  A glint of crimson caught her eye. It was a bottle, nestled between a chipped porcelain doll and a tarnished silver hand mirror.  The glass was a deep, rich red and a faded label proclaimed, in an elegant script, "Dr. Pepper."
-
-Mildred had never been one for sugary drinks, but something about the bottle, the air of forgotten elegance, called to her. She entered the shop, the bell above the door chiming a greeting.
-
-"That old bottle?" chuckled the shopkeeper, a portly man with a handlebar mustache. "Haven't seen that one in years. Found it in my grandmother's attic. Said it belonged to a beau of hers, a real smooth talker."
+"This is it," Mildred whispered, her heart pounding.
 
-Mildred bought the bottle, intrigued by the story.  At home, she carefully washed away the years of dust. As she held it up to the light, she imagined this "beau" – a dapper young man in a straw boater hat, offering the drink to his sweetheart. 
+The journal chronicled Dr. Pepper's journey, his quest to create a drink that captured the feeling of joy, the fizz of excitement. The final entry detailed his creation, a recipe using a secret blend of 23 flavors.
 
-Later that week, Mildred was feeling unusually adventurous.  She found herself in the soda aisle of the grocery store, staring at rows of brightly colored Dr Pepper bottles.  She grabbed one, remembering the antique bottle and the story of the smooth-talking beau. 
+And then, the cryptic message: "The answer lies where the bubbles dance."
 
-The first sip was a revelation. A unique, complex flavor danced on her tongue – a hint of cherry, a touch of licorice, all wrapped in a comforting sweetness. It was unlike any soda she'd ever tasted. 
-
-From that day on, Dr Pepper became Mildred's guilty pleasure. Every sip was a trip back in time, a reminder of faded romance and hidden stories. And whenever she saw an antique shop, she couldn't help but peek inside, just in case another piece of Dr Pepper's history was waiting to be discovered. 
-
-
Captured stderr call
[2024-11-26T16:56:37Z INFO  baml_events] Function TestGemini:
-    Client: Gemini (gemini-1.5-pro-001) - 7969ms. StopReason: "STOP". Tokens(in/out): 10/393
-    ---PROMPT---
-    [chat] user: Write a nice short story about Dr. Pepper
-    
-    ---LLM REPLY---
-    Mildred adjusted her thick glasses and peered through the dusty antique shop window.  A glint of crimson caught her eye. It was a bottle, nestled between a chipped porcelain doll and a tarnished silver hand mirror.  The glass was a deep, rich red and a faded label proclaimed, in an elegant script, "Dr. Pepper."
-    
-    Mildred had never been one for sugary drinks, but something about the bottle, the air of forgotten elegance, called to her. She entered the shop, the bell above the door chiming a greeting.
-    
-    "That old bottle?" chuckled the shopkeeper, a portly man with a handlebar mustache. "Haven't seen that one in years. Found it in my grandmother's attic. Said it belonged to a beau of hers, a real smooth talker."
-    
-    Mildred bought the bottle, intrigued by the story.  At home, she carefully washed away the years of dust. As she held it up to the light, she imagined this "beau" – a dapper young man in a straw boater hat, offering the drink to his sweetheart. 
-    
-    Later that week, Mildred was feeling unusually adventurous.  She found herself in the soda aisle of the grocery store, staring at rows of brightly colored Dr Pepper bottles.  She grabbed one, remembering the antique bottle and the story of the smooth-talking beau. 
-    
-    The first sip was a revelation. A unique, complex flavor danced on her tongue – a hint of cherry, a touch of licorice, all wrapped in a comforting sweetness. It was unlike any soda she'd ever tasted. 
-    
-    From that day on, Dr Pepper became Mildred's guilty pleasure. Every sip was a trip back in time, a reminder of faded romance and hidden stories. And whenever she saw an antique shop, she couldn't help but peek inside, just in case another piece of Dr Pepper's history was waiting to be discovered. 
-    
-    ---Parsed Response (string)---
-    "Mildred adjusted her thick glasses and peered through the dusty antique shop window.  A glint of crimson caught her eye. It was a bottle, nestled between a chipped porcelain doll and a tarnished silver hand mirror.  The glass was a deep, rich red and a faded label proclaimed, in an elegant script, \"Dr. Pepper.\"\n\nMildred had never been one for sugary drinks, but something about the bottle, the air of forgotten elegance, called to her. She entered the shop, the bell above the door chiming a greeting.\n\n\"That old bottle?\" chuckled the shopkeeper, a portly man with a handlebar mustache. \"Haven't seen that one in years. Found it in my grandmother's attic. Said it belonged to a beau of hers, a real smooth talker.\"\n\nMildred bought the bottle, intrigued by the story.  At home, she carefully washed away the years of dust. As she held it up to the light, she imagined this \"beau\" – a dapper young man in a straw boater hat, offering the drink to his sweetheart. \n\nLater that week, Mildred was feeling unusually adventurous.  She found herself in the soda aisle of the grocery store, staring at rows of brightly colored Dr Pepper bottles.  She grabbed one, remembering the antique bottle and the story of the smooth-talking beau. \n\nThe first sip was a revelation. A unique, complex flavor danced on her tongue – a hint of cherry, a touch of licorice, all wrapped in a comforting sweetness. It was unlike any soda she'd ever tasted. \n\nFrom that day on, Dr Pepper became Mildred's guilty pleasure. Every sip was a trip back in time, a reminder of faded romance and hidden stories. And whenever she saw an antique shop, she couldn't help but peek inside, just in case another piece of Dr Pepper's history was waiting to be discovered. \n"
-

Teardown

PASSED test_gemini_streaming 0:00:07.885364

Setup

Call

Captured stdout call
LLM output from Gemini: Mildred wasn't like the other sodas. Coca-Cola was boisterous, always the center of attention. Sprite was bubbly and carefree. Root Beer was smooth and charming. But Mildred, or Dr. Pepper as she preferred, was an enigma. A complex symphony of 23 flavors, she was spicy and sweet, familiar yet surprising. 
+Mildred reread the line, then looked up. Through the dusty window, the setting sun cast an orange glow on a forgotten soda fountain. The bubbles in the forgotten syrup bottles danced in the light.
 
-She sat on the top shelf of the corner store cooler, watching the world go by. People rarely chose her. They’d reach for the familiar comfort of a Coke or the lightheartedness of a Sprite.  
+With trembling hands, Mildred mixed the ingredients from the recipe, adding a final touch - a sprinkle of sunset-colored dust collected from the windowsill. She took a sip, the 23 flavors bursting on her tongue. It tasted of forgotten dreams and joyous memories, a symphony of sweetness and light.
 
-One day, a young woman with bright eyes and a hesitant smile stood before the cooler. Her gaze darted over the colorful cans, landing on Dr. Pepper. 
+Earl barked in agreement, lapping at a spilled drop. The legend wasn't about a drink, Mildred realized, but about capturing a feeling. And Dr. Pepper, the man, had bottled pure happiness. 
 
-“Hmm,” she murmured, “Never tried this one.” 
-
-She pulled Dr. Pepper from the shelf. 
-
-“You look interesting,” the woman said, popping the tab. 
-
-Dr. Pepper braced herself. Would she be too much? Too different? 
-
-The woman took a long sip, her eyes widening. 
-
-“Wow,” she breathed, “You’re amazing! You’re like… a party in my mouth!” 
-
-A warm feeling spread through Dr. Pepper's aluminum shell. For the first time, she felt seen, appreciated for the unique blend of flavors she was. 
-
-From that day on, the woman became a regular, always choosing Dr. Pepper.  And slowly, others started to follow.  They were intrigued by the woman's enjoyment, by the mystery of the 23 flavors. 
-
-Dr. Pepper learned that being different wasn't a bad thing. It was her unique blend, her complexity, that made her special. She didn't need to be like the other sodas. She was Dr. Pepper, and that was more than enough.  She was the perfect choice for those looking for something different, something more. 
-
-
Captured stderr call
[2024-11-26T16:56:44Z INFO  baml_events] Function TestGemini:
-    Client: Gemini (gemini-1.5-pro-001) - 7879ms. StopReason: Stop. Tokens(in/out): unknown/unknown
-    ---PROMPT---
-    [chat] user: Write a nice short story about Dr. Pepper
-    
-    ---LLM REPLY---
-    Mildred wasn't like the other sodas. Coca-Cola was boisterous, always the center of attention. Sprite was bubbly and carefree. Root Beer was smooth and charming. But Mildred, or Dr. Pepper as she preferred, was an enigma. A complex symphony of 23 flavors, she was spicy and sweet, familiar yet surprising. 
-    
-    She sat on the top shelf of the corner store cooler, watching the world go by. People rarely chose her. They’d reach for the familiar comfort of a Coke or the lightheartedness of a Sprite.  
-    
-    One day, a young woman with bright eyes and a hesitant smile stood before the cooler. Her gaze darted over the colorful cans, landing on Dr. Pepper. 
-    
-    “Hmm,” she murmured, “Never tried this one.” 
-    
-    She pulled Dr. Pepper from the shelf. 
-    
-    “You look interesting,” the woman said, popping the tab. 
-    
-    Dr. Pepper braced herself. Would she be too much? Too different? 
-    
-    The woman took a long sip, her eyes widening. 
-    
-    “Wow,” she breathed, “You’re amazing! You’re like… a party in my mouth!” 
-    
-    A warm feeling spread through Dr. Pepper's aluminum shell. For the first time, she felt seen, appreciated for the unique blend of flavors she was. 
-    
-    From that day on, the woman became a regular, always choosing Dr. Pepper.  And slowly, others started to follow.  They were intrigued by the woman's enjoyment, by the mystery of the 23 flavors. 
-    
-    Dr. Pepper learned that being different wasn't a bad thing. It was her unique blend, her complexity, that made her special. She didn't need to be like the other sodas. She was Dr. Pepper, and that was more than enough.  She was the perfect choice for those looking for something different, something more. 
-    
-    ---Parsed Response (string)---
-    "Mildred wasn't like the other sodas. Coca-Cola was boisterous, always the center of attention. Sprite was bubbly and carefree. Root Beer was smooth and charming. But Mildred, or Dr. Pepper as she preferred, was an enigma. A complex symphony of 23 flavors, she was spicy and sweet, familiar yet surprising. \n\nShe sat on the top shelf of the corner store cooler, watching the world go by. People rarely chose her. They’d reach for the familiar comfort of a Coke or the lightheartedness of a Sprite.  \n\nOne day, a young woman with bright eyes and a hesitant smile stood before the cooler. Her gaze darted over the colorful cans, landing on Dr. Pepper. \n\n“Hmm,” she murmured, “Never tried this one.” \n\nShe pulled Dr. Pepper from the shelf. \n\n“You look interesting,” the woman said, popping the tab. \n\nDr. Pepper braced herself. Would she be too much? Too different? \n\nThe woman took a long sip, her eyes widening. \n\n“Wow,” she breathed, “You’re amazing! You’re like… a party in my mouth!” \n\nA warm feeling spread through Dr. Pepper's aluminum shell. For the first time, she felt seen, appreciated for the unique blend of flavors she was. \n\nFrom that day on, the woman became a regular, always choosing Dr. Pepper.  And slowly, others started to follow.  They were intrigued by the woman's enjoyment, by the mystery of the 23 flavors. \n\nDr. Pepper learned that being different wasn't a bad thing. It was her unique blend, her complexity, that made her special. She didn't need to be like the other sodas. She was Dr. Pepper, and that was more than enough.  She was the perfect choice for those looking for something different, something more. \n"
-

Teardown

PASSED test_aws 0:00:01.895384

Setup

Call

Captured stderr call
[2024-11-26T16:56:44Z 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-26T16:56:46Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (meta.llama3-8b-instruct-v1:0) - 1725ms. StopReason: max_tokens. Tokens(in/out): 25/100
-    ---PROMPT---
-    [chat] user: Write a nice short story about Mt Rainier is tall
-    
-    ---LLM REPLY---
-    
-    
-    The sun was setting over the Puget Sound, casting a warm orange glow over the landscape. Emma stood at the base of Mt. Rainier, her eyes fixed on the towering peak above her. She had always been fascinated by the mountain's grandeur, and today she had finally made the journey to see it up close.
-    
-    As she gazed up at the mountain, Emma felt a sense of awe wash over her. Mt. Rainier was indeed a behemoth, its peak reaching for
-    ---Parsed Response (string)---
-    "\n\nThe sun was setting over the Puget Sound, casting a warm orange glow over the landscape. Emma stood at the base of Mt. Rainier, her eyes fixed on the towering peak above her. She had always been fascinated by the mountain's grandeur, and today she had finally made the journey to see it up close.\n\nAs she gazed up at the mountain, Emma felt a sense of awe wash over her. Mt. Rainier was indeed a behemoth, its peak reaching for"
-

Teardown

PASSED test_openai_shorthand 0:00:08.915584

Setup

Call

Captured stderr call
[2024-11-26T16:56:55Z INFO  baml_events] Function TestOpenAIShorthand:
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 8912ms. StopReason: stop. Tokens(in/out): 18/608
-    ---PROMPT---
-    [chat] user: Write a nice short story about Mt Rainier is tall
-    
-    ---LLM REPLY---
-    Once upon a time in the Pacific Northwest, there was a mountain named Rainier. Towering majestically at 14,411 feet, Mt. Rainier was not just a mountain; it was a sentinel watching over the lush forests, sparkling rivers, and vibrant meadows below. With its snow-capped peak glistening under the sun, it stood as a symbol of strength and beauty.
-    
-    In a small village at the foot of this grand giant, lived a curious girl named Elara. From her earliest days, she would gaze up at Mt. Rainier, captivated by its towering presence. Her grandmother would often tell her stories about the mountain. “It’s not just tall, dear,” she would say, her voice a whisper of reverence. “It’s alive. It holds the memories of the earth and the whispers of the winds.”
-    
-    One early summer day, Elara decided that it was time to get a closer look. With a backpack filled with snacks, her trusty sketchbook, and a heart full of dreams, she set off toward the mountain. As she ascended, the lush forest enveloped her in a cocoon of greenery, and the air turned crisp with every step.
-    
-    The journey was filled with the sweet songs of birds and the rustling of leaves. Elara climbed higher, her legs growing weary but her spirit undaunted. Finally, as she reached a clearing, she stood before the mountain, its true magnificence unveiling itself before her. 
-    
-    Elara sat down on the grass, pulled out her sketchbook, and began to draw. As she sketched the mountain's rugged ridges and glistening glaciers, she felt an electric connection to it. In that moment, she understood that its height was not just a physical attribute; it was an embodiment of dreams, aspirations, and resilience. 
-    
-    As the sun began to set, bathing the peak in hues of gold and orange, Elara realized she hadn’t just climbed a mountain; she had found a piece of herself. With each brushstroke, she poured her heart into capturing Mt. Rainier—not just as a tall, unwavering giant, but as a source of inspiration. 
-    
-    Eventually, it was time to head home. As Elara made her way down, she turned back for one last look. The mountain stood firm, a protector of secrets and stories, its silhouette against the twilight sky a reminder of the adventures yet to come.
-    
-    From that day on, Elara returned to the mountain often, each time discovering new facets of its personality. She learned that while Mt. Rainier was tall, its real greatness lay in its ability to inspire those who looked up to it. To Elara, the mountain became more than just a piece of land; it was a companion in her journey of growth, a reminder to keep reaching for the heights, no matter how daunting they seemed. 
-    
-    And so, Mt. Rainier remained not just a mountain, but a beacon of hope for all who dared to dream.
-    ---Parsed Response (string)---
-    "Once upon a time in the Pacific Northwest, there was a mountain named Rainier. Towering majestically at 14,411 feet, Mt. Rainier was not just a mountain; it was a sentinel watching over the lush forests, sparkling rivers, and vibrant meadows below. With its snow-capped peak glistening under the sun, it stood as a symbol of strength and beauty.\n\nIn a small village at the foot of this grand giant, lived a curious girl named Elara. From her earliest days, she would gaze up at Mt. Rainier, captivated by its towering presence. Her grandmother would often tell her stories about the mountain. “It’s not just tall, dear,” she would say, her voice a whisper of reverence. “It’s alive. It holds the memories of the earth and the whispers of the winds.”\n\nOne early summer day, Elara decided that it was time to get a closer look. With a backpack filled with snacks, her trusty sketchbook, and a heart full of dreams, she set off toward the mountain. As she ascended, the lush forest enveloped her in a cocoon of greenery, and the air turned crisp with every step.\n\nThe journey was filled with the sweet songs of birds and the rustling of leaves. Elara climbed higher, her legs growing weary but her spirit undaunted. Finally, as she reached a clearing, she stood before the mountain, its true magnificence unveiling itself before her. \n\nElara sat down on the grass, pulled out her sketchbook, and began to draw. As she sketched the mountain's rugged ridges and glistening glaciers, she felt an electric connection to it. In that moment, she understood that its height was not just a physical attribute; it was an embodiment of dreams, aspirations, and resilience. \n\nAs the sun began to set, bathing the peak in hues of gold and orange, Elara realized she hadn’t just climbed a mountain; she had found a piece of herself. With each brushstroke, she poured her heart into capturing Mt. Rainier—not just as a tall, unwavering giant, but as a source of inspiration. \n\nEventually, it was time to head home. As Elara made her way down, she turned back for one last look. The mountain stood firm, a protector of secrets and stories, its silhouette against the twilight sky a reminder of the adventures yet to come.\n\nFrom that day on, Elara returned to the mountain often, each time discovering new facets of its personality. She learned that while Mt. Rainier was tall, its real greatness lay in its ability to inspire those who looked up to it. To Elara, the mountain became more than just a piece of land; it was a companion in her journey of growth, a reminder to keep reaching for the heights, no matter how daunting they seemed. \n\nAnd so, Mt. Rainier remained not just a mountain, but a beacon of hope for all who dared to dream."
-

Teardown

PASSED test_openai_shorthand_streaming 0:00:09.962984

Setup

Call

Captured stderr call
[2024-11-26T16:57:05Z INFO  baml_events] Function TestOpenAIShorthand:
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 9957ms. StopReason: stop. Tokens(in/out): 18/686
-    ---PROMPT---
-    [chat] user: Write a nice short story about Mt Rainier is tall
-    
-    ---LLM REPLY---
-    Once upon a time in the Pacific Northwest, towering majestically above the lush green valleys and serene lakes, stood Mt. Rainier. With its snow-capped peak glistening under the sun, it seemed to touch the clouds, a proud sentinel watching over the landscape below.
-    
-    In a small town nestled at the base of this magnificent mountain lived a young girl named Elara. Ever since she could remember, Mt. Rainier had been a part of her life. Its grandeur inspired her dreams, and she would often gaze up at it from her bedroom window, imagining the adventures that lay atop its lofty summit.
-    
-    One day, as Elara played in her backyard, a wise old owl perched on a branch above her. “Why do you look at the mountain with such longing?” it hooted softly.
-    
-    Elara blinked in surprise. “Oh, wise owl, I dream of climbing Mt. Rainier! I want to see the world from its peak and touch the sky.”
-    
-    The owl fluffed its feathers, thoughtful. “A noble dream, young one. But the journey to the top is not an easy one. It requires bravery, knowledge, and respect for the mountain’s might.”
-    
-    Determined, Elara spent the following months learning everything she could about climbing. She read books, watched tutorials, and trained her body to become stronger. Each day, she looked up at the mountain, feeling its call echoing within her heart.
-    
-    Finally, the day came when she felt ready to embark on her adventure. With her backpack filled with supplies and her spirit high, Elara began her ascent. The trail twisted and turned, leading her through vibrant wildflower meadows and dense forests filled with the songs of chirping birds.
-    
-    As she climbed higher, she encountered challenges that tested her resolve—steep slopes, rocky paths, and sudden weather changes. But with each obstacle, Elara remembered the owl’s words, summoning her courage and determination. She forged ahead, fueled by her dream.
-    
-    After hours of climbing, she reached a glacial overlook—a breathtaking vista that left her speechless. Below, the world stretched out like a canvas, painted with lakes, rivers, and forests. The peaks of other mountains appeared like guardians, all bowing to the greatness of Mt. Rainier.
-    
-    With renewed vigor, Elara continued her journey, finally reaching the summit just as the sun began to set. The view was unlike anything she had ever imagined. The clouds danced below her, and the horizon was awash in golds, pinks, and deep blues. For a moment, she felt as if she were floating in the sky, her heart soaring with the eagles.
-    
-    Standing at the top, Elara whispered her thanks to the mountain. “You are so tall, so grand,” she said, “but you have shown me that with courage and perseverance, I can reach great heights too.”
-    
-    As the stars began to twinkle above, Elara knew that Mt. Rainier would always hold a special place in her heart, not just as a towering mountain but as a reminder that dreams can be reached with hard work, bravery, and a little bit of magic.
-    
-    And from that day forward, she often returned to the mountain, not just to climb but to sit at its base, listening to the whispers of the wind and sharing her dreams with the towering giant that had inspired them all.
-    ---Parsed Response (string)---
-    "Once upon a time in the Pacific Northwest, towering majestically above the lush green valleys and serene lakes, stood Mt. Rainier. With its snow-capped peak glistening under the sun, it seemed to touch the clouds, a proud sentinel watching over the landscape below.\n\nIn a small town nestled at the base of this magnificent mountain lived a young girl named Elara. Ever since she could remember, Mt. Rainier had been a part of her life. Its grandeur inspired her dreams, and she would often gaze up at it from her bedroom window, imagining the adventures that lay atop its lofty summit.\n\nOne day, as Elara played in her backyard, a wise old owl perched on a branch above her. “Why do you look at the mountain with such longing?” it hooted softly.\n\nElara blinked in surprise. “Oh, wise owl, I dream of climbing Mt. Rainier! I want to see the world from its peak and touch the sky.”\n\nThe owl fluffed its feathers, thoughtful. “A noble dream, young one. But the journey to the top is not an easy one. It requires bravery, knowledge, and respect for the mountain’s might.”\n\nDetermined, Elara spent the following months learning everything she could about climbing. She read books, watched tutorials, and trained her body to become stronger. Each day, she looked up at the mountain, feeling its call echoing within her heart.\n\nFinally, the day came when she felt ready to embark on her adventure. With her backpack filled with supplies and her spirit high, Elara began her ascent. The trail twisted and turned, leading her through vibrant wildflower meadows and dense forests filled with the songs of chirping birds.\n\nAs she climbed higher, she encountered challenges that tested her resolve—steep slopes, rocky paths, and sudden weather changes. But with each obstacle, Elara remembered the owl’s words, summoning her courage and determination. She forged ahead, fueled by her dream.\n\nAfter hours of climbing, she reached a glacial overlook—a breathtaking vista that left her speechless. Below, the world stretched out like a canvas, painted with lakes, rivers, and forests. The peaks of other mountains appeared like guardians, all bowing to the greatness of Mt. Rainier.\n\nWith renewed vigor, Elara continued her journey, finally reaching the summit just as the sun began to set. The view was unlike anything she had ever imagined. The clouds danced below her, and the horizon was awash in golds, pinks, and deep blues. For a moment, she felt as if she were floating in the sky, her heart soaring with the eagles.\n\nStanding at the top, Elara whispered her thanks to the mountain. “You are so tall, so grand,” she said, “but you have shown me that with courage and perseverance, I can reach great heights too.”\n\nAs the stars began to twinkle above, Elara knew that Mt. Rainier would always hold a special place in her heart, not just as a towering mountain but as a reminder that dreams can be reached with hard work, bravery, and a little bit of magic.\n\nAnd from that day forward, she often returned to the mountain, not just to climb but to sit at its base, listening to the whispers of the wind and sharing her dreams with the towering giant that had inspired them all."
-

Teardown

PASSED test_anthropic_shorthand 0:00:03.961095

Setup

Call

Captured stderr call
[2024-11-26T16:57:09Z INFO  baml_events] Function TestAnthropicShorthand:
-    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3957ms. StopReason: "end_turn". Tokens(in/out): 19/518
-    ---PROMPT---
-    [chat] user: Write a nice short story about Mt Rainier is tall
-    
-    ---LLM REPLY---
-    Here is a short story about the majestic Mount Rainier:
-    
-    Towering high above the lush green forests and sparkling blue waters of the Pacific Northwest, Mount Rainier stood as a grand sentinel, its snow-capped peak piercing the cloudless azure sky. For generations, the indigenous peoples who called this land home had revered the colossal mountain, seeing it as a symbol of their connection to the natural world.
-    
-    As the morning sun peeked over the distant horizon, its golden rays danced across the glaciers that clung to Rainier's flanks, casting a warm glow upon the surrounding landscape. The crisp, clean air was filled with the sounds of birdsong and the gentle rustling of the evergreen trees. 
-    
-    John, a seasoned hiker, gazed up at the mountain with a sense of awe and wonder. He had climbed Rainier many times before, but each journey held a new adventure, a deeper appreciation for the sheer scale and power of this natural wonder. As he prepared his gear, he felt a familiar stirring of excitement, knowing that the challenge that lay ahead would test his physical and mental fortitude.
-    
-    Setting out on the trail, John's footsteps crunched on the rocky path, his eyes drawn repeatedly to the towering silhouette that loomed ever larger as he gained elevation. The hike was arduous, with steep switchbacks and sections that required careful navigation over snow and ice, but John relished the challenge, fueled by the breathtaking vistas that unfolded before him.
-    
-    Finally, after hours of determined effort, John reached the summit, standing in triumph atop the majestic peak. He gazed out over the patchwork of forests, lakes, and distant mountain ranges, a profound sense of humility and awe washing over him. In this moment, he felt truly connected to the primal power of the natural world, and he knew that the memory of this incredible journey would forever be etched in his heart and mind.
-    
-    As he began his descent, John couldn't help but marvel at the sheer scale and grandeur of Mount Rainier, a testament to the awe-inspiring wonders of our planet. This towering, snow-capped sentinel would continue to inspire and captivate all who crossed its path, a timeless and eternal symbol of nature's enduring beauty and majesty.
-    ---Parsed Response (string)---
-    "Here is a short story about the majestic Mount Rainier:\n\nTowering high above the lush green forests and sparkling blue waters of the Pacific Northwest, Mount Rainier stood as a grand sentinel, its snow-capped peak piercing the cloudless azure sky. For generations, the indigenous peoples who called this land home had revered the colossal mountain, seeing it as a symbol of their connection to the natural world.\n\nAs the morning sun peeked over the distant horizon, its golden rays danced across the glaciers that clung to Rainier's flanks, casting a warm glow upon the surrounding landscape. The crisp, clean air was filled with the sounds of birdsong and the gentle rustling of the evergreen trees. \n\nJohn, a seasoned hiker, gazed up at the mountain with a sense of awe and wonder. He had climbed Rainier many times before, but each journey held a new adventure, a deeper appreciation for the sheer scale and power of this natural wonder. As he prepared his gear, he felt a familiar stirring of excitement, knowing that the challenge that lay ahead would test his physical and mental fortitude.\n\nSetting out on the trail, John's footsteps crunched on the rocky path, his eyes drawn repeatedly to the towering silhouette that loomed ever larger as he gained elevation. The hike was arduous, with steep switchbacks and sections that required careful navigation over snow and ice, but John relished the challenge, fueled by the breathtaking vistas that unfolded before him.\n\nFinally, after hours of determined effort, John reached the summit, standing in triumph atop the majestic peak. He gazed out over the patchwork of forests, lakes, and distant mountain ranges, a profound sense of humility and awe washing over him. In this moment, he felt truly connected to the primal power of the natural world, and he knew that the memory of this incredible journey would forever be etched in his heart and mind.\n\nAs he began his descent, John couldn't help but marvel at the sheer scale and grandeur of Mount Rainier, a testament to the awe-inspiring wonders of our planet. This towering, snow-capped sentinel would continue to inspire and captivate all who crossed its path, a timeless and eternal symbol of nature's enduring beauty and majesty."
-

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.256320

Setup

Call

Captured stderr call
[2024-11-26T16:57:12Z INFO  baml_events] Function TestAnthropicShorthand:
-    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3248ms. StopReason: "end_turn". Tokens(in/out): 19/329
-    ---PROMPT---
-    [chat] user: Write a nice short story about Mt Rainier is tall
-    
-    ---LLM REPLY---
-    Here is a short story about Mt. Rainier:
-    
-    The Towering Titan
-    
-    Amelia gazed up in awe at the majestic mountain looming before her. Mt. Rainier stood tall and proud, its snow-capped peak piercing the clear blue sky. At over 14,000 feet, the colossal volcano was the highest point in the state of Washington, and one of the most iconic natural wonders of the Pacific Northwest.
-    
-    As Amelia hiked closer, the sheer scale of the mountain became even more apparent. The stark, glaciated cliffs rose up dramatically, seeming to touch the heavens. Amelia felt tiny in comparison, like an ant at the base of a mighty skyscraper. 
-    
-    She couldn't help but marvel at the power and grandeur of this sleeping giant. Mt. Rainier had been building its massive form for thousands of years, slowly and steadily carving its place on the landscape. Despite its tremendous size, the mountain had a quiet, almost serene presence - an ancient, slumbering titan watching over the land.
-    
-    As Amelia continued her hike, she felt a profound sense of wonder and respect for this natural wonder. Mt. Rainier was a testament to the raw, untamed beauty of the Pacific Northwest, a stunning monument that inspired awe in all who laid eyes upon it. In its towering presence, Amelia felt small, yet humbled - reminded of the awesome power and majesty of the natural world.
-    ---Parsed Response (string)---
-    "Here is a short story about Mt. Rainier:\n\nThe Towering Titan\n\nAmelia gazed up in awe at the majestic mountain looming before her. Mt. Rainier stood tall and proud, its snow-capped peak piercing the clear blue sky. At over 14,000 feet, the colossal volcano was the highest point in the state of Washington, and one of the most iconic natural wonders of the Pacific Northwest.\n\nAs Amelia hiked closer, the sheer scale of the mountain became even more apparent. The stark, glaciated cliffs rose up dramatically, seeming to touch the heavens. Amelia felt tiny in comparison, like an ant at the base of a mighty skyscraper. \n\nShe couldn't help but marvel at the power and grandeur of this sleeping giant. Mt. Rainier had been building its massive form for thousands of years, slowly and steadily carving its place on the landscape. Despite its tremendous size, the mountain had a quiet, almost serene presence - an ancient, slumbering titan watching over the land.\n\nAs Amelia continued her hike, she felt a profound sense of wonder and respect for this natural wonder. Mt. Rainier was a testament to the raw, untamed beauty of the Pacific Northwest, a stunning monument that inspired awe in all who laid eyes upon it. In its towering presence, Amelia felt small, yet humbled - reminded of the awesome power and majesty of the natural world."
-

Teardown

PASSED test_fallback_to_shorthand 0:00:01.385621

Setup

Call

Captured stderr call
[2024-11-26T16:57:14Z INFO  baml_events] Function TestFallbackToShorthand:
-    (1 other previous tries)
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 1082ms. StopReason: stop. Tokens(in/out): 18/18
-    ---PROMPT---
-    [chat] user: Say a haiku about Mt Rainier is tall.
-    
-    ---LLM REPLY---
-    Majestic and proud,  
-    Mt. Rainier kisses sky,  
-    Silent sentinel.  
-    ---Parsed Response (string)---
-    "Majestic and proud,  \nMt. Rainier kisses sky,  \nSilent sentinel.  "
-

Teardown

PASSED test_aws_streaming 0:00:01.487517

Setup

Call

Captured stderr call
[2024-11-26T16:57:14Z 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-26T16:57:15Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (meta.llama3-8b-instruct-v1:0) - 1483ms. StopReason: unknown. Tokens(in/out): 25/100
-    ---PROMPT---
-    [chat] user: Write a nice short story about Mt Rainier is tall
-    
-    ---LLM REPLY---
-    
-    
-    The sun was setting over the Puget Sound, casting a warm orange glow over the landscape. The air was crisp and clean, filled with the scent of wildflowers and the distant hint of saltwater. In the distance, the majestic peak of Mt. Rainier rose high into the sky, its snow-capped summit glistening like a beacon.
-    
-    Lena, a young girl with a mop of curly brown hair, stood at the edge of the meadow, her eyes fixed on the mountain
-    ---Parsed Response (string)---
-    "\n\nThe sun was setting over the Puget Sound, casting a warm orange glow over the landscape. The air was crisp and clean, filled with the scent of wildflowers and the distant hint of saltwater. In the distance, the majestic peak of Mt. Rainier rose high into the sky, its snow-capped summit glistening like a beacon.\n\nLena, a young girl with a mop of curly brown hair, stood at the edge of the meadow, her eyes fixed on the mountain"
-

Teardown

PASSED test_streaming 0:00:02.723649

Setup

Call

Captured stderr call
[2024-11-26T16:57:18Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 2719ms. StopReason: stop. Tokens(in/out): 19/235
-    ---PROMPT---
-    [chat] user: Tell me a short story about Programming languages are fun to create
-    
-    ---LLM REPLY---
-    Once upon a time, in a world where coding was the key to unlocking endless possibilities, a group of brilliant minds came together to create their own programming language. They spent countless hours brainstorming, coding, and testing to bring their vision to life.
-    
-    As they worked tirelessly, they found joy in the process of creating something entirely new. Each line of code was like a stroke of paint on a canvas, shaping their language into a masterpiece of logic and precision.
-    
-    They incorporated elements from different languages, adding unique features and functionalities that set their creation apart from the rest. And with every bug they fixed and every improvement they made, their excitement grew.
-    
-    Finally, after months of hard work, their programming language was ready to be unleashed into the world. Developers from far and wide were eager to try it out, and they marveled at its simplicity, flexibility, and power.
-    
-    The creators beamed with pride as they watched others use their language to build incredible projects, knowing that they had made a lasting impact on the world of coding. And as they continued to innovate and improve their creation, they knew that the journey of creating programming languages would always be a fun and fulfilling one.
-    ---Parsed Response (string)---
-    "Once upon a time, in a world where coding was the key to unlocking endless possibilities, a group of brilliant minds came together to create their own programming language. They spent countless hours brainstorming, coding, and testing to bring their vision to life.\n\nAs they worked tirelessly, they found joy in the process of creating something entirely new. Each line of code was like a stroke of paint on a canvas, shaping their language into a masterpiece of logic and precision.\n\nThey incorporated elements from different languages, adding unique features and functionalities that set their creation apart from the rest. And with every bug they fixed and every improvement they made, their excitement grew.\n\nFinally, after months of hard work, their programming language was ready to be unleashed into the world. Developers from far and wide were eager to try it out, and they marveled at its simplicity, flexibility, and power.\n\nThe creators beamed with pride as they watched others use their language to build incredible projects, knowing that they had made a lasting impact on the world of coding. And as they continued to innovate and improve their creation, they knew that the journey of creating programming languages would always be a fun and fulfilling one."
-

Teardown

PASSED test_streaming_uniterated 0:00:02.067288

Setup

Call

Captured stderr call
[2024-11-26T16:57:20Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 2063ms. StopReason: stop. Tokens(in/out): 19/209
-    ---PROMPT---
-    [chat] user: Tell me a short story about The color blue makes me sad
-    
-    ---LLM REPLY---
-    Once there was a girl named Sarah who had always loved the color blue. She thought it was the prettiest and most calming color in the world. She surrounded herself with blue clothes, blue decorations, and even painted her room blue.
-    
-    But one day, something changed. Sarah experienced a great loss and from that moment on, whenever she looked at the color blue, she felt a deep sadness in her heart. It reminded her of the pain and loneliness she felt after losing someone she loved.
-    
-    No matter how hard she tried, Sarah couldn't shake the feeling of sadness that the color blue brought to her. It no longer brought her the same joy and peace that it once did.
-    
-    Despite the sadness, Sarah learned to embrace her emotions and use them to inspire her art. She painted beautiful, emotional pieces that captured the feeling of sadness and loss that the color blue evoked in her.
-    
-    And though the color blue still made her sad, Sarah found solace in expressing her emotions through her art, turning her pain into something beautiful and meaningful.
-    ---Parsed Response (string)---
-    "Once there was a girl named Sarah who had always loved the color blue. She thought it was the prettiest and most calming color in the world. She surrounded herself with blue clothes, blue decorations, and even painted her room blue.\n\nBut one day, something changed. Sarah experienced a great loss and from that moment on, whenever she looked at the color blue, she felt a deep sadness in her heart. It reminded her of the pain and loneliness she felt after losing someone she loved.\n\nNo matter how hard she tried, Sarah couldn't shake the feeling of sadness that the color blue brought to her. It no longer brought her the same joy and peace that it once did.\n\nDespite the sadness, Sarah learned to embrace her emotions and use them to inspire her art. She painted beautiful, emotional pieces that captured the feeling of sadness and loss that the color blue evoked in her.\n\nAnd though the color blue still made her sad, Sarah found solace in expressing her emotions through her art, turning her pain into something beautiful and meaningful."
-

Teardown

PASSED test_streaming_sync 0:00:02.550689

Setup

Call

Captured stderr call
[2024-11-26T16:57:23Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 2548ms. StopReason: stop. Tokens(in/out): 19/248
-    ---PROMPT---
-    [chat] user: Tell me a short story about Programming languages are fun to create
-    
-    ---LLM REPLY---
-    Once upon a time, in a world where technology reigned supreme, a group of passionate programmers came together to create their own unique programming language. They spent countless hours brainstorming, writing code, and debugging until finally, their creation came to life.
-    
-    They named it CodeX, and it was unlike any other programming language the world had ever seen. It was sleek, efficient, and user-friendly, making it a joy to work with. Programmers from all over the world quickly took notice, and soon, CodeX became the language of choice for developers everywhere.
-    
-    As more and more people began using CodeX, its creators felt a sense of pride and accomplishment. They had created something truly special, something that brought joy and excitement to all who used it. And as they continued to update and improve CodeX, the language only became more fun and innovative.
-    
-    In the end, the creators of CodeX realized that programming languages weren't just tools for writing code – they were works of art, creations to be cherished and enjoyed. And as they looked out at the world of technology they had helped shape, they knew that their love for programming languages would never waver. For creating languages, after all, was the most fun of all.
-    ---Parsed Response (string)---
-    "Once upon a time, in a world where technology reigned supreme, a group of passionate programmers came together to create their own unique programming language. They spent countless hours brainstorming, writing code, and debugging until finally, their creation came to life.\n\nThey named it CodeX, and it was unlike any other programming language the world had ever seen. It was sleek, efficient, and user-friendly, making it a joy to work with. Programmers from all over the world quickly took notice, and soon, CodeX became the language of choice for developers everywhere.\n\nAs more and more people began using CodeX, its creators felt a sense of pride and accomplishment. They had created something truly special, something that brought joy and excitement to all who used it. And as they continued to update and improve CodeX, the language only became more fun and innovative.\n\nIn the end, the creators of CodeX realized that programming languages weren't just tools for writing code – they were works of art, creations to be cherished and enjoyed. And as they looked out at the world of technology they had helped shape, they knew that their love for programming languages would never waver. For creating languages, after all, was the most fun of all."
-

Teardown

PASSED test_streaming_uniterated_sync 0:00:02.482999

Setup

Call

Captured stderr call
[2024-11-26T16:57:25Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 2480ms. StopReason: stop. Tokens(in/out): 19/220
-    ---PROMPT---
-    [chat] user: Tell me a short story about The color blue makes me sad
-    
-    ---LLM REPLY---
-    Once there was a girl named Sadie who believed that the color blue made her feel sad. Whenever she saw the color blue, whether it be in the sky, on a piece of clothing, or in a painting, a wave of melancholy washed over her.
-    
-    Sadie's friends didn't understand why the color blue affected her so deeply. They would try to cheer her up by pointing out all the beauty in the color, but Sadie couldn't shake the feeling of sadness that enveloped her.
-    
-    One day, as Sadie was walking through a park, she noticed a vibrant blue flower blooming by a bench. Instead of feeling sad, she felt a sense of peace wash over her. It was as if the color blue was comforting her instead of making her sad.
-    
-    From that moment on, Sadie started to see the color blue in a new light. She realized that even though the color blue may be associated with sadness, it could also bring moments of beauty, tranquility, and comfort. Sadie learned to embrace the color blue, and it no longer made her feel sad.
-    ---Parsed Response (string)---
-    "Once there was a girl named Sadie who believed that the color blue made her feel sad. Whenever she saw the color blue, whether it be in the sky, on a piece of clothing, or in a painting, a wave of melancholy washed over her.\n\nSadie's friends didn't understand why the color blue affected her so deeply. They would try to cheer her up by pointing out all the beauty in the color, but Sadie couldn't shake the feeling of sadness that enveloped her.\n\nOne day, as Sadie was walking through a park, she noticed a vibrant blue flower blooming by a bench. Instead of feeling sad, she felt a sense of peace wash over her. It was as if the color blue was comforting her instead of making her sad.\n\nFrom that moment on, Sadie started to see the color blue in a new light. She realized that even though the color blue may be associated with sadness, it could also bring moments of beauty, tranquility, and comfort. Sadie learned to embrace the color blue, and it no longer made her feel sad."
-

Teardown

PASSED test_streaming_claude 0:00:01.335350

Setup

Call

Captured stdout call
msgs:
+

Teardown

PASSED test_gemini_streaming 0:00:01.480657

Setup

Call

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

Teardown

PASSED test_aws 0:00:01.698838

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:07.257032

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:12.582135

Setup

Call

Teardown

PASSED test_anthropic_shorthand 0:00:02.904237

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:02.755303

Setup

Call

Teardown

PASSED test_fallback_to_shorthand 0:00:01.038533

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:01.456936

Setup

Call

Teardown

PASSED test_streaming 0:00:02.959838

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:02.410336

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:02.568135

Setup

Call

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

Teardown

PASSED test_streaming_uniterated_sync 0:00:02.717052

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:00.978513

Setup

Call

Captured stdout call
msgs:
 Here's a haiku about Mt. Rainier:
 
-Rainier stands proud, high
-Guardian of Puget Sound
-Snow crown touches sky
+Rainier stands alone
+Fourteen thousand feet skyward
+Guardian of clouds
 final:
 Here's a haiku about Mt. Rainier:
 
-Rainier stands proud, high
-Guardian of Puget Sound
-Snow crown touches sky
-
Captured stderr call
[2024-11-26T16:57:26Z INFO  baml_events] Function PromptTestClaude:
-    Client: Sonnet (claude-3-5-sonnet-20241022) - 1315ms. StopReason: "end_turn". Tokens(in/out): 19/35
-    ---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
-    Guardian of Puget Sound
-    Snow crown touches sky
-    ---Parsed Response (string)---
-    "Here's a haiku about Mt. Rainier:\n\nRainier stands proud, high\nGuardian of Puget Sound\nSnow crown touches sky"
-

Teardown

PASSED test_streaming_gemini 0:00:09.462676

Setup

Call

Captured stdout call
msgs:
-Dottie, a woman of routine, sat on her usual park bench, unwrapping her usual lunch: peanut butter and banana sandwich, a handful of almonds, and a can of Dr. Pepper.  Not the diet kind, mind you.  Dottie believed firmly in enjoying the little things in life. 
-
-As she popped the tab, the familiar fizz sang its happy song. It was a sound she'd known since childhood, a sound that always made her think of her grandfather. He used to say, "Dr. Pepper, Dottie, it's not just a drink, it's an experience. 23 flavors of pure joy!" 
+Rainier stands alone
+Fourteen thousand feet skyward
+Guardian of clouds
+

Teardown

PASSED test_streaming_gemini 0:00:08.033064

Setup

Call

Captured stdout call
msgs:
+Dottie Mae clutched her lukewarm Dr Pepper, the condensation forming a sticky ring on the porch swing. A symphony of cicadas played in the muggy summer air. It was her Pawpaw's favorite drink, and even though he'd been gone a year, she still couldn't bring herself to buy the diet kind he'd switched to in his later years. 
 
-A young boy, no older than five, stopped in front of her, mesmerized by the bubbles fizzing over the rim of the can. "What's that?" he asked, eyes wide with wonder. 
+She popped the top, the familiar fizz a comforting sound. Pawpaw always said Dr Pepper tasted like summer evenings and fireflies. Back then, Dottie Mae thought it tasted too grown-up, preferring the sickly sweetness of store-brand grape soda. Now, the unique blend of flavors – cherry, licorice, maybe even a hint of  that grape she used to love – brought a wave of bittersweet nostalgia. 
 
-"This, my dear boy," Dottie said with a wink, "is a Dr. Pepper." She took a sip, savoring the sweet, unique flavor.
+Pawpaw had a knack for making the ordinary extraordinary. He'd spin tales of how the 23 flavors in Dr Pepper represented the 23 adventures a person should have in their life. Each sip, he’d say, was a reminder to live life to the fullest. He'd even convinced her it could cure anything from hiccups to heartache. 
 
-"What does it taste like?" the boy questioned, tilting his head.
+Dottie Mae took a long swig, the carbonation biting her tongue. It didn't cure her grief, not exactly, but it did bring a smile to her face. It tasted like Pawpaw, like fireflies, like those endless summer evenings that stretched on forever. 
 
-Dottie chuckled.  "Well, some say it tastes like cherry, others licorice. My grandpa swore it had a hint of amaretto." She paused. "But you know what? You have to try it to decide for yourself."
+She imagined him now, sitting beside her on the porch swing, a mischievous twinkle in his eye. "Don't you go wastin' a good Dr Pepper frownin', Dottie Mae," he'd say, his voice raspy with laughter. "Life's too short, even with 23 adventures."
 
-The boy's mother, who had just caught up, looked apologetic. "I'm sorry, he's not usually this forward."
-
-"Nonsense!" Dottie exclaimed. "Curiosity should be encouraged." She looked at the boy.  "Tell you what, why don't you have a sip?" 
-
-With his mother's hesitant nod, Dottie poured a little Dr. Pepper into the bottle cap.  The boy, eyes wide with anticipation, took a careful sip.
-
-He scrunched up his face in thought, then his expression broke into a wide, gap-toothed grin.  "It tastes...like adventure!" he declared.
-
-Dottie laughed, a warm feeling spreading through her.  Her grandfather was right. Dr. Pepper wasn't just a drink. It was a reminder that even the simplest things could hold a world of flavor, a universe of possibilities, and maybe, just maybe, a little bit of magic. 
+She took another sip, the bittersweetness comforting on her tongue. He was right, she realized. Life was too short. And maybe, just maybe, she had a few adventures left to experience.  
 
 final:
-Dottie, a woman of routine, sat on her usual park bench, unwrapping her usual lunch: peanut butter and banana sandwich, a handful of almonds, and a can of Dr. Pepper.  Not the diet kind, mind you.  Dottie believed firmly in enjoying the little things in life. 
-
-As she popped the tab, the familiar fizz sang its happy song. It was a sound she'd known since childhood, a sound that always made her think of her grandfather. He used to say, "Dr. Pepper, Dottie, it's not just a drink, it's an experience. 23 flavors of pure joy!" 
+Dottie Mae clutched her lukewarm Dr Pepper, the condensation forming a sticky ring on the porch swing. A symphony of cicadas played in the muggy summer air. It was her Pawpaw's favorite drink, and even though he'd been gone a year, she still couldn't bring herself to buy the diet kind he'd switched to in his later years. 
 
-A young boy, no older than five, stopped in front of her, mesmerized by the bubbles fizzing over the rim of the can. "What's that?" he asked, eyes wide with wonder. 
+She popped the top, the familiar fizz a comforting sound. Pawpaw always said Dr Pepper tasted like summer evenings and fireflies. Back then, Dottie Mae thought it tasted too grown-up, preferring the sickly sweetness of store-brand grape soda. Now, the unique blend of flavors – cherry, licorice, maybe even a hint of  that grape she used to love – brought a wave of bittersweet nostalgia. 
 
-"This, my dear boy," Dottie said with a wink, "is a Dr. Pepper." She took a sip, savoring the sweet, unique flavor.
+Pawpaw had a knack for making the ordinary extraordinary. He'd spin tales of how the 23 flavors in Dr Pepper represented the 23 adventures a person should have in their life. Each sip, he’d say, was a reminder to live life to the fullest. He'd even convinced her it could cure anything from hiccups to heartache. 
 
-"What does it taste like?" the boy questioned, tilting his head.
+Dottie Mae took a long swig, the carbonation biting her tongue. It didn't cure her grief, not exactly, but it did bring a smile to her face. It tasted like Pawpaw, like fireflies, like those endless summer evenings that stretched on forever. 
 
-Dottie chuckled.  "Well, some say it tastes like cherry, others licorice. My grandpa swore it had a hint of amaretto." She paused. "But you know what? You have to try it to decide for yourself."
+She imagined him now, sitting beside her on the porch swing, a mischievous twinkle in his eye. "Don't you go wastin' a good Dr Pepper frownin', Dottie Mae," he'd say, his voice raspy with laughter. "Life's too short, even with 23 adventures."
 
-The boy's mother, who had just caught up, looked apologetic. "I'm sorry, he's not usually this forward."
+She took another sip, the bittersweetness comforting on her tongue. He was right, she realized. Life was too short. And maybe, just maybe, she had a few adventures left to experience.  
 
-"Nonsense!" Dottie exclaimed. "Curiosity should be encouraged." She looked at the boy.  "Tell you what, why don't you have a sip?" 
-
-With his mother's hesitant nod, Dottie poured a little Dr. Pepper into the bottle cap.  The boy, eyes wide with anticipation, took a careful sip.
-
-He scrunched up his face in thought, then his expression broke into a wide, gap-toothed grin.  "It tastes...like adventure!" he declared.
-
-Dottie laughed, a warm feeling spreading through her.  Her grandfather was right. Dr. Pepper wasn't just a drink. It was a reminder that even the simplest things could hold a world of flavor, a universe of possibilities, and maybe, just maybe, a little bit of magic. 
-
-
Captured stderr call
[2024-11-26T16:57:36Z INFO  baml_events] Function TestGemini:
-    Client: Gemini (gemini-1.5-pro-001) - 9458ms. StopReason: Stop. Tokens(in/out): unknown/unknown
-    ---PROMPT---
-    [chat] user: Write a nice short story about Dr.Pepper
-    
-    ---LLM REPLY---
-    Dottie, a woman of routine, sat on her usual park bench, unwrapping her usual lunch: peanut butter and banana sandwich, a handful of almonds, and a can of Dr. Pepper.  Not the diet kind, mind you.  Dottie believed firmly in enjoying the little things in life. 
-    
-    As she popped the tab, the familiar fizz sang its happy song. It was a sound she'd known since childhood, a sound that always made her think of her grandfather. He used to say, "Dr. Pepper, Dottie, it's not just a drink, it's an experience. 23 flavors of pure joy!" 
-    
-    A young boy, no older than five, stopped in front of her, mesmerized by the bubbles fizzing over the rim of the can. "What's that?" he asked, eyes wide with wonder. 
-    
-    "This, my dear boy," Dottie said with a wink, "is a Dr. Pepper." She took a sip, savoring the sweet, unique flavor.
-    
-    "What does it taste like?" the boy questioned, tilting his head.
-    
-    Dottie chuckled.  "Well, some say it tastes like cherry, others licorice. My grandpa swore it had a hint of amaretto." She paused. "But you know what? You have to try it to decide for yourself."
-    
-    The boy's mother, who had just caught up, looked apologetic. "I'm sorry, he's not usually this forward."
-    
-    "Nonsense!" Dottie exclaimed. "Curiosity should be encouraged." She looked at the boy.  "Tell you what, why don't you have a sip?" 
-    
-    With his mother's hesitant nod, Dottie poured a little Dr. Pepper into the bottle cap.  The boy, eyes wide with anticipation, took a careful sip.
-    
-    He scrunched up his face in thought, then his expression broke into a wide, gap-toothed grin.  "It tastes...like adventure!" he declared.
-    
-    Dottie laughed, a warm feeling spreading through her.  Her grandfather was right. Dr. Pepper wasn't just a drink. It was a reminder that even the simplest things could hold a world of flavor, a universe of possibilities, and maybe, just maybe, a little bit of magic. 
-    
-    ---Parsed Response (string)---
-    "Dottie, a woman of routine, sat on her usual park bench, unwrapping her usual lunch: peanut butter and banana sandwich, a handful of almonds, and a can of Dr. Pepper.  Not the diet kind, mind you.  Dottie believed firmly in enjoying the little things in life. \n\nAs she popped the tab, the familiar fizz sang its happy song. It was a sound she'd known since childhood, a sound that always made her think of her grandfather. He used to say, \"Dr. Pepper, Dottie, it's not just a drink, it's an experience. 23 flavors of pure joy!\" \n\nA young boy, no older than five, stopped in front of her, mesmerized by the bubbles fizzing over the rim of the can. \"What's that?\" he asked, eyes wide with wonder. \n\n\"This, my dear boy,\" Dottie said with a wink, \"is a Dr. Pepper.\" She took a sip, savoring the sweet, unique flavor.\n\n\"What does it taste like?\" the boy questioned, tilting his head.\n\nDottie chuckled.  \"Well, some say it tastes like cherry, others licorice. My grandpa swore it had a hint of amaretto.\" She paused. \"But you know what? You have to try it to decide for yourself.\"\n\nThe boy's mother, who had just caught up, looked apologetic. \"I'm sorry, he's not usually this forward.\"\n\n\"Nonsense!\" Dottie exclaimed. \"Curiosity should be encouraged.\" She looked at the boy.  \"Tell you what, why don't you have a sip?\" \n\nWith his mother's hesitant nod, Dottie poured a little Dr. Pepper into the bottle cap.  The boy, eyes wide with anticipation, took a careful sip.\n\nHe scrunched up his face in thought, then his expression broke into a wide, gap-toothed grin.  \"It tastes...like adventure!\" he declared.\n\nDottie laughed, a warm feeling spreading through her.  Her grandfather was right. Dr. Pepper wasn't just a drink. It was a reminder that even the simplest things could hold a world of flavor, a universe of possibilities, and maybe, just maybe, a little bit of magic. \n"
-

Teardown

PASSED test_tracing_async_only 0:00:06.393127

Setup

Call

Captured stdout call
STATS TraceStats(failed=0, started=15, finalized=15, submitted=15, sent=15, done=15)
-
Captured stderr call
[2024-11-26T16:57:37Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 460ms. StopReason: stop. Tokens(in/out): 50/19
-    ---PROMPT---
-    [chat] user: Return a JSON blob with this schema: 
-    Answer in JSON using this schema:
-    {
-      prop1: string,
-      prop2: int,
-    }
-    
-    For the prop2, always return a 540
-    
-    JSON:
-    
-    ---LLM REPLY---
-    {
-      "prop1": "Hello World",
-      "prop2": 540
-    }
-    ---Parsed Response (class TestOutputClass)---
-    {
-      "prop1": "Hello World",
-      "prop2": 540
-    }
-[2024-11-26T16:57:38Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 565ms. StopReason: stop. Tokens(in/out): 50/19
-    ---PROMPT---
-    [chat] user: 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 string",
-      "prop2": 540
-    }
-    ---Parsed Response (class TestOutputClass)---
-    {
-      "prop1": "example string",
-      "prop2": 540
-    }
-[2024-11-26T16:57:39Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 563ms. StopReason: stop. Tokens(in/out): 50/18
-    ---PROMPT---
-    [chat] user: Return a JSON blob with this schema: 
-    Answer in JSON using this schema:
-    {
-      prop1: string,
-      prop2: int,
-    }
-    
-    For the prop2, always return a 540
-    
-    JSON:
-    
-    ---LLM REPLY---
-    {
-      "prop1": "Hello",
-      "prop2": 540
-    }
-    ---Parsed Response (class TestOutputClass)---
-    {
-      "prop1": "Hello",
-      "prop2": 540
-    }
-[2024-11-26T16:57:42Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 563ms. StopReason: stop. Tokens(in/out): 50/18
-    ---PROMPT---
-    [chat] user: 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
-    }
-

Teardown

PASSED test_tracing_sync 0:00:00.000293

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.456758

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.140540

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.122119

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.263676

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.690548

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

Teardown

PASSED test_dynamic_class_output 0:00:00.968772

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_tracing_async_only 0:00:05.250146

Setup

Call

Captured stdout call
STATS TraceStats(failed=0, started=15, finalized=15, submitted=15, sent=15, done=15)
+

Teardown

PASSED test_tracing_sync 0:00:00.000317

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.393780

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.048189

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.139718

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.325910

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.049657

Setup

Call

Captured stdout call
{'name': 'Harrison', 'hair_color': <Color.BLACK: 'BLACK'>, 'last_name': [], 'height': 1.83, 'hobbies': [<Hobby.SPORTS: 'SPORTS'>]}
+

Teardown

PASSED test_dynamic_class_output 0:00:00.955351

Setup

Call

Captured stdout call
[]
 {"hair_color":"black"}
-
Captured stderr call
[2024-11-26T16:58:02Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 456ms. StopReason: stop. Tokens(in/out): 49/10
-    ---PROMPT---
-    [chat] user: Given a string, extract info using the schema:
-    
-    My name is Harrison. My hair is black and I'm 6 feet tall.
-    
-    Answer in JSON using this schema:
-    {
-      hair_color: string,
-    }
-    
-    ---LLM REPLY---
-    {
-      "hair_color": "black"
-    }
-    ---Parsed Response (class DynamicOutput)---
-    {
-      "hair_color": "black"
-    }
-[2024-11-26T16:58:03Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 507ms. StopReason: stop. Tokens(in/out): 49/10
-    ---PROMPT---
-    [chat] user: Given a string, extract info using the schema:
-    
-    My name is Harrison. My hair is black and I'm 6 feet tall.
-    
-    Answer in JSON using this schema:
-    {
-      hair_color: string,
-    }
-    
-    ---LLM REPLY---
-    {
-      "hair_color": "black"
-    }
-    ---Parsed Response (class DynamicOutput)---
-    {
-      "hair_color": "black"
-    }
-

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.767708

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-26T16:58:04Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 762ms. StopReason: stop. Tokens(in/out): 117/57
-    ---PROMPT---
-    [chat] user: Given a string, extract info using the schema:
-    
-    My name is Mark Gonzalez. My hair is black and I'm 6 feet tall.
-    
-    Answer in JSON using this schema:
-    {
-      name: {
-        first_name: string,
-        last_name: string or null,
-        middle_name: string or null,
-      } or null,
-      address: {
-        street: string,
-        city: string,
-        state: string,
-        zip: string,
-      } or null,
-      hairColor: string,
-      height: float or null,
-    }
-    
-    ---LLM REPLY---
-    {
-      "name": {
-        "first_name": "Mark",
-        "last_name": "Gonzalez",
-        "middle_name": null
-      },
-      "address": null,
-      "hairColor": "black",
-      "height": 6.0
-    }
-    ---Parsed Response (class DynamicOutput)---
-    {
-      "name": {
-        "first_name": "Mark",
-        "last_name": "Gonzalez",
-        "middle_name": null
-      },
-      "address": null,
-      "hair_color": "black",
-      "height": 6.0
-    }
-

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.725572

Setup

Call

Captured stdout call
streamed  name=None hair_color=None
+

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.877010

Setup

Call

Captured stdout call
{"name":{"first_name":"Mark","last_name":"Gonzalez","middle_name":null},"address":null,"hair_color":"black","height":6.0}
+

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.527380

Setup

Call

Captured stdout call
streamed  name=None hair_color=None
 streamed  {'name': None, 'hair_color': None}
 streamed  name=None hair_color=None
 streamed  {'name': None, 'hair_color': None}
@@ -1541,39 +155,7 @@
 streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color='black'
 streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': 'black'}
 {"name":{"first_name":"Mark","last_name":"Gonzalez"},"hair_color":"black"}
-
Captured stderr call
[2024-11-26T16:58:04Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 720ms. StopReason: stop. Tokens(in/out): 73/35
-    ---PROMPT---
-    [chat] user: Given a string, extract info using the schema:
-    
-    My name is Mark Gonzalez. My hair is black and I'm 6 feet tall.
-    
-    Answer in JSON using this schema:
-    {
-      name: {
-        first_name: string,
-        last_name: string or null,
-      } or null,
-      hair_color: string,
-    }
-    
-    ---LLM REPLY---
-    {
-      "name": {
-        "first_name": "Mark",
-        "last_name": "Gonzalez"
-      },
-      "hair_color": "black"
-    }
-    ---Parsed Response (class DynamicOutput)---
-    {
-      "name": {
-        "first_name": "Mark",
-        "last_name": "Gonzalez"
-      },
-      "hair_color": "black"
-    }
-

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.659535

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.630070

Setup

Call

Captured stdout call
[]
 streamed  {'hair_color': '{'}
 streamed  {'hair_color': '{'}
 streamed  {'hair_color': '{\n  "'}
@@ -1587,400 +169,21 @@
 streamed  {'hair_color': 'black'}
 streamed  {'hair_color': 'black'}
 streamed  {'hair_color': 'black'}
-final  hair_color='black'
-final  {'hair_color': 'black'}
-final  {"hair_color":"black"}
-
Captured stderr call
[2024-11-26T16:58:05Z INFO  baml_events] Function MyFunc:
-    Client: MyClient (gpt-4o-mini-2024-07-18) - 654ms. StopReason: stop. Tokens(in/out): 48/14
-    ---PROMPT---
-    [chat] user: Given a string, extract info using the schema:
-    
-    My name is Harrison. My hair is black and I'm 6 feet tall.
-    
-    Answer in JSON using this schema:
-    {
-      hair_color: string,
-    }
-    
-    ---LLM REPLY---
-    ```json
-    {
-      "hair_color": "black"
-    }
-    ```
-    ---Parsed Response (class DynamicOutput)---
-    {
-      "hair_color": "black"
-    }
-

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.014890

Setup

Call

Captured stderr call
[2024-11-26T16:58:06Z INFO  baml_events] Function DynamicListInputOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1010ms. StopReason: stop. Tokens(in/out): 135/79
-    ---PROMPT---
-    [chat] user: Here is some input data:
-    ----
-    [{
-        "new_key": "hi1",
-        "blah": {
-            "nestedKey1": "nestedVal",
-        },
-        "testKey": "myTest",
-    }, {
-        "blah": {
-            "nestedKey1": "nestedVal",
-        },
-        "testKey": "myTest",
-        "new_key": "hi",
-    }]
-    ----
-    
-    Extract the information.
-    Answer with a JSON Array using this schema:
-    [
-      {
-        testKey: string,
-        new_key: string or null,
-        blah: {
-          nestedKey1: string,
-        },
-      }
-    ]
-    
-    ---LLM REPLY---
-    [
-      {
-        "testKey": "myTest",
-        "new_key": "hi1",
-        "blah": {
-          "nestedKey1": "nestedVal"
-        }
-      },
-      {
-        "testKey": "myTest",
-        "new_key": "hi",
-        "blah": {
-          "nestedKey1": "nestedVal"
-        }
-      }
-    ]
-    ---Parsed Response (list<class DynInputOutput>)---
-    [
-      {
-        "testKey": "myTest",
-        "new_key": "hi1",
-        "blah": {
-          "nestedKey1": "nestedVal"
-        }
-      },
-      {
-        "testKey": "myTest",
-        "new_key": "hi",
-        "blah": {
-          "nestedKey1": "nestedVal"
-        }
-      }
-    ]
-

Teardown

PASSED test_dynamic_types_new_enum 0:00:01.076369

Setup

Call

Captured stderr call
[2024-11-26T16:58:07Z INFO  baml_events] Function ExtractPeople:
-    Client: GPT4 (gpt-4o-2024-08-06) - 1072ms. StopReason: stop. Tokens(in/out): 149/36
-    ---PROMPT---
-    [chat] system: You are an expert extraction algorithm. Only extract relevant information from the text. If you do not know the value of an attribute asked to extract, return null for the attribute's value.
-    
-    Answer with a JSON Array using this schema:
-    [
-      {
-        name: string or null,
-        hair_color: 'RED' or 'BLUE' or 'GREEN' or 'YELLOW' or 'BLACK' or 'WHITE' or null,
-        animalLiked: 'GIRAFFE' or 'ELEPHANT' or 'LION',
-      }
-    ]
-    user: My name is Harrison. My hair is black and I'm 6 feet tall. I'm pretty good around the hoop. I like giraffes.
-    
-    ---LLM REPLY---
-    ```json
-    [
-      {
-        "name": "Harrison",
-        "hair_color": "BLACK",
-        "animalLiked": "GIRAFFE"
-      }
-    ]
-    ```
-    ---Parsed Response (list<class Person>)---
-    [
-      {
-        "name": "Harrison",
-        "hair_color": "BLACK",
-        "animalLiked": "GIRAFFE"
-      }
-    ]
-

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.696264

Setup

Call

Captured stderr call
[2024-11-26T16:58:08Z INFO  baml_events] Function ExtractHobby:
-    Client: GPT4 (gpt-4o-2024-08-06) - 693ms. StopReason: stop. Tokens(in/out): 65/16
-    ---PROMPT---
-    [chat] system: Answer with a JSON Array using this schema:
-    [
-      'SPORTS' or 'MUSIC' or 'READING' or 'Golfing'
-    ]
-    user: My name is Harrison. My hair is black and I'm 6 feet tall. golf and music are my favorite!.
-    
-    ---LLM REPLY---
-    ```json
-    [
-      "Golfing",
-      "MUSIC"
-    ]
-    ```
-    ---Parsed Response (list<enum Hobby>)---
-    [
-      "Golfing",
-      "MUSIC"
-    ]
-

Teardown

PASSED test_dynamic_literals 0:00:01.261003

Setup

Call

Captured stderr call
[2024-11-26T16:58:09Z INFO  baml_events] Function ExtractPeople:
-    Client: GPT4 (gpt-4o-2024-08-06) - 1258ms. 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.
-    
-    Answer with a JSON Array using this schema:
-    [
-      {
-        name: string or null,
-        hair_color: 'RED' or 'BLUE' or 'GREEN' or 'YELLOW' or 'BLACK' or 'WHITE' or null,
-        animalLiked: "GIRAFFE" or "ELEPHANT" or "LION",
-      }
-    ]
-    user: My name is Harrison. My hair is black and I'm 6 feet tall. I'm pretty good around the hoop. I like giraffes.
-    
-    ---LLM REPLY---
-    [
-      {
-        "name": "Harrison",
-        "hair_color": "BLACK",
-        "animalLiked": "GIRAFFE"
-      }
-    ]
-    ---Parsed Response (list<class Person>)---
-    [
-      {
-        "name": "Harrison",
-        "hair_color": "BLACK",
-        "animalLiked": "GIRAFFE"
-      }
-    ]
-

Teardown

PASSED test_dynamic_inputs_list 0:00:01.045577

Setup

Call

Captured stderr call
[2024-11-26T16:58:10Z INFO  baml_events] Function DynamicListInputOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1040ms. StopReason: stop. Tokens(in/out): 134/78
-    ---PROMPT---
-    [chat] user: Here is some input data:
-    ----
-    [{
-        "testKey": "myTest",
-        "new_key": "hi",
-        "blah": {
-            "nestedKey1": "nestedVal",
-        },
-    }, {
-        "blah": {
-            "nestedKey1": "nestedVal",
-        },
-        "testKey": "myTest",
-        "new_key": "hi",
-    }]
-    ----
-    
-    Extract the information.
-    Answer with a JSON Array using this schema:
-    [
-      {
-        testKey: string,
-        new_key: string or null,
-        blah: {
-          nestedKey1: string,
-        },
-      }
-    ]
-    
-    ---LLM REPLY---
-    [
-        {
-            "testKey": "myTest",
-            "new_key": "hi",
-            "blah": {
-                "nestedKey1": "nestedVal"
-            }
-        },
-        {
-            "testKey": "myTest",
-            "new_key": "hi",
-            "blah": {
-                "nestedKey1": "nestedVal"
-            }
-        }
-    ]
-    ---Parsed Response (list<class DynInputOutput>)---
-    [
-      {
-        "testKey": "myTest",
-        "new_key": "hi",
-        "blah": {
-          "nestedKey1": "nestedVal"
-        }
-      },
-      {
-        "testKey": "myTest",
-        "new_key": "hi",
-        "blah": {
-          "nestedKey1": "nestedVal"
-        }
-      }
-    ]
-

Teardown

PASSED test_dynamic_output_map 0:00:00.679308

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-26T16:58:11Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 676ms. StopReason: stop. Tokens(in/out): 80/44
-    ---PROMPT---
-    [chat] user: Given a string, extract info using the schema:
-    
-    My name is Harrison. My hair is black and I'm 6 feet tall. I have blue eyes and a beard.
-    
-    Answer in JSON using this schema:
-    {
-      hair_color: string,
-      // Things like 'eye_color' or 'facial_hair'
-      attributes: map<string, string>,
-    }
-    
-    ---LLM REPLY---
-    {
-      "hair_color": "black",
-      "attributes": {
-        "height": "6 feet",
-        "eye_color": "blue",
-        "facial_hair": "beard"
-      }
-    }
-    ---Parsed Response (class DynamicOutput)---
-    {
-      "hair_color": "black",
-      "attributes": {
-        "height": "6 feet",
-        "eye_color": "blue",
-        "facial_hair": "beard"
-      }
-    }
-

Teardown

PASSED test_dynamic_output_union 0:00:01.587734

Setup

Call

Captured stdout call
[]
+final  hair_color='black'
+final  {'hair_color': 'black'}
+final  {"hair_color":"black"}
+

Teardown

PASSED test_dynamic_inputs_list2 0:00:00.933096

Setup

Call

Teardown

PASSED test_dynamic_types_new_enum 0:00:01.227953

Setup

Call

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.667437

Setup

Call

Teardown

PASSED test_dynamic_literals 0:00:03.292589

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:00.998444

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:00.608324

Setup

Call

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

Teardown

PASSED test_dynamic_output_union 0:00:01.733173

Setup

Call

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

Teardown

PASSED test_nested_class_streaming 0:00:01.990326

Setup

Call

Captured stdout call
streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
+final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30'} height={'meters': 1.8}
+final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30'}, 'height': {'meters': 1.8}}
+final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard","age":"30"},"height":{"meters":1.8}}
+

Teardown

PASSED test_nested_class_streaming 0:00:01.424581

Setup

Call

Captured stdout call
streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
@@ -1988,178 +191,84 @@
 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': 'Value', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': '', 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value', 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value', 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': None}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-final  {'prop1': 'Example', 'prop2': {'prop1': 'Value 1', 'prop2': 'Value 2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-
Captured stderr call
[2024-11-26T16:58:14Z INFO  baml_events] Function FnOutputClassNested:
-    Client: Ollama (llama2) - 1984ms. StopReason: stop. Tokens(in/out): unknown/unknown
-    ---PROMPT---
-    [chat] user: Return a made up json blob that matches this schema:
-    Answer in JSON using this schema:
-    {
-      prop1: string,
-      prop2: {
-        prop1: string,
-        prop2: string,
-        inner: {
-          prop2: int,
-          prop3: float,
-        },
-      },
-    }
-    ---
-    
-    JSON:
-    
-    ---LLM REPLY---
-    Sure! Here is a made-up JSON blob that matches the schema you provided:
-    ```json
-    {
-      "prop1": "Example",
-      "prop2": {
-        "prop1": "Value 1",
-        "prop2": "Value 2",
-        "inner": {
-          "prop2": 42,
-          "prop3": 3.14,
-        },
-      },
-    }
-    ```
-    Let me know if you have any questions or need further assistance!
-    ---Parsed Response (class TestClassNested)---
-    {
-      "prop1": "Example",
-      "prop2": {
-        "prop1": "Value 1",
-        "prop2": "Value 2",
-        "inner": {
-          "prop2": 42,
-          "prop3": 3.14
-        }
-      }
-    }
-

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.460625

Setup

Call

Captured stderr call
[2024-11-26T16:58:15Z INFO  baml_events] Function ExpectFailure:
-    Client: MyClient (gpt-3.5-turbo-0125) - 458ms. StopReason: stop. Tokens(in/out): 14/7
-    ---PROMPT---
-    [chat] user: What is the capital of England?
-    
-    ---LLM REPLY---
-    The capital of England is London.
-    ---Parsed Response (string)---
-    "The capital of England is London."
-

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:00.842830

Setup

Call

Captured stderr call
[2024-11-26T16:58:16Z INFO  baml_events] Function ExpectFailure:
-    Client: MyClient () - 840ms. StopReason: "STOP". Tokens(in/out): 7/10
-    ---PROMPT---
-    [chat] user: What is the capital of England?
-    
-    ---LLM REPLY---
-    The capital of England is **London**. 
-    
-    ---Parsed Response (string)---
-    "The capital of England is **London**. \n"
-

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:01.108165

Setup

Call

Captured stderr call
[2024-11-26T16:58:17Z INFO  baml_events] Function ExpectFailure:
-    Client: MyClient () - 1105ms. StopReason: "STOP". Tokens(in/out): 7/10
-    ---PROMPT---
-    [chat] user: What is the capital of England?
-    
-    ---LLM REPLY---
-    The capital of England is **London**. 
-    
-    ---Parsed Response (string)---
-    "The capital of England is **London**. \n"
-

Teardown

PASSED test_event_log_hook 0:00:01.235860

Setup

Call

Captured stdout call
Event log hook1: 
+streamed  {'prop1': 'value', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': '', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+final  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.426431

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:01.472761

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:01.233944

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.221894

Setup

Call

Captured stdout call
Event log hook1: 
 Event log event  BamlLogEvent {
     metadata: {
-        event_id: "44009259-30f3-48f0-8333-2b4268d4a1de",
+        event_id: "65de820f-a524-4e75-b641-ad1d7ebedd54",
         parent_id: None,
-        root_event_id: "44009259-30f3-48f0-8333-2b4268d4a1de"
+        root_event_id: "65de820f-a524-4e75-b641-ad1d7ebedd54"
     },
     prompt: "[
   {
-    "role": "user",
+    "role": "system",
     "content": [
       {
         "text": "Return this value back to me: [\"a\", \"b\", \"c\"]"
@@ -2169,789 +278,171 @@
 ]",
     raw_output: "["a", "b", "c"]",
     parsed_output: "["a", "b", "c"]",
-    start_time: "2024-11-26T16:58:17.823Z"
+    start_time: "2024-12-04T06:33:01.559Z"
 }
-
Captured stderr call
[2024-11-26T16:58:18Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 500ms. StopReason: stop. Tokens(in/out): 23/9
-    ---PROMPT---
-    [chat] user: Return this value back to me: ["a", "b", "c"]
-    
-    ---LLM REPLY---
-    ["a", "b", "c"]
-    ---Parsed Response (string)---
-    "[\"a\", \"b\", \"c\"]"
-

Teardown

PASSED test_aws_bedrock 0:00:03.102714

Setup

Call

Captured stdout call
unstreamed 
+

Teardown

PASSED test_aws_bedrock 0:00:03.490771

Setup

Call

Captured stdout call
unstreamed 
 
-The old miner, Jack, had spent his entire life digging for precious gems and metals in the depths of the earth. He had seen it all - the glittering veins of quartz, the veins of gold, and the dark, mysterious depths of coal. But nothing had ever prepared him for what he was about to find.
+In the heart of the ancient forest, there was a peculiar rock that had been passed down through generations of the local tribe. It was said that the rock held a secret, a spark of magic that only revealed itself to those who possessed a pure heart and a curious mind.
 
-As he panned through the dirt and debris of an old mine shaft, Jack's eyes scanned the ground for any sign of something valuable. His pickaxe had been silent
+The rock was a deep, rich brown, with veins of silver that seemed to shimmer in the sunlight. It was smooth to the touch, as if it had been worn down by the gentle touch of countless hands over the
 streamed  '\n\n'
-streamed  '\n\nIn'
-streamed  '\n\nIn the'
-streamed  '\n\nIn the heart'
-streamed  '\n\nIn the heart of'
-streamed  '\n\nIn the heart of the'
-streamed  '\n\nIn the heart of the desert'
-streamed  '\n\nIn the heart of the desert,'
-streamed  '\n\nIn the heart of the desert, there'
-streamed  '\n\nIn the heart of the desert, there was'
-streamed  '\n\nIn the heart of the desert, there was a'
-streamed  '\n\nIn the heart of the desert, there was a peculiar'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation that'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation that had'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation that had been'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation that had been a'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation that had been a subject'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation that had been a subject of'
-streamed  ' the heart of the desert, there was a peculiar rock formation that had been a subject of fascination'
-streamed  ' heart of the desert, there was a peculiar rock formation that had been a subject of fascination for'
-streamed  'rt of the desert, there was a peculiar rock formation that had been a subject of fascination for the'
-streamed  'the desert, there was a peculiar rock formation that had been a subject of fascination for the local'
-streamed  ', there was a peculiar rock formation that had been a subject of fascination for the local villagers'
-streamed  'ere was a peculiar rock formation that had been a subject of fascination for the local villagers for'
-streamed  'culiar rock formation that had been a subject of fascination for the local villagers for generations'
-streamed  'uliar rock formation that had been a subject of fascination for the local villagers for generations.'
-streamed  'r rock formation that had been a subject of fascination for the local villagers for generations. The'
-streamed  'k formation that had been a subject of fascination for the local villagers for generations. The rock'
-streamed  ' formation that had been a subject of fascination for the local villagers for generations. The rock,'
-streamed  'tion that had been a subject of fascination for the local villagers for generations. The rock, known'
-streamed  'n that had been a subject of fascination for the local villagers for generations. The rock, known as'
-streamed  'that had been a subject of fascination for the local villagers for generations. The rock, known as "'
-streamed  't had been a subject of fascination for the local villagers for generations. The rock, known as "The'
-streamed  'n a subject of fascination for the local villagers for generations. The rock, known as "The Guardian'
-streamed  'a subject of fascination for the local villagers for generations. The rock, known as "The Guardian,"'
-streamed  'bject of fascination for the local villagers for generations. The rock, known as "The Guardian," was'
-streamed  'ect of fascination for the local villagers for generations. The rock, known as "The Guardian," was a'
-streamed  'scination for the local villagers for generations. The rock, known as "The Guardian," was a towering'
-streamed  'ation for the local villagers for generations. The rock, known as "The Guardian," was a towering mon'
-streamed  ' for the local villagers for generations. The rock, known as "The Guardian," was a towering monolith'
-streamed  'r the local villagers for generations. The rock, known as "The Guardian," was a towering monolith of'
-streamed  'cal villagers for generations. The rock, known as "The Guardian," was a towering monolith of granite'
-streamed  'al villagers for generations. The rock, known as "The Guardian," was a towering monolith of granite,'
-streamed  'illagers for generations. The rock, known as "The Guardian," was a towering monolith of granite, its'
-streamed  ' for generations. The rock, known as "The Guardian," was a towering monolith of granite, its surface'
-streamed  'r generations. The rock, known as "The Guardian," was a towering monolith of granite, its surface et'
-streamed  'nerations. The rock, known as "The Guardian," was a towering monolith of granite, its surface etched'
-streamed  'ions. The rock, known as "The Guardian," was a towering monolith of granite, its surface etched with'
-streamed  'e rock, known as "The Guardian," was a towering monolith of granite, its surface etched with ancient'
-streamed  'known as "The Guardian," was a towering monolith of granite, its surface etched with ancient symbols'
-streamed  'n as "The Guardian," was a towering monolith of granite, its surface etched with ancient symbols and'
-streamed  ' Guardian," was a towering monolith of granite, its surface etched with ancient symbols and markings'
-streamed  'dian," was a towering monolith of granite, its surface etched with ancient symbols and markings that'
-streamed  '" was a towering monolith of granite, its surface etched with ancient symbols and markings that told'
-streamed  's a towering monolith of granite, its surface etched with ancient symbols and markings that told the'
-streamed  'wering monolith of granite, its surface etched with ancient symbols and markings that told the story'
-streamed  'ing monolith of granite, its surface etched with ancient symbols and markings that told the story of'
-streamed  'monolith of granite, its surface etched with ancient symbols and markings that told the story of the'
-streamed  'ith of granite, its surface etched with ancient symbols and markings that told the story of the land'
-streamed  "h of granite, its surface etched with ancient symbols and markings that told the story of the land's"
-streamed  "nite, its surface etched with ancient symbols and markings that told the story of the land's history"
-streamed  "e, its surface etched with ancient symbols and markings that told the story of the land's history.\n\n"
-streamed  "its surface etched with ancient symbols and markings that told the story of the land's history.\n\nOne"
-streamed  "rface etched with ancient symbols and markings that told the story of the land's history.\n\nOne storm"
-streamed  "face etched with ancient symbols and markings that told the story of the land's history.\n\nOne stormy"
-streamed  "tched with ancient symbols and markings that told the story of the land's history.\n\nOne stormy night"
-streamed  "ched with ancient symbols and markings that told the story of the land's history.\n\nOne stormy night,"
-streamed  "ed with ancient symbols and markings that told the story of the land's history.\n\nOne stormy night, a"
-streamed  "th ancient symbols and markings that told the story of the land's history.\n\nOne stormy night, a bolt"
-streamed  "ancient symbols and markings that told the story of the land's history.\n\nOne stormy night, a bolt of"
-streamed  "mbols and markings that told the story of the land's history.\n\nOne stormy night, a bolt of lightning"
-streamed  "nd markings that told the story of the land's history.\n\nOne stormy night, a bolt of lightning struck"
-streamed  "arkings that told the story of the land's history.\n\nOne stormy night, a bolt of lightning struck the"
-streamed  "gs that told the story of the land's history.\n\nOne stormy night, a bolt of lightning struck the rock"
-streamed  "s that told the story of the land's history.\n\nOne stormy night, a bolt of lightning struck the rock,"
-streamed  "old the story of the land's history.\n\nOne stormy night, a bolt of lightning struck the rock, illumin"
-streamed  "he story of the land's history.\n\nOne stormy night, a bolt of lightning struck the rock, illuminating"
-streamed  "tory of the land's history.\n\nOne stormy night, a bolt of lightning struck the rock, illuminating the"
-streamed  "of the land's history.\n\nOne stormy night, a bolt of lightning struck the rock, illuminating the dark"
-streamed  "he land's history.\n\nOne stormy night, a bolt of lightning struck the rock, illuminating the dark sky"
-streamed  "nd's history.\n\nOne stormy night, a bolt of lightning struck the rock, illuminating the dark sky with"
-streamed  "'s history.\n\nOne stormy night, a bolt of lightning struck the rock, illuminating the dark sky with a"
-streamed  '.\n\nOne stormy night, a bolt of lightning struck the rock, illuminating the dark sky with a brilliant'
-streamed  ' stormy night, a bolt of lightning struck the rock, illuminating the dark sky with a brilliant flash'
-streamed  'ormy night, a bolt of lightning struck the rock, illuminating the dark sky with a brilliant flash of'
-streamed  'ight, a bolt of lightning struck the rock, illuminating the dark sky with a brilliant flash of light'
-streamed  'ght, a bolt of lightning struck the rock, illuminating the dark sky with a brilliant flash of light.'
-streamed  ' a bolt of lightning struck the rock, illuminating the dark sky with a brilliant flash of light. The'
-streamed  ' lightning struck the rock, illuminating the dark sky with a brilliant flash of light. The villagers'
-streamed  'lightning struck the rock, illuminating the dark sky with a brilliant flash of light. The villagers,'
-streamed  'ghtning struck the rock, illuminating the dark sky with a brilliant flash of light. The villagers, h'
-streamed  'g struck the rock, illuminating the dark sky with a brilliant flash of light. The villagers, huddled'
-streamed  'truck the rock, illuminating the dark sky with a brilliant flash of light. The villagers, huddled in'
-streamed  'the rock, illuminating the dark sky with a brilliant flash of light. The villagers, huddled in their'
-streamed  'ck, illuminating the dark sky with a brilliant flash of light. The villagers, huddled in their homes'
-streamed  'k, illuminating the dark sky with a brilliant flash of light. The villagers, huddled in their homes,'
-streamed  'luminating the dark sky with a brilliant flash of light. The villagers, huddled in their homes, felt'
-streamed  'nating the dark sky with a brilliant flash of light. The villagers, huddled in their homes, felt the'
-streamed  'nating the dark sky with a brilliant flash of light. The villagers, huddled in their homes, felt the'
-streamed  'nating the dark sky with a brilliant flash of light. The villagers, huddled in their homes, felt the'
-streamed  'nating the dark sky with a brilliant flash of light. The villagers, huddled in their homes, felt the'
+streamed  '\n\nThe'
+streamed  '\n\nThe old'
+streamed  '\n\nThe old ge'
+streamed  '\n\nThe old geologist'
+streamed  '\n\nThe old geologist,'
+streamed  '\n\nThe old geologist, Professor'
+streamed  '\n\nThe old geologist, Professor Thompson'
+streamed  '\n\nThe old geologist, Professor Thompson,'
+streamed  '\n\nThe old geologist, Professor Thompson, had'
+streamed  '\n\nThe old geologist, Professor Thompson, had spent'
+streamed  '\n\nThe old geologist, Professor Thompson, had spent his'
+streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire'
+streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career'
+streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying'
+streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying the'
+streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying the ancient'
+streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying the ancient rocks'
+streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying the ancient rocks of'
+streamed  'The old geologist, Professor Thompson, had spent his entire career studying the ancient rocks of the'
+streamed  'ogist, Professor Thompson, had spent his entire career studying the ancient rocks of the Appalachian'
+streamed  'fessor Thompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains'
+streamed  'essor Thompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains.'
+streamed  'or Thompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains. He'
+streamed  'hompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains. He had'
+streamed  'on, had spent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen'
+streamed  ' had spent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it'
+streamed  ' spent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it all'
+streamed  'pent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it all -'
+streamed  ' his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it all - the'
+streamed  'tire career studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossil'
+streamed  ' career studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized'
+streamed  'reer studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized tr'
+streamed  'er studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized tril'
+streamed  ' studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilob'
+streamed  'dying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites'
+streamed  'ying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites,'
+streamed  ' the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the'
+streamed  'cient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz'
+streamed  'ks of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals'
+streamed  's of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals,'
+streamed  ' the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the'
+streamed  'ppalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins'
+streamed  'lachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of'
+streamed  'an Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold'
+streamed  'n Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold.'
+streamed  'untains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold. But'
+streamed  ' He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold. But nothing'
+streamed  'had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold. But nothing had'
+streamed  'een it all - the fossilized trilobites, the quartz crystals, the veins of gold. But nothing had ever'
+streamed  '- the fossilized trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated'
+streamed  'e fossilized trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him'
+streamed  'silized trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him more'
+streamed  'ed trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him more than'
+streamed  'rilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him more than the'
+streamed  's, the quartz crystals, the veins of gold. But nothing had ever fascinated him more than the strange'
+streamed  ', the quartz crystals, the veins of gold. But nothing had ever fascinated him more than the strange,'
+streamed  'artz crystals, the veins of gold. But nothing had ever fascinated him more than the strange, glowing'
+streamed  'crystals, the veins of gold. But nothing had ever fascinated him more than the strange, glowing rock'
+streamed  'stals, the veins of gold. But nothing had ever fascinated him more than the strange, glowing rock he'
+streamed  's, the veins of gold. But nothing had ever fascinated him more than the strange, glowing rock he had'
+streamed  's of gold. But nothing had ever fascinated him more than the strange, glowing rock he had discovered'
+streamed  'gold. But nothing had ever fascinated him more than the strange, glowing rock he had discovered deep'
+streamed  'd. But nothing had ever fascinated him more than the strange, glowing rock he had discovered deep in'
+streamed  'ut nothing had ever fascinated him more than the strange, glowing rock he had discovered deep in the'
+streamed  'hing had ever fascinated him more than the strange, glowing rock he had discovered deep in the heart'
+streamed  'g had ever fascinated him more than the strange, glowing rock he had discovered deep in the heart of'
+streamed  'd ever fascinated him more than the strange, glowing rock he had discovered deep in the heart of the'
+streamed  'cinated him more than the strange, glowing rock he had discovered deep in the heart of the mountains'
+streamed  'ated him more than the strange, glowing rock he had discovered deep in the heart of the mountains.\n\n'
+streamed  'ed him more than the strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt'
+streamed  'im more than the strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was'
+streamed  ' more than the strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a'
+streamed  'n the strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar'
+streamed  'strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing'
+streamed  'trange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing,'
+streamed  'e, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this'
+streamed  'owing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock'
+streamed  'wing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock.'
+streamed  'g rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It'
+streamed  'he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked'
+streamed  'd discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like'
+streamed  'scovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any'
+streamed  'ed deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other'
+streamed  'in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite'
+streamed  'n the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite,'
+streamed  'e heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite, but'
+streamed  'rt of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite, but when'
+streamed  'mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite, but when Professor'
+streamed  '.\n\nIt was a peculiar thing, this rock. It looked like any other granite, but when Professor Thompson'
+streamed  ' was a peculiar thing, this rock. It looked like any other granite, but when Professor Thompson held'
+streamed  's a peculiar thing, this rock. It looked like any other granite, but when Professor Thompson held it'
+streamed  ' peculiar thing, this rock. It looked like any other granite, but when Professor Thompson held it up'
+streamed  'culiar thing, this rock. It looked like any other granite, but when Professor Thompson held it up to'
+streamed  'ar thing, this rock. It looked like any other granite, but when Professor Thompson held it up to the'
+streamed  'ng, this rock. It looked like any other granite, but when Professor Thompson held it up to the light'
+streamed  'g, this rock. It looked like any other granite, but when Professor Thompson held it up to the light,'
+streamed  'this rock. It looked like any other granite, but when Professor Thompson held it up to the light, he'
+streamed  'ock. It looked like any other granite, but when Professor Thompson held it up to the light, he could'
+streamed  't looked like any other granite, but when Professor Thompson held it up to the light, he could swear'
+streamed  't looked like any other granite, but when Professor Thompson held it up to the light, he could swear'
+streamed  't looked like any other granite, but when Professor Thompson held it up to the light, he could swear'
+streamed  't looked like any other granite, but when Professor Thompson held it up to the light, he could swear'
 streamed final 
 
-In the heart of the desert, there was a peculiar rock formation that had been a subject of fascination for the local villagers for generations. The rock, known as "The Guardian," was a towering monolith of granite, its surface etched with ancient symbols and markings that told the story of the land's history.
+The old geologist, Professor Thompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him more than the strange, glowing rock he had discovered deep in the heart of the mountains.
 
-One stormy night, a bolt of lightning struck the rock, illuminating the dark sky with a brilliant flash of light. The villagers, huddled in their homes, felt the
-
Captured stderr call
[2024-11-26T16:58:18Z 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-26T16:58:20Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (meta.llama3-8b-instruct-v1:0) - 1530ms. StopReason: max_tokens. Tokens(in/out): 24/100
-    ---PROMPT---
-    [chat] user: Write a nice short story about lightning in a rock
-    
-    ---LLM REPLY---
-    
-    
-    The old miner, Jack, had spent his entire life digging for precious gems and metals in the depths of the earth. He had seen it all - the glittering veins of quartz, the veins of gold, and the dark, mysterious depths of coal. But nothing had ever prepared him for what he was about to find.
-    
-    As he panned through the dirt and debris of an old mine shaft, Jack's eyes scanned the ground for any sign of something valuable. His pickaxe had been silent
-    ---Parsed Response (string)---
-    "\n\nThe old miner, Jack, had spent his entire life digging for precious gems and metals in the depths of the earth. He had seen it all - the glittering veins of quartz, the veins of gold, and the dark, mysterious depths of coal. But nothing had ever prepared him for what he was about to find.\n\nAs he panned through the dirt and debris of an old mine shaft, Jack's eyes scanned the ground for any sign of something valuable. His pickaxe had been silent"
-[2024-11-26T16:58:20Z 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-26T16:58:21Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (meta.llama3-8b-instruct-v1:0) - 1566ms. StopReason: unknown. Tokens(in/out): 24/100
-    ---PROMPT---
-    [chat] user: Write a nice short story about lightning in a rock
-    
-    ---LLM REPLY---
-    
-    
-    In the heart of the desert, there was a peculiar rock formation that had been a subject of fascination for the local villagers for generations. The rock, known as "The Guardian," was a towering monolith of granite, its surface etched with ancient symbols and markings that told the story of the land's history.
-    
-    One stormy night, a bolt of lightning struck the rock, illuminating the dark sky with a brilliant flash of light. The villagers, huddled in their homes, felt the
-    ---Parsed Response (string)---
-    "\n\nIn the heart of the desert, there was a peculiar rock formation that had been a subject of fascination for the local villagers for generations. The rock, known as \"The Guardian,\" was a towering monolith of granite, its surface etched with ancient symbols and markings that told the story of the land's history.\n\nOne stormy night, a bolt of lightning struck the rock, illuminating the dark sky with a brilliant flash of light. The villagers, huddled in their homes, felt the"
-

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.005704

Setup

Call

Captured stderr call
[2024-11-26T16:58:21Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
-[2024-11-26T16:58:21Z WARN  baml_events] Function TestAwsInvalidRegion:
-    Client: AwsBedrockInvalidRegion (meta.llama3-8b-instruct-v1:0) - 2ms
-    ---PROMPT---
-    [chat] user: Write a nice short story about lightning in a rock
-    
-    ---REQUEST OPTIONS---
-    ---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.329398

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...ld: nonce
-  - <root>: Missing required field: nonce2, raw_output=Hello there!, prompt=[chat] user: Say "hello there".
+It was a peculiar thing, this rock. It looked like any other granite, but when Professor Thompson held it up to the light, he could swear
+

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.005549

Setup

Call

Teardown

PASSED test_serialization_exception 0:00:00.437666

Setup

Call

Captured stdout call
Exception message from test:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
 ) tblen=2>
-
Captured stderr call
[2024-11-26T16:58:22Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 326ms. StopReason: stop. Tokens(in/out): 12/3
-    ---PROMPT---
-    [chat] user: Say "hello there".
-    
-    ---LLM REPLY---
-    Hello there!
-    ---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.349468

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None
+

Teardown

PASSED test_stream_serialization_exception 0:00:00.528396

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None
+streamed  nonce=None nonce2=None
+streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
-Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...ld: nonce
-  - <root>: Missing required field: nonce2, raw_output=Hello there!, prompt=[chat] user: Say "hello there".
+streamed  nonce=None nonce2=None
+streamed  nonce=None nonce2=None
+streamed  nonce=None nonce2=None
+streamed  nonce=None nonce2=None
+streamed  nonce=None nonce2=None
+Exception message:  <ExceptionInfo BamlValidationError(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-26T16:58:22Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 345ms. StopReason: stop. Tokens(in/out): 12/3
-    ---PROMPT---
-    [chat] user: Say "hello there".
-    
-    ---LLM REPLY---
-    Hello there!
-    ---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.430927

Setup

Call

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

Teardown

PASSED test_stream2_serialization_exception 0:00:01.058700

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None nonce3=None
+streamed  nonce=None nonce2=None nonce3=None
+streamed  nonce=None nonce2=None nonce3=None
 streamed  nonce=None nonce2=None nonce3=None
 streamed  nonce=None nonce2=None nonce3=None
 streamed  nonce=None nonce2=None nonce3=None
 streamed  nonce=None nonce2=None nonce3=None
 streamed  nonce=None nonce2=None nonce3=None
-Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...d: nonce2
-  - <root>: Missing required field: nonce3, raw_output=Hello there!, prompt=[chat] user: Say "hello there".
+streamed  nonce=None nonce2=None nonce3=None
+streamed  nonce=None nonce2=None nonce3=None
+streamed  nonce=None nonce2=None nonce3=None
+streamed  nonce=None nonce2=None nonce3=None
+streamed  nonce=None nonce2=None nonce3=None
+Exception message:  <ExceptionInfo BamlValidationError(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-26T16:58:22Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 426ms. StopReason: stop. Tokens(in/out): 12/3
-    ---PROMPT---
-    [chat] user: Say "hello there".
-    
-    ---LLM REPLY---
-    Hello there!
-    ---Parsed Response (Error)---
-    Failed to coerce value: <root>: Failed while parsing required fields: missing=3, unparsed=0
-      - <root>: Missing required field: nonce
-      - <root>: Missing required field: nonce2
-      - <root>: Missing required field: nonce3
-

Teardown

PASSED test_descriptions 0:00:02.036899

Setup

Call

Captured stderr call
[2024-11-26T16:58:24Z INFO  baml_events] Function SchemaDescriptions:
-    Client: GPT4o (gpt-4o-2024-08-06) - 2029ms. StopReason: stop. Tokens(in/out): 340/104
-    ---PROMPT---
-    [chat] user: Return a schema with this format:
-    
-    Answer in JSON using this schema:
-    {
-      // write "one"
-      prop1: string or null,
-      // write "two"
-      prop2: {
-        // write "three"
-        prop3: string or null,
-        // write "four"
-        blah: string or null,
-        prop20: {
-          // write "three"
-          prop11: string or null,
-          // write "four"
-          blah: string or null,
-        },
-      } or string,
-      // write "hi"
-      prop5: [
-        string or null
-      ],
-      // write the string "blah" regardless of the other types here
-      blah: string or [
-        {
-          // write "three"
-          prop3: string or null,
-          // write "four"
-          blah: string or null,
-          prop20: {
-            // write "three"
-            prop11: string or null,
-            // write "four"
-            blah: string or null,
-          },
-        }
-      ],
-      // write the string "nested" regardless of other types
-      nested_attrs: [
-        string or null or {
-          // write "three"
-          prop3: string or null,
-          // write "four"
-          blah: string or null,
-          prop20: {
-            // write "three"
-            prop11: string or null,
-            // write "four"
-            blah: string or null,
-          },
-        }
-      ],
-      // write "parens1"
-      parens: string or null,
-      // write "other"
-      other: string or int or string,
-    }
-    
-    ---LLM REPLY---
-    ```json
-    {
-      "prop1": "one",
-      "prop2": {
-        "prop3": "three",
-        "blah": "four",
-        "prop20": {
-          "prop11": "three",
-          "blah": "four"
-        }
-      },
-      "prop5": [
-        "hi"
-      ],
-      "blah": "blah",
-      "nested_attrs": "nested",
-      "parens": "parens1",
-      "other": "other"
-    }
-    ```
-    ---Parsed Response (class Schema)---
-    {
-      "prop1": "one",
-      "prop2": {
-        "prop3": "three",
-        "prop4": "four",
-        "prop20": {
-          "prop11": "three",
-          "prop12": "four"
-        }
-      },
-      "prop5": [
-        "hi"
-      ],
-      "prop6": "blah",
-      "nested_attrs": [
-        "nested"
-      ],
-      "parens": "parens1",
-      "other_group": "other"
-    }
-

Teardown

FAILED test_caching 0:00:06.041508

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

Setup

Call

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

Teardown

PASSED test_descriptions 0:00:06.361985

Setup

Call

Teardown

FAILED test_caching 0:00:06.736878

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

Setup

Call

>   ???
+E   AssertionError: 3.5142571926116943 < 3.2215769290924072. Expected second call to be faster than first by a large margin.
+E   assert 3.5142571926116943 < 3.2215769290924072
 
-tests/test_functions.py:1271: AssertionError
Captured stdout call
Duration no caching:  2.8829891681671143
-Duration with caching:  3.157634735107422
-
Captured stderr call
[2024-11-26T16:58:27Z INFO  baml_events] Function TestCaching:
-    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 2879ms. StopReason: "end_turn". Tokens(in/out): 14/312
-    ---PROMPT---
-    [chat] system: {"cache_control": Object {"type": String("ephemeral")}}::Generate the following story
-    15ca70697fa64487aae2cc10c42a082f
-    In a futuristic world where dreams are a marketable asset and collective experience, an introverted and socially inept teenager named Alex realizes they have a unique and potent skill to not only observe but also alter the dreams of others. Initially excited by this newfound talent, Alex starts discreetly modifying the dreams of peers and relatives, aiding them in conquering fears, boosting self-esteem, or embarking on fantastical journeys. As Alex's abilities expand, so does their sway. They begin marketing exclusive dream experiences on the underground market, designing complex and captivating dreamscapes for affluent clients. However, the boundary between dream and reality starts to fade for those subjected to Alex's creations. Some clients find it difficult to distinguish between their genuine memories and the fabricated ones inserted by Alex's dream manipulation.
-    
-    Challenges emerge when a secretive government organization becomes aware of Alex's distinct talents. They propose Alex utilize their gift for "the greater good," suggesting uses in therapy, criminal reform, and even national defense. Concurrently, a covert resistance group contacts Alex, cautioning them about the risks of dream manipulation and the potential for widespread control and exploitation. Trapped between these conflicting forces, Alex must navigate a tangled web of moral dilemmas. They wrestle with issues of free will, the essence of consciousness, and the duty that comes with having influence over people's minds. As the repercussions of their actions ripple outward, impacting the lives of loved ones and strangers alike, Alex is compelled to face the true nature of their power and decide how—or if—it should be wielded.
-    
-    The narrative investigates themes of identity, the subconscious, the ethics of technology, and the power of creativity. It explores the possible outcomes of a world where our most intimate thoughts and experiences are no longer truly our own, and scrutinizes the fine line between aiding others and manipulating them for personal benefit or a perceived greater good. The story further delves into the societal ramifications of such abilities, questioning the moral limits of altering consciousness and the potential for misuse in a world where dreams can be commercialized. It challenges the reader to contemplate the impact of technology on personal freedom and the ethical duties of those who wield such power.
-    
-    As Alex's journey progresses, they meet various individuals whose lives have been influenced by their dream manipulations, each offering a distinct viewpoint on the ethical issues at hand. From a peer who gains newfound confidence to a wealthy client who becomes dependent on the dreamscapes, the ripple effects of Alex's actions are significant and extensive. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement underscores the dangers of unchecked power and the necessity of protecting individual freedoms.
-    
-    Ultimately, Alex's story is one of self-discovery and moral reflection, as they must choose whether to use their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their struggle for freedom and autonomy. The narrative encourages readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also examines the psychological impact on Alex, who must cope with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.
-    
-    The story further investigates the technological progress that has made dream manipulation feasible, questioning the role of innovation in society and the potential for both advancement and peril. It considers the societal divide between those who can afford to purchase enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more ensnared in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.
-    
-    In the end, Alex's journey is a cautionary tale about the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind. But it's also a story about the power of imagination and the potential for change, even in a world where our deepest thoughts are no longer our own. And it's a story about the power of choice, and the importance of fighting for the freedom to dream.
-    
-    In conclusion, this story is a reflection on the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind. But it's also a story about the power of imagination and the potential for change, even in a world where our deepest thoughts are no longer our own. And it's a story about the power of choice, and the importance of fighting for the freedom to dream.
-    
-    
-    15ca70697fa64487aae2cc10c42a082f
-    In a futuristic world where dreams are a marketable asset and collective experience, an introverted and socially inept teenager named Alex realizes they have a unique and potent skill to not only observe but also alter the dreams of others. Initially excited by this newfound talent, Alex starts discreetly modifying the dreams of peers and relatives, aiding them in conquering fears, boosting self-esteem, or embarking on fantastical journeys. As Alex's abilities expand, so does their sway. They begin marketing exclusive dream experiences on the underground market, designing complex and captivating dreamscapes for affluent clients. However, the boundary between dream and reality starts to fade for those subjected to Alex's creations. Some clients find it difficult to distinguish between their genuine memories and the fabricated ones inserted by Alex's dream manipulation.
-    
-    Challenges emerge when a secretive government organization becomes aware of Alex's distinct talents. They propose Alex utilize their gift for "the greater good," suggesting uses in therapy, criminal reform, and even national defense. Concurrently, a covert resistance group contacts Alex, cautioning them about the risks of dream manipulation and the potential for widespread control and exploitation. Trapped between these conflicting forces, Alex must navigate a tangled web of moral dilemmas. They wrestle with issues of free will, the essence of consciousness, and the duty that comes with having influence over people's minds. As the repercussions of their actions ripple outward, impacting the lives of loved ones and strangers alike, Alex is compelled to face the true nature of their power and decide how—or if—it should be wielded.
-    
-    The narrative investigates themes of identity, the subconscious, the ethics of technology, and the power of creativity. It explores the possible outcomes of a world where our most intimate thoughts and experiences are no longer truly our own, and scrutinizes the fine line between aiding others and manipulating them for personal benefit or a perceived greater good. The story further delves into the societal ramifications of such abilities, questioning the moral limits of altering consciousness and the potential for misuse in a world where dreams can be commercialized. It challenges the reader to contemplate the impact of technology on personal freedom and the ethical duties of those who wield such power.
-    
-    As Alex's journey progresses, they meet various individuals whose lives have been influenced by their dream manipulations, each offering a distinct viewpoint on the ethical issues at hand. From a peer who gains newfound confidence to a wealthy client who becomes dependent on the dreamscapes, the ripple effects of Alex's actions are significant and extensive. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement underscores the dangers of unchecked power and the necessity of protecting individual freedoms.
-    
-    Ultimately, Alex's story is one of self-discovery and moral reflection, as they must choose whether to use their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their struggle for freedom and autonomy. The narrative encourages readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also examines the psychological impact on Alex, who must cope with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.
-    
-    The story further investigates the technological progress that has made dream manipulation feasible, questioning the role of innovation in society and the potential for both advancement and peril. It considers the societal divide between those who can afford to purchase enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more ensnared in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.
-    
-    In the end, Alex's journey is a cautionary tale about the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind. But it's also a story about the power of imagination and the potential for change, even in a world where our deepest thoughts are no longer our own. And it's a story about the power of choice, and the importance of fighting for the freedom to dream.
-    
-    In conclusion, this story is a reflection on the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind. But it's also a story about the power of imagination and the potential for change, even in a world where our deepest thoughts are no longer our own. And it's a story about the power of choice, and the importance of fighting for the freedom to dream.
-    user: 1. try to be funny
-    
-    ---LLM REPLY---
-    Okay, let's try to inject some humor into this futuristic tale of dream manipulation. How about this:
-    
-    In this world of dreamscaping, Alex's powers were such a hit that they became the most sought-after "dream designer" around. Clients would line up, wallets in hand, desperate to experience Alex's latest fever dream creations. One particularly wealthy client requested a luxurious tropical getaway, only to wake up covered in sand and seagull poop, wondering if the resort's daiquiri bar was serving something a little extra.
-    
-    Meanwhile, Alex's own dreamscape was a perpetual montage of awkward social interactions and poorly timed bodily functions. They spent most nights trying to lucidly steer their subconscious away from such humiliating scenarios, only to accidentally project those same embarrassing dreams onto their unsuspecting friends and family members. 
-    
-    As the government and resistance groups closed in, Alex had to make a choice - use their powers for good, evil, or just plain weirdness? The fate of the dreamworld rested on their shoulders, along with the ever-present risk of giving someone nightmares about being trapped in a never-ending karaoke session.
-    
-    How's that? I tried to inject some lighthearted, absurdist humor into the story while still maintaining the core themes and tensions. Let me know if you'd like me to take another pass at the comedic elements.
-    ---Parsed Response (string)---
-    "Okay, let's try to inject some humor into this futuristic tale of dream manipulation. How about this:\n\nIn this world of dreamscaping, Alex's powers were such a hit that they became the most sought-after \"dream designer\" around. Clients would line up, wallets in hand, desperate to experience Alex's latest fever dream creations. One particularly wealthy client requested a luxurious tropical getaway, only to wake up covered in sand and seagull poop, wondering if the resort's daiquiri bar was serving something a little extra.\n\nMeanwhile, Alex's own dreamscape was a perpetual montage of awkward social interactions and poorly timed bodily functions. They spent most nights trying to lucidly steer their subconscious away from such humiliating scenarios, only to accidentally project those same embarrassing dreams onto their unsuspecting friends and family members. \n\nAs the government and resistance groups closed in, Alex had to make a choice - use their powers for good, evil, or just plain weirdness? The fate of the dreamworld rested on their shoulders, along with the ever-present risk of giving someone nightmares about being trapped in a never-ending karaoke session.\n\nHow's that? I tried to inject some lighthearted, absurdist humor into the story while still maintaining the core themes and tensions. Let me know if you'd like me to take another pass at the comedic elements."
-[2024-11-26T16:58:30Z INFO  baml_events] Function TestCaching:
-    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 3153ms. StopReason: "end_turn". Tokens(in/out): 14/328
-    ---PROMPT---
-    [chat] system: {"cache_control": Object {"type": String("ephemeral")}}::Generate the following story
-    15ca70697fa64487aae2cc10c42a082f
-    In a futuristic world where dreams are a marketable asset and collective experience, an introverted and socially inept teenager named Alex realizes they have a unique and potent skill to not only observe but also alter the dreams of others. Initially excited by this newfound talent, Alex starts discreetly modifying the dreams of peers and relatives, aiding them in conquering fears, boosting self-esteem, or embarking on fantastical journeys. As Alex's abilities expand, so does their sway. They begin marketing exclusive dream experiences on the underground market, designing complex and captivating dreamscapes for affluent clients. However, the boundary between dream and reality starts to fade for those subjected to Alex's creations. Some clients find it difficult to distinguish between their genuine memories and the fabricated ones inserted by Alex's dream manipulation.
-    
-    Challenges emerge when a secretive government organization becomes aware of Alex's distinct talents. They propose Alex utilize their gift for "the greater good," suggesting uses in therapy, criminal reform, and even national defense. Concurrently, a covert resistance group contacts Alex, cautioning them about the risks of dream manipulation and the potential for widespread control and exploitation. Trapped between these conflicting forces, Alex must navigate a tangled web of moral dilemmas. They wrestle with issues of free will, the essence of consciousness, and the duty that comes with having influence over people's minds. As the repercussions of their actions ripple outward, impacting the lives of loved ones and strangers alike, Alex is compelled to face the true nature of their power and decide how—or if—it should be wielded.
-    
-    The narrative investigates themes of identity, the subconscious, the ethics of technology, and the power of creativity. It explores the possible outcomes of a world where our most intimate thoughts and experiences are no longer truly our own, and scrutinizes the fine line between aiding others and manipulating them for personal benefit or a perceived greater good. The story further delves into the societal ramifications of such abilities, questioning the moral limits of altering consciousness and the potential for misuse in a world where dreams can be commercialized. It challenges the reader to contemplate the impact of technology on personal freedom and the ethical duties of those who wield such power.
-    
-    As Alex's journey progresses, they meet various individuals whose lives have been influenced by their dream manipulations, each offering a distinct viewpoint on the ethical issues at hand. From a peer who gains newfound confidence to a wealthy client who becomes dependent on the dreamscapes, the ripple effects of Alex's actions are significant and extensive. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement underscores the dangers of unchecked power and the necessity of protecting individual freedoms.
-    
-    Ultimately, Alex's story is one of self-discovery and moral reflection, as they must choose whether to use their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their struggle for freedom and autonomy. The narrative encourages readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also examines the psychological impact on Alex, who must cope with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.
-    
-    The story further investigates the technological progress that has made dream manipulation feasible, questioning the role of innovation in society and the potential for both advancement and peril. It considers the societal divide between those who can afford to purchase enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more ensnared in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.
-    
-    In the end, Alex's journey is a cautionary tale about the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind. But it's also a story about the power of imagination and the potential for change, even in a world where our deepest thoughts are no longer our own. And it's a story about the power of choice, and the importance of fighting for the freedom to dream.
-    
-    In conclusion, this story is a reflection on the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind. But it's also a story about the power of imagination and the potential for change, even in a world where our deepest thoughts are no longer our own. And it's a story about the power of choice, and the importance of fighting for the freedom to dream.
-    
-    
-    15ca70697fa64487aae2cc10c42a082f
-    In a futuristic world where dreams are a marketable asset and collective experience, an introverted and socially inept teenager named Alex realizes they have a unique and potent skill to not only observe but also alter the dreams of others. Initially excited by this newfound talent, Alex starts discreetly modifying the dreams of peers and relatives, aiding them in conquering fears, boosting self-esteem, or embarking on fantastical journeys. As Alex's abilities expand, so does their sway. They begin marketing exclusive dream experiences on the underground market, designing complex and captivating dreamscapes for affluent clients. However, the boundary between dream and reality starts to fade for those subjected to Alex's creations. Some clients find it difficult to distinguish between their genuine memories and the fabricated ones inserted by Alex's dream manipulation.
-    
-    Challenges emerge when a secretive government organization becomes aware of Alex's distinct talents. They propose Alex utilize their gift for "the greater good," suggesting uses in therapy, criminal reform, and even national defense. Concurrently, a covert resistance group contacts Alex, cautioning them about the risks of dream manipulation and the potential for widespread control and exploitation. Trapped between these conflicting forces, Alex must navigate a tangled web of moral dilemmas. They wrestle with issues of free will, the essence of consciousness, and the duty that comes with having influence over people's minds. As the repercussions of their actions ripple outward, impacting the lives of loved ones and strangers alike, Alex is compelled to face the true nature of their power and decide how—or if—it should be wielded.
-    
-    The narrative investigates themes of identity, the subconscious, the ethics of technology, and the power of creativity. It explores the possible outcomes of a world where our most intimate thoughts and experiences are no longer truly our own, and scrutinizes the fine line between aiding others and manipulating them for personal benefit or a perceived greater good. The story further delves into the societal ramifications of such abilities, questioning the moral limits of altering consciousness and the potential for misuse in a world where dreams can be commercialized. It challenges the reader to contemplate the impact of technology on personal freedom and the ethical duties of those who wield such power.
-    
-    As Alex's journey progresses, they meet various individuals whose lives have been influenced by their dream manipulations, each offering a distinct viewpoint on the ethical issues at hand. From a peer who gains newfound confidence to a wealthy client who becomes dependent on the dreamscapes, the ripple effects of Alex's actions are significant and extensive. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement underscores the dangers of unchecked power and the necessity of protecting individual freedoms.
-    
-    Ultimately, Alex's story is one of self-discovery and moral reflection, as they must choose whether to use their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their struggle for freedom and autonomy. The narrative encourages readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also examines the psychological impact on Alex, who must cope with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.
-    
-    The story further investigates the technological progress that has made dream manipulation feasible, questioning the role of innovation in society and the potential for both advancement and peril. It considers the societal divide between those who can afford to purchase enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more ensnared in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.
-    
-    In the end, Alex's journey is a cautionary tale about the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind. But it's also a story about the power of imagination and the potential for change, even in a world where our deepest thoughts are no longer our own. And it's a story about the power of choice, and the importance of fighting for the freedom to dream.
-    
-    In conclusion, this story is a reflection on the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind. But it's also a story about the power of imagination and the potential for change, even in a world where our deepest thoughts are no longer our own. And it's a story about the power of choice, and the importance of fighting for the freedom to dream.
-    user: 1. try to be funny
-    
-    ---LLM REPLY---
-    Here's an attempt to add some humor to the story:
-    
-    In a futuristic world where dreams are the newest commodity, a socially awkward teenager named Alex discovers they have a special power - the ability to manipulate other people's dreams. At first, Alex uses this skill to help their friends and family, tweaking their dreams to boost their confidence or conquer their fears. But before long, the teenage dream architect starts getting a little too big for their britches.
-    
-    Alex starts secretly designing custom dream experiences for wealthy clients, creating lavish fantasy worlds tailored to their deepest desires. Of course, the line between dream and reality becomes increasingly blurred, leading to some rather uncomfortable situations. One client wakes up convinced they're now the president of the United States, while another thinks they're engaged to their celebrity crush. Oops!
-    
-    When a shady government agency catches wind of Alex's illicit dream dealings, they try to recruit the young visionary, promising to put their talents to use for "the greater good" - whatever that means. Meanwhile, a rebel group warns Alex about the dangers of messing with people's minds. Talk about a rock and a hard place!
-    
-    Torn between personal gain, governmental control, and the fight for freedom, Alex has to figure out how to navigate this brave new world of dream commerce without completely losing their own grip on reality. After all, the last thing they need is to get stuck in a never-ending dream loop, unable to tell if they're awake or still snoozing. Sweet dreams, everyone!
-    ---Parsed Response (string)---
-    "Here's an attempt to add some humor to the story:\n\nIn a futuristic world where dreams are the newest commodity, a socially awkward teenager named Alex discovers they have a special power - the ability to manipulate other people's dreams. At first, Alex uses this skill to help their friends and family, tweaking their dreams to boost their confidence or conquer their fears. But before long, the teenage dream architect starts getting a little too big for their britches.\n\nAlex starts secretly designing custom dream experiences for wealthy clients, creating lavish fantasy worlds tailored to their deepest desires. Of course, the line between dream and reality becomes increasingly blurred, leading to some rather uncomfortable situations. One client wakes up convinced they're now the president of the United States, while another thinks they're engaged to their celebrity crush. Oops!\n\nWhen a shady government agency catches wind of Alex's illicit dream dealings, they try to recruit the young visionary, promising to put their talents to use for \"the greater good\" - whatever that means. Meanwhile, a rebel group warns Alex about the dangers of messing with people's minds. Talk about a rock and a hard place!\n\nTorn between personal gain, governmental control, and the fight for freedom, Alex has to figure out how to navigate this brave new world of dream commerce without completely losing their own grip on reality. After all, the last thing they need is to get stuck in a never-ending dream loop, unable to tell if they're awake or still snoozing. Sweet dreams, everyone!"
-

Teardown

PASSED test_arg_exceptions 0:00:00.786247

Setup

Call

Captured stderr call
[2024-11-26T16:58:30Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
-    
-[2024-11-26T16:58:31Z WARN  baml_events] Function MyFunc:
-    Client: MyClient (<unknown>) - 222ms
-    ---PROMPT---
-    [chat] user: Given a string, extract info using the schema:
-    
-    My name is Harrison. My hair is black and I'm 6 feet tall.
-    
-    Answer in JSON using this schema:
-    {
-    }
+tests/test_functions.py:1271: AssertionError
Captured stdout call
Duration no caching:  3.2215769290924072
+Duration with caching:  3.5142571926116943
+

Teardown

PASSED test_arg_exceptions 0:00:00.796212

Setup

Call

Captured stderr call
[2024-12-04T06:33:21Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
     
-    ---REQUEST OPTIONS---
-    model: "gpt-4o-mini"
-    ---ERROR (InvalidAuthentication (401))---
-    Request failed: https://api.openai.com/v1/chat/completions
-    {
-        "error": {
-            "message": "Incorrect API key provided: INVALID_KEY. You can find your API key at https://platform.openai.com/account/api-keys.",
-            "type": "invalid_request_error",
-            "param": null,
-            "code": "invalid_api_key"
-        }
-    }
+

Teardown

PASSED test_map_as_param 0:00:00.001158

Setup

Call

Captured stderr call
[2024-12-04T06:33:21Z ERROR baml_runtime::tracing]   Error: myMap: a: Expected map, got `String("b")`
     
-[2024-11-26T16:58:31Z WARN  baml_events] Function MyFunc:
-    Client: MyClient (<unknown>) - 163ms
-    ---PROMPT---
-    [chat] user: Given a string, extract info using the schema:
-    
-    My name is Harrison. My hair is black and I'm 6 feet tall.
-    
-    Answer in JSON using this schema:
-    {
-    }
-    
-    ---REQUEST OPTIONS---
-    model: "gpt-4o-mini"
-    ---ERROR (InvalidAuthentication (401))---
-    Request failed: https://api.openai.com/v1/chat/completions
-    {
-        "error": {
-            "message": "Incorrect API key provided: INVALID_KEY. You can find your API key at https://platform.openai.com/account/api-keys.",
-            "type": "invalid_request_error",
-            "param": null,
-            "code": "invalid_api_key"
-        }
-    }
-    
-[2024-11-26T16:58:31Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 393ms. StopReason: stop. Tokens(in/out): 12/3
-    ---PROMPT---
-    [chat] user: Say "hello there".
-    
-    ---LLM REPLY---
-    Hello there!
-    ---Parsed Response (Error)---
-    Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
-      - <root>: Missing required field: nonce
-      - <root>: Missing required field: nonce2
-

Teardown

PASSED test_map_as_param 0:00:00.001083

Setup

Call

Captured stderr call
[2024-11-26T16:58:31Z ERROR baml_runtime::tracing]   Error: myMap: a: Expected map, got `String("b")`
-    
-

Teardown

PASSED test_baml_validation_error_format 0:00:00.492667

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

Setup

Call

Captured stdout call
Error:  BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
   - <root>: Missing required field: nonce
-  - <root>: Missing required field: nonce2, raw_output=Hello there!, prompt=[chat] user: Say "hello there".
+  - <root>: Missing required field: nonce2, raw_output=Hello there! How can I help you today?, prompt=[chat] system: Say "hello there".
 )
-
Captured stderr call
[2024-11-26T16:58:32Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 490ms. StopReason: stop. Tokens(in/out): 12/3
-    ---PROMPT---
-    [chat] user: Say "hello there".
-    
-    ---LLM REPLY---
-    Hello there!
-    ---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_no_stream_big_integer 0:00:00.640104

Setup

Call

Captured stderr call
[2024-11-26T16:58:32Z INFO  baml_events] Function StreamOneBigNumber:
-    Client: GPT4 (gpt-4o-2024-08-06) - 637ms. StopReason: stop. Tokens(in/out): 46/4
-    ---PROMPT---
-    [chat] user: 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 an int
-    
-    ---LLM REPLY---
-    123456789012
-    ---Parsed Response (int)---
-    123456789012
-

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.617458

Setup

Call

Captured stderr call
[2024-11-26T16:58:33Z INFO  baml_events] Function StreamBigNumbers:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 614ms. StopReason: stop. Tokens(in/out): 70/24
-    ---PROMPT---
-    [chat] user: Please make sure every integer in the output has 12 digits.
-    For floats, provide a mix - from 0-10 places before the decimal point,
-    and 1-10 places after the decimal point. Bet.
-    
-    Answer in JSON using this schema:
-    {
-      a: int,
-      b: float,
-    }
-    
-    ---LLM REPLY---
-    {
-      "a": 123456789012,
-      "b": 7890.123456789
-    }
-    ---Parsed Response (class BigNumbers)---
-    {
-      "a": 123456789012,
-      "b": 7890.123456789
-    }
-

Teardown

PASSED test_no_stream_compound_object 0:00:02.732210

Setup

Call

Captured stderr call
[2024-11-26T16:58:36Z INFO  baml_events] Function StreamingCompoundNumbers:
-    Client: GPT4 (gpt-4o-2024-08-06) - 2727ms. StopReason: stop. Tokens(in/out): 133/119
-    ---PROMPT---
-    [chat] user:     Respond in pure json. Don't use any English descriptions like "Sure, I'll do that",
-        nor put the result into a fenced code block.
-    
-        Just output a JSON value that could be parsed as JSON.
-    
-    Please make sure every integer has 12 digits.
-    For floats, provide a mix - from 0-10 places before the decimal point,
-    and 1-10 places after the decimal point. Bet.
-    
-    BigNumbers {
-      a: int,
-      b: float,
-    }
-    
-    Answer in JSON using this schema:
-    {
-      big: BigNumbers,
-      big_nums: BigNumbers[],
-      another: BigNumbers,
-    }
-    
-    ---LLM REPLY---
-    {
-      "big": {
-        "a": 123456789012,
-        "b": 0.123456789
-      },
-      "big_nums": [
-        {
-          "a": 987654321098,
-          "b": 1234567.89
-        },
-        {
-          "a": 112233445566,
-          "b": 76543210.987654321
-        }
-      ],
-      "another": {
-        "a": 998877665544,
-        "b": 9876543210.1
-      }
-    }
-    ---Parsed Response (class CompoundBigNumbers)---
-    {
-      "big": {
-        "a": 123456789012,
-        "b": 0.123456789
-      },
-      "big_nums": [
-        {
-          "a": 987654321098,
-          "b": 1234567.89
-        },
-        {
-          "a": 112233445566,
-          "b": 76543210.98765433
-        }
-      ],
-      "another": {
-        "a": 998877665544,
-        "b": 9876543210.1
-      }
-    }
-

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:03.102353

Setup

Call

Captured stderr call
[2024-11-26T16:58:39Z INFO  baml_events] Function StreamingCompoundNumbers:
-    Client: GPT4 (gpt-4o-2024-08-06) - 3096ms. StopReason: stop. Tokens(in/out): 114/159
-    ---PROMPT---
-    [chat] user:     Please give me a friendly response before outputting json. And put the JSON
-        into a fenced code block.
-    
-    Please make sure every integer has 12 digits.
-    For floats, provide a mix - from 0-10 places before the decimal point,
-    and 1-10 places after the decimal point. Bet.
-    
-    BigNumbers {
-      a: int,
-      b: float,
-    }
-    
-    Answer in JSON using this schema:
-    {
-      big: BigNumbers,
-      big_nums: BigNumbers[],
-      another: BigNumbers,
-    }
-    
-    ---LLM REPLY---
-    Sure! Here you go with your requested JSON response:
-    
-    ```json
-    {
-      "big": {
-        "a": 123456789012,
-        "b": 3456789.123456
-      },
-      "big_nums": [
-        {
-          "a": 987654321234,
-          "b": 12345678.123
-        },
-        {
-          "a": 112233445566,
-          "b": 9876543210.123456789
-        },
-        {
-          "a": 998877665544,
-          "b": 1234.567
-        }
-      ],
-      "another": {
-        "a": 334455667788,
-        "b": 98765.4321
-      }
-    }
-    ```
-    ---Parsed Response (class CompoundBigNumbers)---
-    {
-      "big": {
-        "a": 123456789012,
-        "b": 3456789.123456
-      },
-      "big_nums": [
-        {
-          "a": 987654321234,
-          "b": 12345678.123
-        },
-        {
-          "a": 112233445566,
-          "b": 9876543210.123457
-        },
-        {
-          "a": 998877665544,
-          "b": 1234.567
-        }
-      ],
-      "another": {
-        "a": 334455667788,
-        "b": 98765.4321
-      }
-    }
-

Teardown

PASSED test_differing_unions 0:00:01.964311

Setup

Call

Captured stderr call
[2024-11-26T16:58:41Z INFO  baml_events] Function DifferentiateUnions:
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 1960ms. StopReason: stop. Tokens(in/out): 50/72
-    ---PROMPT---
-    [chat] user: Create a data model that represents the latter of the two classes.
-    
-    Answer in JSON using any of these schemas:
-    {
-      value: int,
-    } or {
-      value: int,
-      value2: string,
-    }
-    
-    ---LLM REPLY---
-    Sure! Below is an example of a JSON data model that represents the latter of the two classes as specified, which includes both an integer value and a string value2.
-    
-    ```json
-    {
-      "value": 42,
-      "value2": "example string"
-    }
-    ``` 
-    
-    You can replace the values with any integers and strings as per your requirements.
-    ---Parsed Response (class OriginalB)---
-    {
-      "value": 42,
-      "value2": "example string"
-    }
-

Teardown

PASSED test_return_failing_assert 0:00:00.409089

Setup

Call

Captured stderr call
[2024-11-26T16:58:41Z WARN  baml_events] Function ReturnFailingAssert:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 406ms. StopReason: stop. Tokens(in/out): 19/1
-    ---PROMPT---
-    [chat] user: Return the next integer after 1.
-    
-    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.001178

Setup

Call

Captured stderr call
[2024-11-26T16:58:41Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: small_int
+

Teardown

PASSED test_no_stream_big_integer 0:00:00.523697

Setup

Call

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.483117

Setup

Call

Teardown

PASSED test_no_stream_compound_object 0:00:06.729537

Setup

Call

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:05.083854

Setup

Call

Teardown

PASSED test_differing_unions 0:00:02.546719

Setup

Call

Teardown

PASSED test_return_failing_assert 0:00:00.302599

Setup

Call

Teardown

PASSED test_parameter_failing_assert 0:00:00.001364

Setup

Call

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

Teardown

PASSED test_failing_assert_can_stream 0:00:02.696614

Setup

Call

Captured stdout call
None
+

Teardown

PASSED test_failing_assert_can_stream 0:00:02.397616

Setup

Call

Captured stdout call
None
 None
 None
 None
@@ -3511,316 +1002,87 @@
 None
 None
 None
-
Captured stderr call
[2024-11-26T16:58:44Z WARN  baml_events] Function StreamFailingAssertion:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 2692ms. StopReason: stop. Tokens(in/out): 62/277
-    ---PROMPT---
-    [chat] user: 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.
-    Answer in JSON using this schema:
-    {
-      title: string,
-      story_a: string,
-      story_b: string,
-    }
-    
-    ---LLM REPLY---
-    {
-      "title": "Yoshimi Battles the Pink Robots",
-      "story_a": "Yoshimi was a skilled martial artist who lived in a small village plagued by metallic pink robots. The robots would terrorize the villagers, destroying their homes and crops. Yoshimi knew she had to take a stand against them. Armed with only her fighting skills and determination, she set out to defeat the robots. The battles were fierce and intense, but Yoshimi never wavered. She fought bravely, taking down each robot one by one until the village was safe once again. The villagers cheered and thanked Yoshimi for her bravery, knowing that she was their hero.",
-      "story_b": "Yoshimi was a scientist working at a research facility when she discovered a group of pink robots on a remote island. The robots seemed harmless at first, but Yoshimi soon realized they posed a threat to humanity. She knew she had to find a way to stop them before it was too late. Using her knowledge of technology and robotics, Yoshimi designed a powerful weapon to take down the robots. The battle was intense, with the robots putting up a strong fight. But Yoshimi's determination and quick thinking allowed her to defeat the robots and save humanity from their destructive plans. She was hailed as a hero and continued her work to protect the world from future threats."
-    }
-    ---Parsed Response (Error)---
-    Failed to coerce value: <root>: Failed while parsing required fields: missing=0, unparsed=2
-      - <root>: Failed to parse field story_a: <root>: Assertions failed.
-        - <root>: Assertions failed.
-      - <root>: Failed to parse field story_b: <root>: Assertions failed.
-        - <root>: Assertions failed.
-

Teardown

PASSED test_simple_recursive_type 0:00:14.575534

Setup

Call

Captured stderr call
[2024-11-26T16:58:58Z INFO  baml_events] Function BuildLinkedList:
-    Client: O1 (o1-mini-2024-09-12) - 14571ms. StopReason: stop. Tokens(in/out): 81/293
-    ---PROMPT---
-    [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:
-    {
-      head: Node or null,
-      len: int,
-    }
-    
-    ---LLM REPLY---
-    ```json
-    {
-      "head": {
-        "data": 1,
-        "next": {
-          "data": 2,
-          "next": {
-            "data": 3,
-            "next": {
-              "data": 4,
-              "next": {
-                "data": 5,
-                "next": null
-              }
-            }
-          }
-        }
-      },
-      "len": 5
-    }
-    ```
-    ---Parsed Response (class LinkedList)---
-    {
-      "head": {
-        "data": 1,
-        "next": {
-          "data": 2,
-          "next": {
-            "data": 3,
-            "next": {
-              "data": 4,
-              "next": {
-                "data": 5,
-                "next": null
-              }
-            }
-          }
-        }
-      },
-      "len": 5
-    }
-

Teardown

PASSED test_mutually_recursive_type 0:00:02.094296

Setup

Call

Captured stderr call
[2024-11-26T16:59:01Z INFO  baml_events] Function BuildTree:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 2088ms. StopReason: stop. Tokens(in/out): 216/190
-    ---PROMPT---
-    [chat] user: Given the input binary tree, transform it into a generic tree using the given schema.
-    
-    INPUT:
-    {
-        "left": {
-            "data": 3,
-            "right": {
-                "left": none,
-                "right": none,
-                "data": 4,
-            },
-            "left": {
-                "data": 1,
-                "right": none,
-                "left": {
-                    "left": none,
-                    "data": 2,
-                    "right": none,
-                },
-            },
-        },
-        "data": 5,
-        "right": {
-            "left": {
-                "data": 6,
-                "right": none,
-                "left": none,
-            },
-            "right": {
-                "left": none,
-                "data": 8,
-                "right": none,
-            },
-            "data": 7,
-        },
-    }
-    
-    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_block_constraints 0:00:00.558275

Setup

Call

Captured stderr call
[2024-11-26T16:59:01Z INFO  baml_events] Function MakeBlockConstraint:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 555ms. StopReason: stop. Tokens(in/out): 42/20
-    ---PROMPT---
-    [chat] user: Generate an output in the following schema with a short string and a large int.
-    
-    Answer in JSON using this schema:
-    {
-      foo: int,
-      bar: string,
-    }
-    
-    ---LLM REPLY---
-    {
-      "foo": 1000000,
-      "bar": "Hello, World!"
-    }
-    ---Parsed Response (class BlockConstraint)---
-    {
-      "value": {
-        "foo": 1000000,
-        "bar": "Hello, World!"
-      },
-      "checks": {
-        "cross_field": {
-          "name": "cross_field",
-          "expression": "this.bar|length > this.foo",
-          "status": "failed"
-        }
-      }
-    }
-

Teardown

PASSED test_nested_block_constraints 0:00:00.536772

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-26T16:59:02Z INFO  baml_events] Function MakeNestedBlockConstraint:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 534ms. StopReason: stop. Tokens(in/out): 52/24
-    ---PROMPT---
-    [chat] user: Generate an output where the inner foo is 1 and the inner bar is "hello".
-      Answer in JSON using this schema:
-    {
-      nbc: {
-        foo: int,
-        bar: string,
-      },
-    }
-    
-    ---LLM REPLY---
-    {
-      "nbc": {
-        "foo": 1,
-        "bar": "hello"
-      }
-    }
-    ---Parsed Response (class NestedBlockConstraint)---
-    {
-      "nbc": {
-        "value": {
-          "foo": 1,
-          "bar": "hello"
-        },
-        "checks": {
-          "cross_field": {
-            "name": "cross_field",
-            "expression": "this.bar|length > this.foo",
-            "status": "succeeded"
-          }
-        }
-      }
-    }
-

Teardown

PASSED test_block_constraint_arguments 0:00:00.001750

Setup

Call

Captured stderr call
[2024-11-26T16:59:02Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+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
+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_simple_recursive_type 0:00:02.784238

Setup

Call

Teardown

PASSED test_mutually_recursive_type 0:00:02.297518

Setup

Call

Teardown

PASSED test_block_constraints 0:00:00.800160

Setup

Call

Teardown

PASSED test_nested_block_constraints 0:00:00.603441

Setup

Call

Captured stdout call
nbc=Checked[BlockConstraint, Literal['cross_field']](value=BlockConstraint(foo=1, bar='hello'), checks={'cross_field': Check(name='cross_field', expression='this.bar|length > this.foo', status='succeeded')})
+

Teardown

PASSED test_block_constraint_arguments 0:00:00.001755

Setup

Call

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

Teardown

tests/test_pydantic.py 3 0:00:00.001747

PASSED test_model_validate_success 0:00:00.000737

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000483

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000526

Setup

Call

Teardown

\ No newline at end of file +

Teardown

tests/test_pydantic.py 3 0:00:00.003358

PASSED test_model_validate_success 0:00:00.001464

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000840

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.001054

Setup

Call

Teardown

\ No newline at end of file diff --git a/integ-tests/ruby/baml_client/inlined.rb b/integ-tests/ruby/baml_client/inlined.rb index ff709a0ab..d5e68cb15 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.69.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.69.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.69.0\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.69.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.70.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.0\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.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 da86e8e0e..37f003dba 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.69.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.69.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.69.0\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.69.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.70.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.0\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.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 d497dffff..b15e66c77 100644 --- a/integ-tests/typescript/test-report.html +++ b/integ-tests/typescript/test-report.html @@ -257,4 +257,1245 @@ font-size: 1rem; padding: 0 0.5rem; } -

Test Report

Started: 2024-12-03 15:57:41
Suites (1)
1 passed
0 failed
0 pending
Tests (67)
1 passed
0 failed
66 pending
Integ tests > should work for all inputs
single bool
pending
0s
Integ tests > should work for all inputs
single string list
pending
0s
Integ tests > should work for all inputs
return literal union
pending
0s
Integ tests > should work for all inputs
single class
pending
0s
Integ tests > should work for all inputs
multiple classes
pending
0s
Integ tests > should work for all inputs
single enum list
pending
0s
Integ tests > should work for all inputs
single float
pending
0s
Integ tests > should work for all inputs
single int
pending
0s
Integ tests > should work for all inputs
single literal int
pending
0s
Integ tests > should work for all inputs
single literal bool
pending
0s
Integ tests > should work for all inputs
single literal string
pending
0s
Integ tests > should work for all inputs
single class with literal prop
pending
0s
Integ tests > should work for all inputs
single class with literal union prop
pending
0s
Integ tests > should work for all inputs
single optional string
pending
0s
Integ tests > should work for all inputs
single map string to string
pending
0s
Integ tests > should work for all inputs
single map string to class
pending
0s
Integ tests > should work for all inputs
single map string to map
pending
0s
Integ tests > should work for all inputs
enum key in map
pending
0s
Integ tests > should work for all inputs
literal string union key in map
pending
0s
Integ tests > should work for all inputs
single literal string key in map
pending
0s
Integ tests
should work for all outputs
pending
0s
Integ tests
works with retries1
pending
0s
Integ tests
works with retries2
pending
0s
Integ tests
works with fallbacks
pending
0s
Integ tests
should work with image from url
pending
0s
Integ tests
should work with image from base 64
pending
0s
Integ tests
should work with audio base 64
pending
0s
Integ tests
should work with audio from url
pending
0s
Integ tests
should support streaming in OpenAI
pending
0s
Integ tests
should support streaming in Gemini
pending
0s
Integ tests
should support AWS
pending
0s
Integ tests
should support streaming in AWS
pending
0s
Integ tests
should allow overriding the region
pending
0s
Integ tests
should support OpenAI shorthand
pending
0s
Integ tests
should support OpenAI shorthand streaming
pending
0s
Integ tests
should support anthropic shorthand
pending
0s
Integ tests
should support anthropic shorthand streaming
pending
0s
Integ tests
should support streaming without iterating
pending
0s
Integ tests
should support streaming in Claude
pending
0s
Integ tests
should support vertex
pending
0s
Integ tests
supports tracing sync
pending
0s
Integ tests
supports tracing async
pending
0s
Integ tests
should work with dynamic types single
pending
0s
Integ tests
should work with dynamic types enum
pending
0s
Integ tests
should work with dynamic literals
pending
0s
Integ tests
should work with dynamic types class
pending
0s
Integ tests
should work with dynamic inputs class
pending
0s
Integ tests
should work with dynamic inputs list
pending
0s
Integ tests
should work with dynamic output map
pending
0s
Integ tests
should work with dynamic output union
pending
0s
Integ tests
should work with nested classes
pending
0s
Integ tests
should work with dynamic client
pending
0s
Integ tests
should work with 'onLogEvent'
pending
0s
Integ tests
should work with a sync client
pending
0s
Integ tests
should raise an error when appropriate
pending
0s
Integ tests
should raise a BAMLValidationError
passed
0.875s
Integ tests
should reset environment variables correctly
pending
0s
Integ tests
should use aliases when serializing input objects - classes
pending
0s
Integ tests
should use aliases when serializing, but still have original keys in jinja
pending
0s
Integ tests
should use aliases when serializing input objects - enums
pending
0s
Integ tests
should use aliases when serializing input objects - lists
pending
0s
Integ tests
constraints: should handle checks in return types
pending
0s
Integ tests
constraints: should handle checks in returned unions
pending
0s
Integ tests
constraints: should handle block-level checks
pending
0s
Integ tests
constraints: should handle nested-block-level checks
pending
0s
Integ tests
simple recursive type
pending
0s
Integ tests
mutually recursive type
pending
0s
\ No newline at end of file +

Test Report

Started: 2024-12-03 22:28:38
Suites (1)
0 passed
1 failed
0 pending
Tests (67)
65 passed
2 failed
0 pending
Integ tests > should work for all inputs
single bool
passed
0.783s
Integ tests > should work for all inputs
single string list
passed
0.427s
Integ tests > should work for all inputs
return literal union
passed
0.379s
Integ tests > should work for all inputs
single class
passed
0.455s
Integ tests > should work for all inputs
multiple classes
passed
0.354s
Integ tests > should work for all inputs
single enum list
passed
0.382s
Integ tests > should work for all inputs
single float
passed
0.424s
Integ tests > should work for all inputs
single int
passed
0.455s
Integ tests > should work for all inputs
single literal int
passed
0.3s
Integ tests > should work for all inputs
single literal bool
passed
0.601s
Integ tests > should work for all inputs
single literal string
passed
0.316s
Integ tests > should work for all inputs
single class with literal prop
passed
0.524s
Integ tests > should work for all inputs
single class with literal union prop
passed
3.24s
Integ tests > should work for all inputs
single optional string
passed
0.43s
Integ tests > should work for all inputs
single map string to string
passed
0.524s
Integ tests > should work for all inputs
single map string to class
passed
0.558s
Integ tests > should work for all inputs
single map string to map
passed
0.521s
Integ tests > should work for all inputs
enum key in map
passed
0.805s
Integ tests > should work for all inputs
literal string union key in map
passed
0.735s
Integ tests > should work for all inputs
single literal string key in map
passed
0.546s
Integ tests
should work for all outputs
passed
4.698s
Integ tests
works with retries1
passed
1.184s
Integ tests
works with retries2
passed
2.143s
Integ tests
works with fallbacks
passed
1.991s
Integ tests
should work with image from url
passed
1.839s
Integ tests
should work with image from base 64
passed
1.328s
Integ tests
should work with audio base 64
passed
1.158s
Integ tests
should work with audio from url
passed
1.171s
Integ tests
should support streaming in OpenAI
passed
3.161s
Integ tests
should support streaming in Gemini
passed
7.739s
Integ tests
should support AWS
passed
1.883s
Integ tests
should support streaming in AWS
passed
1.524s
Integ tests
should allow overriding the region
passed
0.08s
Integ tests
should support OpenAI shorthand
passed
9.47s
Integ tests
should support OpenAI shorthand streaming
passed
7.945s
Integ tests
should support anthropic shorthand
passed
3.566s
Integ tests
should support anthropic shorthand streaming
passed
3.256s
Integ tests
should support streaming without iterating
passed
2.014s
Integ tests
should support streaming in Claude
passed
1.12s
Integ tests
should support vertex
passed
11.387s
Integ tests
supports tracing sync
passed
0.01s
Integ tests
supports tracing async
passed
2.306s
Integ tests
should work with dynamic types single
passed
1.641s
Integ tests
should work with dynamic types enum
passed
0.848s
Integ tests
should work with dynamic literals
passed
0.961s
Integ tests
should work with dynamic types class
passed
1.049s
Integ tests
should work with dynamic inputs class
passed
0.597s
Integ tests
should work with dynamic inputs list
passed
0.995s
Integ tests
should work with dynamic output map
passed
0.759s
Integ tests
should work with dynamic output union
passed
1.62s
Integ tests
should work with nested classes
failed
10.39s
Error: expect(received).toEqual(expected) // deep equality
+
+- Expected  - 1
++ Received  + 1
+
+  Object {
+    "prop1": "hello",
+    "prop2": Object {
+      "inner": Object {
+        "prop2": 42,
+-       "prop3": 3.14,
++       "prop3": null,
+      },
+      "prop1": "world",
+      "prop2": "again",
+    },
+  }
+    at Object.toEqual (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:604:25)
Integ tests
should work with dynamic client
passed
0.377s
Integ tests
should work with 'onLogEvent'
passed
1.83s
Integ tests
should work with a sync client
passed
0.718s
Integ tests
should raise an error when appropriate
passed
0.734s
Integ tests
should raise a BAMLValidationError
passed
0.496s
Integ tests
should reset environment variables correctly
passed
1.114s
Integ tests
should use aliases when serializing input objects - classes
passed
0.801s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.944s
Integ tests
should use aliases when serializing input objects - enums
passed
0.531s
Integ tests
should use aliases when serializing input objects - lists
passed
0.518s
Integ tests
constraints: should handle checks in return types
passed
0.703s
Integ tests
constraints: should handle checks in returned unions
passed
0.614s
Integ tests
constraints: should handle block-level checks
passed
0.512s
Integ tests
constraints: should handle nested-block-level checks
passed
0.583s
Integ tests
simple recursive type
passed
3.062s
Integ tests
mutually recursive type
failed
1.974s
Error: expect(received).toEqual(expected) // deep equality
+
+- Expected  - 6
++ Received  + 5
+
+@@ -4,30 +4,29 @@
+        Object {
+          "children": Object {
+            "trees": Array [
+              Object {
+                "children": Object {
+-                 "trees": Array [
++                 "trees": Array [],
++               },
++               "data": 1,
++             },
+              Object {
+                "children": Object {
+                  "trees": Array [],
+                },
+                "data": 2,
+              },
+            ],
+          },
+-               "data": 1,
++         "data": 3,
+        },
+        Object {
+          "children": Object {
+            "trees": Array [],
+          },
+          "data": 4,
+-             },
+-           ],
+-         },
+-         "data": 3,
+        },
+        Object {
+          "children": Object {
+            "trees": Array [
+              Object {
+    at Object.toEqual (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:838:17)
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:48:15)
+    at 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:54:15)
got response key
+true
+52
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:194:15)
Expected error Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "RetryClientConstant", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1733293736, tv_nsec: 692524000 }, latency: 260.464458ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blah. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+    at BamlAsyncClient.parsed [as TestRetryConstant] (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:2810:18)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:191:7) {
+  code: 'GenericFailure'
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:203:15)
Expected error Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "RetryClientExponential", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1733293738, tv_nsec: 928829000 }, latency: 188.79025ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+    at BamlAsyncClient.parsed [as TestRetryExponential] (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:2835:18)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:200:7) {
+  code: 'GenericFailure'
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:362: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:371: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:365: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:371: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:368: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:371: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:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389: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:401:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389: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:401:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389: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:401:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394: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:401:5)
dummy hi1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389: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:401:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389: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:401:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389: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:401:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394: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:401:5)
dummy hi2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389: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:401:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389: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:401:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383: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:389: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:401:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394: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:401:5)
dummy hi3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:408: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:424:5)
hello world
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394: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:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389: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:413: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:407:17)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389: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:413: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:407:17)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383: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:389: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:413: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:407:17)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394: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:413: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:407:17)
dummy secondDummyFuncArg
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389: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:421: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:407:17)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383: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 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389: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:421: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:407:17)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383: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:389: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:421: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:407:17)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394: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:421: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:407:17)
dummy thirdDummyFuncArg
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:427: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:433:5)
hello world
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:437: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:461: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:530: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:532: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:532: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:540: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:564:13)
+    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
+    at new Promise (<anonymous>)
+    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:566: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:566: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:566: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:574:13)
final  {
+  hair_color: 'black',
+  attributes: { eye_color: 'blue', facial_hair: 'beard' },
+  height: { feet: 6, inches: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:585:13)
final  {
+  hair_color: 'black',
+  attributes: { eye_color: 'blue', facial_hair: 'beard' },
+  height: { meters: 1.8 }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: '', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: '', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: '', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: 'ag', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: {
+    prop1: 'world',
+    prop2: 'again',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: {
+    prop1: 'world',
+    prop2: 'again',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: {
+    prop1: 'world',
+    prop2: 'again',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: {
+    prop1: 'world',
+    prop2: 'again',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: {
+    prop1: 'world',
+    prop2: 'again',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: {
+    prop1: 'world',
+    prop2: 'again',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: {
+    prop1: 'world',
+    prop2: 'again',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: {
+    prop1: 'world',
+    prop2: 'again',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: {
+    prop1: 'world',
+    prop2: 'again',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: {
+    prop1: 'world',
+    prop2: 'again',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: {
+    prop1: 'world',
+    prop2: 'again',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:623:15)
+    at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:70:17)
onLogEvent {
+  metadata: {
+    eventId: '3ba42dd3-7328-4270-b476-0d52a0c451b9',
+    rootEventId: '3ba42dd3-7328-4270-b476-0d52a0c451b9'
+  },
+  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-12-04T06:30:21.857Z'
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:623:15)
+    at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:70:17)
onLogEvent {
+  metadata: {
+    eventId: '85f3901f-ce3e-4eda-bf67-1e6b1164a424',
+    rootEventId: '85f3901f-ce3e-4eda-bf67-1e6b1164a424'
+  },
+  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-12-04T06:30:22.354Z'
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:657:15)
Error: Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "MyClient", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Given a string, extract info using the schema:\n\nMy name is Harrison. My hair is black and I'm 6 feet tall.\n\nAnswer in JSON using this schema:\n{\n}")] }]), request_options: {"model": String("gpt-4o-mini")}, start_time: SystemTime { tv_sec: 1733293824, tv_nsec: 6034000 }, latency: 139.540125ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: INVALID_KEY. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+    at BamlAsyncClient.parsed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:1585:18)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:654:7) {
+  code: 'GenericFailure'
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:665:17)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:661: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:79:28)
+    at from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:92:53)
+    at BamlAsyncClient.DummyOutputFunction (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:562:50)
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:663:9
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:661: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:677: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:79:28)
+    at from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:92:53)
+    at BamlAsyncClient.DummyOutputFunction (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:562:50)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:673:7) {
+  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:777: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