diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py index b5816bd6d..5ad6ca5a3 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.70.3\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.3\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.3\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.3\"\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.4\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.4\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.4\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.4\"\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 a4a427278..c0d92aea1 100644 --- a/integ-tests/python/report.html +++ b/integ-tests/python/report.html @@ -3,115 +3,107 @@
Test Report

Summary

102
1 failed 101 passed

Tests

tests/test_functions.py 196 0:03:21.336106

PASSED test_env_vars_reset 0:00:01.639073

Setup

Call

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

Summary

102
102 passed

Tests

tests/test_functions.py 97 0:03:22.465711

PASSED test_env_vars_reset 0:00:01.585552

Setup

Call

Captured stdout call
Context depth is greater than 0!
 Except but ending trace!
 Context depth is greater than 0!
-

Teardown

PASSED test_sync 0:00:00.379372

Setup

Call

Captured stdout call
got response key
+

Teardown

PASSED test_sync 0:00:00.354235

Setup

Call

Captured stdout call
got response key
 true
 52
-

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.357382

Setup

Call

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.402475

Setup

Call

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.295483

Setup

Call

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.888322

Setup

Call

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.685340

Setup

Call

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.518604

Setup

Call

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001351

Setup

Call

Captured stderr call
[2024-12-13T14:43:59Z 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_bool 0:00:00.353408

Setup

Call

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.405568

Setup

Call

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.428085

Setup

Call

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.699829

Setup

Call

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.669447

Setup

Call

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.444137

Setup

Call

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001372

Setup

Call

Captured stderr call
[2024-12-13T15:04:04Z 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.543946

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.497059

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.334611

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.496148

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.468120

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.359473

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.469610

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.384702

Setup

Call

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:02.507968

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.842896

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.430881

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.520728

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.645153

Setup

Call

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:00.958619

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.829144

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:00.857554

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:04.571512

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.207045

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:01.502978

Setup

Call

Teardown

PASSED test_should_work_with_vertex 0:00:09.456202

Setup

Call

Teardown

PASSED test_should_work_with_image_base64 0:00:01.368518

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.270973

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.240454

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:02.300726

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: 1734101073, tv_nsec: 153707000 }, latency: 219.235041ms, 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.609568

Setup

Call

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.037850

Setup

Call

Teardown

PASSED test_claude 0:00:01.024236

Setup

Call

Teardown

PASSED test_gemini 0:00:07.287290

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pete Pepper wasn't a medical doctor, despite what his name tag proclaimed. He was, in fact, a humble, if slightly eccentric, soda jerk at a vintage soda fountain in a town that time seemed to have forgotten. His concoctions, however, were legendary. 
+

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.421985

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.475687

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.429657

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.303339

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.317512

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.286368

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.543175

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.456703

Setup

Call

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:02.918372

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.482259

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.790809

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.573659

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.500889

Setup

Call

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:01.214129

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.663402

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:00.394802

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:04.185906

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.573777

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:01.319235

Setup

Call

Teardown

PASSED test_should_work_with_vertex 0:00:08.744991

Setup

Call

Teardown

PASSED test_should_work_with_image_base64 0:00:01.471288

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.439186

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.702215

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:02.212101

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: 1734102277, tv_nsec: 591369000 }, latency: 250.555083ms, 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.982022

Setup

Call

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.032832

Setup

Call

Teardown

PASSED test_claude 0:00:01.146224

Setup

Call

Teardown

PASSED test_gemini 0:00:08.398163

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pepper wasn't a real doctor, of course. He was just a little firefly, the smallest one in his whole family. But Dr. Pepper had big dreams. He didn't just want to flicker; he wanted to shine, to light up the whole meadow with his bioluminescent brilliance.
 
-One sweltering afternoon, a young woman named Lily slumped onto a stool, her face etched with worry. "Dr. Pete," she sighed, "I think my dream is fading faster than a scoop of ice cream on a summer day."
+"Aim for the moon, little brother," his eldest sister, Flicker, would always tell him. "Even if you miss, you'll land among the stars." 
 
-Dr. Pete, a twinkle in his eye, pulled out a glass taller than usual. "Don't you worry, my dear. Every dream deserves a fighting chance." He poured in a secret blend of syrups – a dash of hope, a splash of courage, a sprinkle of resilience. Then, with a flourish, he added the final touch – a miniature paper umbrella.
+Inspired, Dr. Pepper spent his days collecting dewdrops, convinced they held the secret to a brighter glow. He'd mix them with pollen and moonlight, meticulously recording each recipe in a tiny notebook he kept tucked under his wing. 
 
-Lily took a tentative sip. Her eyes widened. The concoction danced on her tongue, a melody of unexpected flavors, both familiar and surprising. It was sweet, yet spicy, fizzy, yet comforting – an explosion of pure possibility. 
+One cool evening, a group of fireflies huddled together, their light noticeably dimmer. A storm was brewing, and they relied on their glow to communicate.
 
-"Wow," she breathed, a smile blooming on her face.  "What is this magical elixir?"
+"My signal is failing!" one cried. "I can't reach my cousin Barry!"
 
-Dr. Pete chuckled. "Why, it's a Dream Reviver, of course. One sip, and you'll remember what you're fighting for."
+Dr. Pepper, who had been studying a particularly shimmering dewdrop, knew this was his moment. He scurried over, his tiny heart thumping. 
 
-And Lily did. With each sip, her worries seemed to shrink, replaced by a renewed sense of purpose. Dr. Pete, watching her, smiled. He knew the truth – the magic wasn't just in the drink, but in the courage to chase a dream, one delicious sip at a time. 
+"Don't worry!" he declared. "I, Dr. Pepper, have just the thing!"
 
-

Teardown

PASSED test_gemini_streaming 0:00:10.179859

Setup

Call

Captured stdout call
LLM output from Gemini: The old diner was quiet, save for the rhythmic sizzle of the grill and the gentle hum of the ceiling fan, stirring the air thick with the scent of frying onions and coffee. Behind the counter, Millie, with a knowing smile crinkling the corners of her eyes, filled a frosty glass with the beverage gun, the familiar caramel-colored liquid fizzing into the glass.
+He presented his latest concoction: a blend of dawn dew and firefly pollen, energized by a sliver of moonlight. He carefully applied a drop to each firefly's lantern. 
 
-"One Dr. Pepper, just how you like it, hon," she announced, placing the glass on the counter before a young woman with tired eyes and a messy bun. 
+As if by magic, their lights blazed with renewed intensity, brighter than ever before. The meadow was bathed in a warm, pulsating glow. 
 
-The woman, Sarah, smiled wearily. "You know me too well, Millie." 
+From then on, Dr. Pepper, the little firefly with the big dream, became the official glow-boosting doctor of the meadow. He might not have been a real doctor, but he proved that even the smallest among us can make a brilliant difference. 
 
-She took a long sip, the sweet, slightly spicy drink a comforting balm to her exhaustion. Sarah had been working late nights at the library, researching for her thesis, the pressure mounting as her deadline loomed closer.  
+

Teardown

PASSED test_gemini_streaming 0:00:09.820687

Setup

Call

Captured stdout call
LLM output from Gemini: Dottie "Dr. Pepper" Peterson wasn't actually a doctor. Not the kind that hung a shingle or wore a stethoscope anyway. Dottie was a mechanic, the best shade-tree, grease-stained, wrench-wielding mechanic this side of the Mississippi. 
 
-"Another all-nighter?" Millie asked, already refilling Sarah's coffee.
+Her "office" was a rambling old gas station on the outskirts of Harmony Creek, a town content to live in the shadow of its brighter, bigger brother city just a stone's throw away. The air always smelled faintly of gasoline and something sugary sweet Dottie added to her legendary homemade root beer. 
 
-Sarah nodded. "I'm so close to finishing, Millie, but I feel like I’m hitting a wall."
+Folks said Dottie could coax life back into anything with an engine. They brought her beat-up pickups, sputtering motorcycles, even the occasional rusty tractor. And Dottie, with a twinkle in her eye and a smudge of grease across her cheek, always delivered. 
 
-Millie leaned against the counter, her gaze softening. "Sometimes, honey, you just gotta step back, clear your head. Let your thoughts settle like the syrup at the bottom of a Dr. Pepper." 
+One sweltering summer day, a vintage cherry-red convertible sputtered its way onto Dottie's lot, trailing a plume of smoke. A young man, all slicked-back hair and nervous energy, hopped out. This was Billy, heir to the Carson fortune, and his grandfather's prized possession was coughing its last.
 
-Sarah chuckled. "That's oddly specific, Millie, but I get your point."
+Dottie, unfazed by the fancy car or the worry etched on Billy's face, popped the hood. She poked, prodded, and muttered to herself in a language only she and the car seemed to understand.  Finally, with a triumphant grin, she held up a tiny, corroded part. 
 
-Taking another sip, Sarah let Millie's words sink in. She needed a break, a moment to breathe. Maybe a walk by the river, watching the sunrise, would clear her head. 
+"Fuel pump's had its day, sonny. But don't you worry," she winked, "Dr. Pepper's got just the cure."
 
-As if reading her mind, Millie placed a paper bag on the counter. "Here," she said, "a little something for your walk."
+Two days later, Billy sat on a stool by the open garage door, sipping Dottie's homemade root beer, its sweet, spicy flavor a revelation. The setting sun bathed the lot in a warm glow as Dottie tinkered with the final touches. When she finally turned the key, the engine roared to life, smoother and stronger than ever.
 
-Inside, Sarah found a freshly baked muffin and, to her surprise, another Dr. Pepper. 
+Billy beamed, gratitude shining in his eyes. He knew he hadn't just found a mechanic; he'd found someone who understood the language of passion and dedication that whispered from the heart of a vintage engine. He'd found Dr. Pepper, and she was just what he, and his grandfather's car, needed. 
 
-"Millie, you're an angel," Sarah said, her heart full. 
+

Teardown

PASSED test_aws 0:00:01.693974

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:18.634061

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:09.031010

Setup

Call

Teardown

PASSED test_anthropic_shorthand 0:00:03.987248

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:02.828325

Setup

Call

Teardown

PASSED test_fallback_to_shorthand 0:00:01.221166

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:01.693609

Setup

Call

Teardown

PASSED test_streaming 0:00:03.932973

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:02.449438

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:02.844836

Setup

Call

Teardown

PASSED test_streaming_uniterated_sync 0:00:02.818222

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:01.109030

Setup

Call

Captured stdout call
msgs:
+Here's a haiku about Mt. Rainier:
 
-Later, sitting by the river, watching the sky turn from indigo to a soft peach, Sarah took a long drink, the familiar taste strangely refreshing, a symbol of comfort and hope. Millie was right; sometimes, all it took was a little break, a change of scenery, and a trusty Dr. Pepper to reset and find your stride again. And as the sun rose, painting the sky with vibrant hues, Sarah felt a renewed sense of energy, ready to tackle her work, and anything else life threw her way, one sip at a time. 
-
-

Teardown

PASSED test_aws 0:00:01.726740

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:10.360040

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:09.784197

Setup

Call

Teardown

PASSED test_anthropic_shorthand 0:00:03.076218

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.144981

Setup

Call

Teardown

PASSED test_fallback_to_shorthand 0:00:00.829804

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:01.520993

Setup

Call

Teardown

PASSED test_streaming 0:00:03.573813

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:03.298885

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:04.432857

Setup

Call

Teardown

PASSED test_streaming_uniterated_sync 0:00:02.071824

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:01.047544

Setup

Call

Captured stdout call
msgs:
-Here's a haiku about Mt. Rainier's height:
-
-Rainier towers high
-Fourteen thousand feet of snow
-Guardian of sound
+Rainier stands proud, strong
+Piercing through clouds to bright sky
+Mountain king supreme
 final:
-Here's a haiku about Mt. Rainier's height:
-
-Rainier towers high
-Fourteen thousand feet of snow
-Guardian of sound
-

Teardown

PASSED test_streaming_gemini 0:00:09.221093

Setup

Call

Captured stdout call
msgs:
-The old diner was quiet, the air thick with the smell of frying onions and yesterday's coffee. Behind the counter, Millie polished glasses with the practiced ease of someone who'd done it a thousand times before. She glanced at the clock – 11:47. Almost time.
+Here's a haiku about Mt. Rainier:
 
-Just then, the bell above the door chimed, announcing a customer. In strolled a man unlike any other, radiating an aura of effortless cool. He wore a crisp fedora tilted at a rakish angle, a pinstriped suit that whispered of forgotten speakeasies, and a smile that could charm the chrome off a Cadillac. 
+Rainier stands proud, strong
+Piercing through clouds to bright sky
+Mountain king supreme
+

Teardown

PASSED test_streaming_gemini 0:00:09.248398

Setup

Call

Captured stdout call
msgs:
+The old diner hummed with the familiar tune of sizzling burgers and clinking silverware. The air, thick with the scent of frying onions and coffee, felt like a warm hug on a cold day. At a corner booth, sat a man, his fedora casting a shadow over his wrinkled face. He nursed a cup of coffee, his gaze lost somewhere beyond the checkered floor tiles. 
 
-"Afternoon, Millie," he drawled, his voice smooth as melted caramel. "The usual, please."
+His name was William, and for as long as anyone could remember, he'd been a regular at Millie's Diner. He always ordered the same thing - black coffee and a slice of apple pie. But today, something was different. He looked…lost.
 
-Millie grinned, already filling a tall glass with ice. "Coming right up, Dr. Pepper."
+Millie, the owner with a heart as big as her legendary blueberry pancakes, noticed his somber mood.  She poured him a fresh cup of coffee and placed a familiar red can next to it. "Something a little stronger than usual, hon?" she asked, her voice a warm melody.
 
-He always took the stool at the end, a silent guardian of the diner's corner booth. He never ordered anything but Dr Pepper, his namesake, and he always had a story to tell. 
+William looked up, surprised. "Dr. Pepper? For me?" 
 
-Today's tale was about a high-stakes poker game in a dusty saloon, where a mysterious woman in a red dress held the fate of a gold mine in her hand. As he spoke, his voice painted vivid pictures, transporting Millie and the few other patrons to another time, another world. 
+Millie chuckled. "Saw you staring at the young couple at booth three sharing one. Figured you could use a trip down memory lane."
 
-He spoke of dusty trails and roaring trains, of love found and lost in the blink of an eye. He spoke of adventure, of intrigue, of a life lived on the edge, where every sip of Dr Pepper was a moment savored. 
+He took a slow sip, the sweet, spicy taste instantly transporting him back decades. He was back in his college days, young and nervous, mustering the courage to talk to the beautiful redhead at the soda fountain. Her laugh echoed in his ears, the memory as vivid as the day it was made. She was gone now, but the feeling… that never faded.
 
-As quickly as it began, the story ended. Dr. Pepper drained the last drop from his glass, the ice clinking like a satisfied sigh. He tipped his hat to Millie, a twinkle in his eye.
+A small smile touched his lips. "Thank you, Millie," he murmured. 
 
-"Until next time," he said, his voice barely a whisper. 
+He spent the rest of the afternoon lost in memories, each sip of Dr. Pepper a sip of the past. The familiar taste wasn't just a drink, it was a time machine, a reminder of love, laughter, and life lived to the fullest.  
 
-And with a wink, he was gone, leaving behind the faint scent of spice and the echo of a life well-lived. Millie watched him go, a small smile playing on her lips.  In her little corner of the world, for a fleeting moment, the ordinary had become extraordinary, all thanks to the man called Dr. Pepper. 
+And as the sun dipped low, casting long shadows across the diner, William knew he wouldn't trade those memories for anything. They were bittersweet, tinged with sadness, but they were his. And for that, he was grateful, just as he was grateful for Millie and the unexpected comfort of a simple Dr. Pepper. 
 
 final:
-The old diner was quiet, the air thick with the smell of frying onions and yesterday's coffee. Behind the counter, Millie polished glasses with the practiced ease of someone who'd done it a thousand times before. She glanced at the clock – 11:47. Almost time.
+The old diner hummed with the familiar tune of sizzling burgers and clinking silverware. The air, thick with the scent of frying onions and coffee, felt like a warm hug on a cold day. At a corner booth, sat a man, his fedora casting a shadow over his wrinkled face. He nursed a cup of coffee, his gaze lost somewhere beyond the checkered floor tiles. 
 
-Just then, the bell above the door chimed, announcing a customer. In strolled a man unlike any other, radiating an aura of effortless cool. He wore a crisp fedora tilted at a rakish angle, a pinstriped suit that whispered of forgotten speakeasies, and a smile that could charm the chrome off a Cadillac. 
+His name was William, and for as long as anyone could remember, he'd been a regular at Millie's Diner. He always ordered the same thing - black coffee and a slice of apple pie. But today, something was different. He looked…lost.
 
-"Afternoon, Millie," he drawled, his voice smooth as melted caramel. "The usual, please."
+Millie, the owner with a heart as big as her legendary blueberry pancakes, noticed his somber mood.  She poured him a fresh cup of coffee and placed a familiar red can next to it. "Something a little stronger than usual, hon?" she asked, her voice a warm melody.
 
-Millie grinned, already filling a tall glass with ice. "Coming right up, Dr. Pepper."
+William looked up, surprised. "Dr. Pepper? For me?" 
 
-He always took the stool at the end, a silent guardian of the diner's corner booth. He never ordered anything but Dr Pepper, his namesake, and he always had a story to tell. 
+Millie chuckled. "Saw you staring at the young couple at booth three sharing one. Figured you could use a trip down memory lane."
 
-Today's tale was about a high-stakes poker game in a dusty saloon, where a mysterious woman in a red dress held the fate of a gold mine in her hand. As he spoke, his voice painted vivid pictures, transporting Millie and the few other patrons to another time, another world. 
+He took a slow sip, the sweet, spicy taste instantly transporting him back decades. He was back in his college days, young and nervous, mustering the courage to talk to the beautiful redhead at the soda fountain. Her laugh echoed in his ears, the memory as vivid as the day it was made. She was gone now, but the feeling… that never faded.
 
-He spoke of dusty trails and roaring trains, of love found and lost in the blink of an eye. He spoke of adventure, of intrigue, of a life lived on the edge, where every sip of Dr Pepper was a moment savored. 
+A small smile touched his lips. "Thank you, Millie," he murmured. 
 
-As quickly as it began, the story ended. Dr. Pepper drained the last drop from his glass, the ice clinking like a satisfied sigh. He tipped his hat to Millie, a twinkle in his eye.
+He spent the rest of the afternoon lost in memories, each sip of Dr. Pepper a sip of the past. The familiar taste wasn't just a drink, it was a time machine, a reminder of love, laughter, and life lived to the fullest.  
 
-"Until next time," he said, his voice barely a whisper. 
+And as the sun dipped low, casting long shadows across the diner, William knew he wouldn't trade those memories for anything. They were bittersweet, tinged with sadness, but they were his. And for that, he was grateful, just as he was grateful for Millie and the unexpected comfort of a simple Dr. Pepper. 
 
-And with a wink, he was gone, leaving behind the faint scent of spice and the echo of a life well-lived. Millie watched him go, a small smile playing on her lips.  In her little corner of the world, for a fleeting moment, the ordinary had become extraordinary, all thanks to the man called Dr. Pepper. 
-
-

Teardown

PASSED test_tracing_async_only 0:00:06.609080

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

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.476836

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.193971

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.413140

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.402663

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.125572

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

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_tracing_async_only 0:00:04.643830

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

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.469023

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.592067

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.479932

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.306652

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.252011

Setup

Call

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

Teardown

PASSED test_dynamic_class_output 0:00:00.963628

Setup

Call

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

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.866759

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

Setup

Call

Captured stdout call
streamed  name=None hair_color=None
+

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.900188

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

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}
@@ -188,7 +180,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"}
-

Teardown

PASSED test_stream_dynamic_class_output 0:00:01.674849

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.619440

Setup

Call

Captured stdout call
[]
 streamed  {'hair_color': '{'}
 streamed  {'hair_color': '{'}
 streamed  {'hair_color': '{\n  "'}
@@ -205,19 +197,18 @@
 final  hair_color='black'
 final  {'hair_color': 'black'}
 final  {"hair_color":"black"}
-

Teardown

PASSED test_dynamic_inputs_list2 0:00:00.911101

Setup

Call

Teardown

PASSED test_dynamic_types_new_enum 0:00:01.516105

Setup

Call

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.746050

Setup

Call

Teardown

PASSED test_dynamic_literals 0:00:00.823691

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:01.047489

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:00.697238

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.244929

Setup

Call

Teardown

PASSED test_dynamic_types_new_enum 0:00:00.899329

Setup

Call

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.670222

Setup

Call

Teardown

PASSED test_dynamic_literals 0:00:00.914224

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:01.274591

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:00.622982

Setup

Call

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

Teardown

PASSED test_dynamic_output_union 0:00:02.013329

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', '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:03.765765

Setup

Call

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

Teardown

PASSED test_dynamic_output_union 0:00:03.483122

Setup

Call

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

Teardown

PASSED test_nested_class_streaming 0:00:04.964836

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}
@@ -246,210 +237,215 @@
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': '', 'prop2': None}
-streamed  {'prop1': 'hello', 'prop2': None}
-streamed  {'prop1': 'hello', 'prop2': None}
-streamed  {'prop1': 'hello', 'prop2': None}
-streamed  {'prop1': 'hello', 'prop2': None}
-streamed  {'prop1': 'hello', 'prop2': None}
-streamed  {'prop1': 'hello', 'prop2': None}
-streamed  {'prop1': 'hello', 'prop2': None}
-streamed  {'prop1': 'hello', 'prop2': None}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': '', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'fo', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
-final  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-

Teardown

PASSED test_dynamic_client_with_openai 0:00:02.211510

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:01.147061

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:00.963547

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.163098

Setup

Call

Captured stdout call
Event log hook1: 
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '2', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
+final  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
+

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.414254

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:01.102953

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:01.229239

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.018153

Setup

Call

Captured stdout call
Event log hook1: 
 Event log event  BamlLogEvent {
     metadata: {
-        event_id: "c13e21d5-f374-4c98-8013-b003aedb8fa3",
+        event_id: "0fad094a-7b15-4103-b2d0-4004c72cf447",
         parent_id: None,
-        root_event_id: "c13e21d5-f374-4c98-8013-b003aedb8fa3"
+        root_event_id: "0fad094a-7b15-4103-b2d0-4004c72cf447"
     },
     prompt: "[
   {
@@ -463,13 +459,13 @@
 ]",
     raw_output: "["a", "b", "c"]",
     parsed_output: "["a", "b", "c"]",
-    start_time: "2024-12-13T14:46:34.169Z"
+    start_time: "2024-12-13T15:06:45.817Z"
 }
-

Teardown

PASSED test_aws_bedrock 0:00:03.126423

Setup

Call

Captured stdout call
unstreamed 
+

Teardown

PASSED test_aws_bedrock 0:00:03.034956

Setup

Call

Captured stdout call
unstreamed 
 
-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 could have prepared him for what he was about to discover.
+In the heart of the ancient forest, there was a peculiar rock that stood out from the rest. It was a deep, rich brown color, almost like the earth itself, and it seemed to glow with an inner light. The locals called it the "Heartrock," and whispered stories about its mysterious powers.
 
-As he made his way through the dense forest, his eyes scanned the ground, searching for the perfect specimen. Suddenly, his gaze landed on a peculiar rock, unlike any he had ever seen before.
+One stormy night, a bolt of lightning struck the Heartrock, sending a shiver through the forest. The air was electric with anticipation as the villagers gathered around the rock, watching
 streamed  '\n\n'
 streamed  '\n\nIn'
 streamed  '\n\nIn the'
@@ -487,100 +483,100 @@
 streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any'
 streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other'
 streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other.'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. Its'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. Its surface'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. Its surface was'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. Its surface was worn'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. Its surface was worn smooth'
-streamed  'n the heart of the ancient forest, there was a rock unlike any other. Its surface was worn smooth by'
-streamed  'e heart of the ancient forest, there was a rock unlike any other. Its surface was worn smooth by the'
-streamed  'of the ancient forest, there was a rock unlike any other. Its surface was worn smooth by the passing'
-streamed  'the ancient forest, there was a rock unlike any other. Its surface was worn smooth by the passing of'
-streamed  'ncient forest, there was a rock unlike any other. Its surface was worn smooth by the passing of time'
-streamed  'cient forest, there was a rock unlike any other. Its surface was worn smooth by the passing of time,'
-streamed  't forest, there was a rock unlike any other. Its surface was worn smooth by the passing of time, and'
-streamed  'rest, there was a rock unlike any other. Its surface was worn smooth by the passing of time, and its'
-streamed  'there was a rock unlike any other. Its surface was worn smooth by the passing of time, and its color'
-streamed  'e was a rock unlike any other. Its surface was worn smooth by the passing of time, and its color was'
-streamed  'was a rock unlike any other. Its surface was worn smooth by the passing of time, and its color was a'
-streamed  ' rock unlike any other. Its surface was worn smooth by the passing of time, and its color was a deep'
-streamed  'rock unlike any other. Its surface was worn smooth by the passing of time, and its color was a deep,'
-streamed  'unlike any other. Its surface was worn smooth by the passing of time, and its color was a deep, rich'
-streamed  ' any other. Its surface was worn smooth by the passing of time, and its color was a deep, rich brown'
-streamed  'any other. Its surface was worn smooth by the passing of time, and its color was a deep, rich brown.'
-streamed  'other. Its surface was worn smooth by the passing of time, and its color was a deep, rich brown. But'
-streamed  '. Its surface was worn smooth by the passing of time, and its color was a deep, rich brown. But what'
-streamed  ' surface was worn smooth by the passing of time, and its color was a deep, rich brown. But what made'
-streamed  'ace was worn smooth by the passing of time, and its color was a deep, rich brown. But what made this'
-streamed  'as worn smooth by the passing of time, and its color was a deep, rich brown. But what made this rock'
-streamed  'n smooth by the passing of time, and its color was a deep, rich brown. But what made this rock truly'
-streamed  ' by the passing of time, and its color was a deep, rich brown. But what made this rock truly special'
-streamed  'the passing of time, and its color was a deep, rich brown. But what made this rock truly special was'
-streamed  'passing of time, and its color was a deep, rich brown. But what made this rock truly special was the'
-streamed  'of time, and its color was a deep, rich brown. But what made this rock truly special was the strange'
-streamed  'f time, and its color was a deep, rich brown. But what made this rock truly special was the strange,'
-streamed  'and its color was a deep, rich brown. But what made this rock truly special was the strange, glowing'
-streamed  'ts color was a deep, rich brown. But what made this rock truly special was the strange, glowing vein'
-streamed  'lor was a deep, rich brown. But what made this rock truly special was the strange, glowing vein that'
-streamed  'was a deep, rich brown. But what made this rock truly special was the strange, glowing vein that ran'
-streamed  'ep, rich brown. But what made this rock truly special was the strange, glowing vein that ran through'
-streamed  'rich brown. But what made this rock truly special was the strange, glowing vein that ran through its'
-streamed  'own. But what made this rock truly special was the strange, glowing vein that ran through its center'
-streamed  '. But what made this rock truly special was the strange, glowing vein that ran through its center.\n\n'
-streamed  'ut what made this rock truly special was the strange, glowing vein that ran through its center.\n\nThe'
-streamed  'at made this rock truly special was the strange, glowing vein that ran through its center.\n\nThe vein'
-streamed  'ade this rock truly special was the strange, glowing vein that ran through its center.\n\nThe vein was'
-streamed  'e this rock truly special was the strange, glowing vein that ran through its center.\n\nThe vein was a'
-streamed  's rock truly special was the strange, glowing vein that ran through its center.\n\nThe vein was a deep'
-streamed  ' rock truly special was the strange, glowing vein that ran through its center.\n\nThe vein was a deep,'
-streamed  'ly special was the strange, glowing vein that ran through its center.\n\nThe vein was a deep, electric'
-streamed  'ecial was the strange, glowing vein that ran through its center.\n\nThe vein was a deep, electric blue'
-streamed  'cial was the strange, glowing vein that ran through its center.\n\nThe vein was a deep, electric blue,'
-streamed  ' was the strange, glowing vein that ran through its center.\n\nThe vein was a deep, electric blue, and'
-streamed  's the strange, glowing vein that ran through its center.\n\nThe vein was a deep, electric blue, and it'
-streamed  'e strange, glowing vein that ran through its center.\n\nThe vein was a deep, electric blue, and it pul'
-streamed  'trange, glowing vein that ran through its center.\n\nThe vein was a deep, electric blue, and it pulsed'
-streamed  'e, glowing vein that ran through its center.\n\nThe vein was a deep, electric blue, and it pulsed with'
-streamed  ' glowing vein that ran through its center.\n\nThe vein was a deep, electric blue, and it pulsed with a'
-streamed  'g vein that ran through its center.\n\nThe vein was a deep, electric blue, and it pulsed with a gentle'
-streamed  ' vein that ran through its center.\n\nThe vein was a deep, electric blue, and it pulsed with a gentle,'
-streamed  'that ran through its center.\n\nThe vein was a deep, electric blue, and it pulsed with a gentle, rhyth'
-streamed  't ran through its center.\n\nThe vein was a deep, electric blue, and it pulsed with a gentle, rhythmic'
-streamed  'hrough its center.\n\nThe vein was a deep, electric blue, and it pulsed with a gentle, rhythmic energy'
-streamed  'rough its center.\n\nThe vein was a deep, electric blue, and it pulsed with a gentle, rhythmic energy.'
-streamed  'gh its center.\n\nThe vein was a deep, electric blue, and it pulsed with a gentle, rhythmic energy. It'
-streamed  'ts center.\n\nThe vein was a deep, electric blue, and it pulsed with a gentle, rhythmic energy. It was'
-streamed  'center.\n\nThe vein was a deep, electric blue, and it pulsed with a gentle, rhythmic energy. It was as'
-streamed  'ter.\n\nThe vein was a deep, electric blue, and it pulsed with a gentle, rhythmic energy. It was as if'
-streamed  '\n\nThe vein was a deep, electric blue, and it pulsed with a gentle, rhythmic energy. It was as if the'
-streamed  ' vein was a deep, electric blue, and it pulsed with a gentle, rhythmic energy. It was as if the rock'
-streamed  'n was a deep, electric blue, and it pulsed with a gentle, rhythmic energy. It was as if the rock was'
-streamed  'a deep, electric blue, and it pulsed with a gentle, rhythmic energy. It was as if the rock was alive'
-streamed  ' deep, electric blue, and it pulsed with a gentle, rhythmic energy. It was as if the rock was alive,'
-streamed  'p, electric blue, and it pulsed with a gentle, rhythmic energy. It was as if the rock was alive, and'
-streamed  'lectric blue, and it pulsed with a gentle, rhythmic energy. It was as if the rock was alive, and the'
-streamed  'ic blue, and it pulsed with a gentle, rhythmic energy. It was as if the rock was alive, and the vein'
-streamed  'lue, and it pulsed with a gentle, rhythmic energy. It was as if the rock was alive, and the vein was'
-streamed  ' and it pulsed with a gentle, rhythmic energy. It was as if the rock was alive, and the vein was its'
-streamed  'it pulsed with a gentle, rhythmic energy. It was as if the rock was alive, and the vein was its life'
-streamed  'lsed with a gentle, rhythmic energy. It was as if the rock was alive, and the vein was its lifeblood'
-streamed  'sed with a gentle, rhythmic energy. It was as if the rock was alive, and the vein was its lifeblood.'
-streamed  'with a gentle, rhythmic energy. It was as if the rock was alive, and the vein was its lifeblood. The'
-streamed  'gentle, rhythmic energy. It was as if the rock was alive, and the vein was its lifeblood. The locals'
-streamed  'le, rhythmic energy. It was as if the rock was alive, and the vein was its lifeblood. The locals had'
-streamed  'ythmic energy. It was as if the rock was alive, and the vein was its lifeblood. The locals had named'
-streamed  'ic energy. It was as if the rock was alive, and the vein was its lifeblood. The locals had named the'
-streamed  'ic energy. It was as if the rock was alive, and the vein was its lifeblood. The locals had named the'
-streamed  'ic energy. It was as if the rock was alive, and the vein was its lifeblood. The locals had named the'
-streamed  'ic energy. It was as if the rock was alive, and the vein was its lifeblood. The locals had named the'
+streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It'
+streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It was'
+streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It was a'
+streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It was a massive'
+streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It was a massive b'
+streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It was a massive boulder'
+streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It was a massive boulder,'
+streamed  'he heart of the ancient forest, there was a rock unlike any other. It was a massive boulder, weather'
+streamed  ' heart of the ancient forest, there was a rock unlike any other. It was a massive boulder, weathered'
+streamed  'art of the ancient forest, there was a rock unlike any other. It was a massive boulder, weathered by'
+streamed  'f the ancient forest, there was a rock unlike any other. It was a massive boulder, weathered by time'
+streamed  'e ancient forest, there was a rock unlike any other. It was a massive boulder, weathered by time and'
+streamed  'cient forest, there was a rock unlike any other. It was a massive boulder, weathered by time and the'
+streamed  'est, there was a rock unlike any other. It was a massive boulder, weathered by time and the elements'
+streamed  'st, there was a rock unlike any other. It was a massive boulder, weathered by time and the elements,'
+streamed  'here was a rock unlike any other. It was a massive boulder, weathered by time and the elements, with'
+streamed  're was a rock unlike any other. It was a massive boulder, weathered by time and the elements, with a'
+streamed  ' rock unlike any other. It was a massive boulder, weathered by time and the elements, with a strange'
+streamed  ' unlike any other. It was a massive boulder, weathered by time and the elements, with a strange glow'
+streamed  'ke any other. It was a massive boulder, weathered by time and the elements, with a strange glow eman'
+streamed  'y other. It was a massive boulder, weathered by time and the elements, with a strange glow emanating'
+streamed  'er. It was a massive boulder, weathered by time and the elements, with a strange glow emanating from'
+streamed  'was a massive boulder, weathered by time and the elements, with a strange glow emanating from within'
+streamed  'as a massive boulder, weathered by time and the elements, with a strange glow emanating from within.'
+streamed  ' massive boulder, weathered by time and the elements, with a strange glow emanating from within. The'
+streamed  'e boulder, weathered by time and the elements, with a strange glow emanating from within. The locals'
+streamed  'er, weathered by time and the elements, with a strange glow emanating from within. The locals called'
+streamed  ' weathered by time and the elements, with a strange glow emanating from within. The locals called it'
+streamed  'thered by time and the elements, with a strange glow emanating from within. The locals called it the'
+streamed  'ered by time and the elements, with a strange glow emanating from within. The locals called it the "'
+streamed  'by time and the elements, with a strange glow emanating from within. The locals called it the "Heart'
+streamed  'me and the elements, with a strange glow emanating from within. The locals called it the "Heartstone'
+streamed  ' and the elements, with a strange glow emanating from within. The locals called it the "Heartstone,"'
+streamed  ' the elements, with a strange glow emanating from within. The locals called it the "Heartstone," and'
+streamed  'nts, with a strange glow emanating from within. The locals called it the "Heartstone," and whispered'
+streamed  'h a strange glow emanating from within. The locals called it the "Heartstone," and whispered stories'
+streamed  ' strange glow emanating from within. The locals called it the "Heartstone," and whispered stories of'
+streamed  'ange glow emanating from within. The locals called it the "Heartstone," and whispered stories of its'
+streamed  ' emanating from within. The locals called it the "Heartstone," and whispered stories of its mystical'
+streamed  'ing from within. The locals called it the "Heartstone," and whispered stories of its mystical powers'
+streamed  ' from within. The locals called it the "Heartstone," and whispered stories of its mystical powers.\n\n'
+streamed  'om within. The locals called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne'
+streamed  'hin. The locals called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne storm'
+streamed  'in. The locals called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy'
+streamed  'e locals called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy night'
+streamed  ' locals called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy night,'
+streamed  'ocals called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy night, a'
+streamed  'called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy night, a young'
+streamed  'd it the "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy night, a young girl'
+streamed  'he "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy night, a young girl named'
+streamed  'eartstone," and whispered stories of its mystical powers.\n\nOne stormy night, a young girl named Lily'
+streamed  '," and whispered stories of its mystical powers.\n\nOne stormy night, a young girl named Lily wandered'
+streamed  'd whispered stories of its mystical powers.\n\nOne stormy night, a young girl named Lily wandered into'
+streamed  'ispered stories of its mystical powers.\n\nOne stormy night, a young girl named Lily wandered into the'
+streamed  ' stories of its mystical powers.\n\nOne stormy night, a young girl named Lily wandered into the forest'
+streamed  'stories of its mystical powers.\n\nOne stormy night, a young girl named Lily wandered into the forest,'
+streamed  'of its mystical powers.\n\nOne stormy night, a young girl named Lily wandered into the forest, seeking'
+streamed  'ystical powers.\n\nOne stormy night, a young girl named Lily wandered into the forest, seeking shelter'
+streamed  'al powers.\n\nOne stormy night, a young girl named Lily wandered into the forest, seeking shelter from'
+streamed  'owers.\n\nOne stormy night, a young girl named Lily wandered into the forest, seeking shelter from the'
+streamed  'One stormy night, a young girl named Lily wandered into the forest, seeking shelter from the torrent'
+streamed  ' stormy night, a young girl named Lily wandered into the forest, seeking shelter from the torrential'
+streamed  'my night, a young girl named Lily wandered into the forest, seeking shelter from the torrential rain'
+streamed  'y night, a young girl named Lily wandered into the forest, seeking shelter from the torrential rain.'
+streamed  'ight, a young girl named Lily wandered into the forest, seeking shelter from the torrential rain. As'
+streamed  ', a young girl named Lily wandered into the forest, seeking shelter from the torrential rain. As she'
+streamed  ' girl named Lily wandered into the forest, seeking shelter from the torrential rain. As she stumbled'
+streamed  'med Lily wandered into the forest, seeking shelter from the torrential rain. As she stumbled through'
+streamed  'Lily wandered into the forest, seeking shelter from the torrential rain. As she stumbled through the'
+streamed  'ered into the forest, seeking shelter from the torrential rain. As she stumbled through the darkness'
+streamed  'red into the forest, seeking shelter from the torrential rain. As she stumbled through the darkness,'
+streamed  'into the forest, seeking shelter from the torrential rain. As she stumbled through the darkness, the'
+streamed  'the forest, seeking shelter from the torrential rain. As she stumbled through the darkness, the wind'
+streamed  'forest, seeking shelter from the torrential rain. As she stumbled through the darkness, the wind how'
+streamed  'est, seeking shelter from the torrential rain. As she stumbled through the darkness, the wind howled'
+streamed  ' seeking shelter from the torrential rain. As she stumbled through the darkness, the wind howled and'
+streamed  'king shelter from the torrential rain. As she stumbled through the darkness, the wind howled and the'
+streamed  'lter from the torrential rain. As she stumbled through the darkness, the wind howled and the thunder'
+streamed  'r from the torrential rain. As she stumbled through the darkness, the wind howled and the thunder bo'
+streamed  'om the torrential rain. As she stumbled through the darkness, the wind howled and the thunder boomed'
+streamed  'm the torrential rain. As she stumbled through the darkness, the wind howled and the thunder boomed,'
+streamed  'orrential rain. As she stumbled through the darkness, the wind howled and the thunder boomed, making'
+streamed  'ntial rain. As she stumbled through the darkness, the wind howled and the thunder boomed, making her'
+streamed  'ntial rain. As she stumbled through the darkness, the wind howled and the thunder boomed, making her'
+streamed  'ntial rain. As she stumbled through the darkness, the wind howled and the thunder boomed, making her'
+streamed  'ntial rain. As she stumbled through the darkness, the wind howled and the thunder boomed, making her'
 streamed final 
 
-In the heart of the ancient forest, there was a rock unlike any other. Its surface was worn smooth by the passing of time, and its color was a deep, rich brown. But what made this rock truly special was the strange, glowing vein that ran through its center.
+In the heart of the ancient forest, there was a rock unlike any other. It was a massive boulder, weathered by time and the elements, with a strange glow emanating from within. The locals called it the "Heartstone," and whispered stories of its mystical powers.
 
-The vein was a deep, electric blue, and it pulsed with a gentle, rhythmic energy. It was as if the rock was alive, and the vein was its lifeblood. The locals had named the
-

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.005900

Setup

Call

Teardown

PASSED test_serialization_exception 0:00:00.522414

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".
+One stormy night, a young girl named Lily wandered into the forest, seeking shelter from the torrential rain. As she stumbled through the darkness, the wind howled and the thunder boomed, making her
+

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.049519

Setup

Call

Teardown

PASSED test_serialization_exception 0:00:00.505185

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

Teardown

PASSED test_stream_serialization_exception 0:00:00.634719

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None
+

Teardown

PASSED test_stream_serialization_exception 0:00:00.395514

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
@@ -595,7 +591,7 @@
 streamed  nonce=None nonce2=None
 Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...g required field: nonce2, raw_output=Hello there! How can I help you today?, prompt=[chat] system: Say "hello there".
 ) tblen=3>
-

Teardown

PASSED test_stream2_serialization_exception 0:00:00.383816

Setup

Call

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

Teardown

PASSED test_stream2_serialization_exception 0:00:00.400340

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
@@ -608,133 +604,21 @@
 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".
+Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...g required field: nonce3, raw_output=Hello there! How can I help you today?, prompt=[chat] system: Say "hello there".
 ) tblen=3>
-

Teardown

PASSED test_descriptions 0:00:02.583328

Setup

Call

Teardown

FAILED test_caching 0:00:08.892028

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

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
+

Teardown

PASSED test_descriptions 0:00:01.975074

Setup

Call

Teardown

PASSED test_caching 0:00:07.776454

Setup

Call

Captured stdout call
Duration no caching:  4.188543081283569
+Duration with caching:  3.5870521068573
+

Teardown

PASSED test_arg_exceptions 0:00:00.755149

Setup

Call

Captured stderr call
[2024-12-13T15:07:00Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
     
-        start = time.time()
-        _ = await b.TestCaching(story_idea, "1. try to be funny")
-        duration = time.time() - start
+

Teardown

PASSED test_map_as_param 0:00:00.001055

Setup

Call

Captured stderr call
[2024-12-13T15:07:01Z ERROR baml_runtime::tracing]   Error: myMap: a: Expected map, got `String("b")`
     
-        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: 4.48455023765564 < 4.406625032424927. Expected second call to be faster than first by a large margin.
-E       assert 4.48455023765564 < 4.406625032424927
-
-tests/test_functions.py:1271: AssertionError
Captured stdout call
Duration no caching:  4.406625032424927
-Duration with caching:  4.48455023765564
-

Teardown

PASSED test_arg_exceptions 0:00:00.693737

Setup

Call

Captured stderr call
[2024-12-13T14:46:51Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
-    
-

Teardown

PASSED test_map_as_param 0:00:00.001014

Setup

Call

Captured stderr call
[2024-12-13T14:46:51Z ERROR baml_runtime::tracing]   Error: myMap: a: Expected map, got `String("b")`
-    
-

Teardown

PASSED test_baml_validation_error_format 0:00:00.659617

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

Setup

Call

Captured stdout call
Error:  BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
   - <root>: Missing required field: nonce
   - <root>: Missing required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
 )
-

Teardown

PASSED test_no_stream_big_integer 0:00:00.475766

Setup

Call

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.544767

Setup

Call

Teardown

PASSED test_no_stream_compound_object 0:00:03.736282

Setup

Call

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:06.240334

Setup

Call

Teardown

PASSED test_differing_unions 0:00:01.446055

Setup

Call

Teardown

PASSED test_return_failing_assert 0:00:00.302921

Setup

Call

Teardown

PASSED test_parameter_failing_assert 0:00:00.001126

Setup

Call

Captured stderr call
[2024-12-13T14:47:05Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: small_int
+

Teardown

PASSED test_no_stream_big_integer 0:00:00.529150

Setup

Call

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.631862

Setup

Call

Teardown

PASSED test_no_stream_compound_object 0:00:05.253739

Setup

Call

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:03.953582

Setup

Call

Teardown

PASSED test_differing_unions 0:00:00.915790

Setup

Call

Teardown

PASSED test_return_failing_assert 0:00:00.358101

Setup

Call

Teardown

PASSED test_parameter_failing_assert 0:00:00.001212

Setup

Call

Captured stderr call
[2024-12-13T15:07:13Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: small_int
     
-

Teardown

PASSED test_failing_assert_can_stream 0:00:03.236497

Setup

Call

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

Teardown

PASSED test_failing_assert_can_stream 0:00:02.406054

Setup

Call

Captured stdout call
None
 None
 None
 None
@@ -1338,9 +1222,9 @@
 None
 None
 None
-

Teardown

PASSED test_simple_recursive_type 0:00:03.273222

Setup

Call

Teardown

PASSED test_mutually_recursive_type 0:00:02.808815

Setup

Call

Teardown

PASSED test_block_constraints 0:00:00.480892

Setup

Call

Teardown

PASSED test_nested_block_constraints 0:00:00.523365

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

Setup

Call

Captured stderr call
[2024-12-13T14:47:15Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+

Teardown

PASSED test_simple_recursive_type 0:00:03.369275

Setup

Call

Teardown

PASSED test_mutually_recursive_type 0:00:01.546244

Setup

Call

Teardown

PASSED test_block_constraints 0:00:00.511981

Setup

Call

Teardown

PASSED test_nested_block_constraints 0:00:00.576220

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

Setup

Call

Captured stderr call
[2024-12-13T15:07:21Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-[2024-12-13T14:47:15Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+[2024-12-13T15:07:21Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-

Teardown

tests/test_pydantic.py 3 0:00:00.001514

PASSED test_model_validate_success 0:00:00.000787

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000502

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000225

Setup

Call

Teardown

tests/test_python.py 2 0:00:00.005336

PASSED test_inspect 0:00:00.004967

Assert that baml_py is compatible with the inspect module.

This is a regression test for a bug where inspect.stack() would implode if the pyo3 code called PyModule::from_code without specifying the file_name arg (i.e. without specifying the source file metadata for the inline Python snippet).

Setup

Call

Teardown

PASSED test_pickle 0:00:00.000369

Setup

Call

Teardown

\ No newline at end of file +

Teardown

tests/test_pydantic.py 3 0:00:00.001412

PASSED test_model_validate_success 0:00:00.000357

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000516

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000539

Setup

Call

Teardown

tests/test_python.py 2 0:00:00.022357

PASSED test_inspect 0:00:00.021980

Assert that baml_py is compatible with the inspect module.

This is a regression test for a bug where inspect.stack() would implode if the pyo3 code called PyModule::from_code without specifying the file_name arg (i.e. without specifying the source file metadata for the inline Python snippet).

Setup

Call

Teardown

PASSED test_pickle 0:00:00.000377

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 10f842787..468fc80cd 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.70.3\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.3\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.3\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.3\"\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.4\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.4\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.4\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.4\"\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 0f65cd4fc..891188dc1 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.70.3\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.3\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.3\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.3\"\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.4\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.4\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.4\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.4\"\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 37290fbbd..5889a4d2e 100644 --- a/integ-tests/typescript/test-report.html +++ b/integ-tests/typescript/test-report.html @@ -257,24 +257,19 @@ font-size: 1rem; padding: 0 0.5rem; } -

Test Report

Started: 2024-12-13 06:41:50
Suites (1)
0 passed
1 failed
0 pending
Tests (67)
66 passed
1 failed
0 pending
Integ tests > should work for all inputs
single bool
passed
0.443s
Integ tests > should work for all inputs
single string list
passed
0.638s
Integ tests > should work for all inputs
return literal union
passed
0.367s
Integ tests > should work for all inputs
single class
passed
0.716s
Integ tests > should work for all inputs
multiple classes
passed
0.598s
Integ tests > should work for all inputs
single enum list
passed
0.41s
Integ tests > should work for all inputs
single float
passed
0.343s
Integ tests > should work for all inputs
single int
passed
0.374s
Integ tests > should work for all inputs
single literal int
passed
0.386s
Integ tests > should work for all inputs
single literal bool
passed
0.29s
Integ tests > should work for all inputs
single literal string
passed
0.307s
Integ tests > should work for all inputs
single class with literal prop
passed
0.588s
Integ tests > should work for all inputs
single class with literal union prop
passed
0.872s
Integ tests > should work for all inputs
single optional string
passed
0.333s
Integ tests > should work for all inputs
single map string to string
passed
0.487s
Integ tests > should work for all inputs
single map string to class
passed
0.736s
Integ tests > should work for all inputs
single map string to map
passed
0.526s
Integ tests > should work for all inputs
enum key in map
passed
0.649s
Integ tests > should work for all inputs
literal string union key in map
passed
0.78s
Integ tests > should work for all inputs
single literal string key in map
passed
0.518s
Integ tests
should work for all outputs
passed
4.365s
Integ tests
works with retries1
passed
1.046s
Integ tests
works with retries2
passed
2.248s
Integ tests
works with fallbacks
passed
1.711s
Integ tests
should work with image from url
passed
1.386s
Integ tests
should work with image from base 64
passed
1.628s
Integ tests
should work with audio base 64
passed
1.278s
Integ tests
should work with audio from url
passed
1.35s
Integ tests
should support streaming in OpenAI
passed
2.231s
Integ tests
should support streaming in Gemini
passed
9.491s
Integ tests
should support AWS
passed
1.727s
Integ tests
should support streaming in AWS
passed
1.418s
Integ tests
should allow overriding the region
passed
0.048s
Integ tests
should support OpenAI shorthand
passed
8.117s
Integ tests
should support OpenAI shorthand streaming
passed
15.115s
Integ tests
should support anthropic shorthand
passed
3.245s
Integ tests
should support anthropic shorthand streaming
passed
3.132s
Integ tests
should support streaming without iterating
passed
2.515s
Integ tests
should support streaming in Claude
passed
1.011s
Integ tests
should support vertex
passed
8.913s
Integ tests
supports tracing sync
passed
0.009s
Integ tests
supports tracing async
passed
3.722s
Integ tests
should work with dynamic types single
passed
1.217s
Integ tests
should work with dynamic types enum
passed
1.341s
Integ tests
should work with dynamic literals
passed
0.791s
Integ tests
should work with dynamic types class
passed
1.626s
Integ tests
should work with dynamic inputs class
passed
0.725s
Integ tests
should work with dynamic inputs list
passed
0.525s
Integ tests
should work with dynamic output map
passed
0.677s
Integ tests
should work with dynamic output union
passed
1.671s
Integ tests
should work with nested classes
failed
9.811s
Error: expect(received).toEqual(expected) // deep equality
-
-- Expected  - 1
-+ Received  + 1
-
-  Object {
-    "prop1": "value1",
-    "prop2": Object {
-      "inner": Object {
-        "prop2": 42,
--       "prop3": 3.14,
-+       "prop3": null,
-      },
-      "prop1": "value2",
-      "prop2": "value3",
-    },
-  }
-    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.409s
Integ tests
should work with 'onLogEvent'
passed
1.618s
Integ tests
should work with a sync client
passed
0.48s
Integ tests
should raise an error when appropriate
passed
0.771s
Integ tests
should raise a BAMLValidationError
passed
0.495s
Integ tests
should reset environment variables correctly
passed
1.231s
Integ tests
should use aliases when serializing input objects - classes
passed
1.054s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.889s
Integ tests
should use aliases when serializing input objects - enums
passed
0.473s
Integ tests
should use aliases when serializing input objects - lists
passed
0.333s
Integ tests
constraints: should handle checks in return types
passed
0.641s
Integ tests
constraints: should handle checks in returned unions
passed
0.668s
Integ tests
constraints: should handle block-level checks
passed
0.551s
Integ tests
constraints: should handle nested-block-level checks
passed
0.871s
Integ tests
simple recursive type
passed
3.331s
Integ tests
mutually recursive type
passed
2.112s
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:48:15)
+

Test Report

Started: 2024-12-13 06:58:53
Suites (1)
0 passed
1 failed
0 pending
Tests (67)
66 passed
1 failed
0 pending
Integ tests > should work for all inputs
single bool
passed
0.49s
Integ tests > should work for all inputs
single string list
passed
0.38s
Integ tests > should work for all inputs
return literal union
passed
0.356s
Integ tests > should work for all inputs
single class
passed
0.389s
Integ tests > should work for all inputs
multiple classes
passed
0.438s
Integ tests > should work for all inputs
single enum list
passed
0.315s
Integ tests > should work for all inputs
single float
passed
2.675s
Integ tests > should work for all inputs
single int
passed
0.355s
Integ tests > should work for all inputs
single literal int
passed
0.38s
Integ tests > should work for all inputs
single literal bool
passed
0.34s
Integ tests > should work for all inputs
single literal string
passed
0.389s
Integ tests > should work for all inputs
single class with literal prop
passed
0.514s
Integ tests > should work for all inputs
single class with literal union prop
passed
0.524s
Integ tests > should work for all inputs
single optional string
passed
0.383s
Integ tests > should work for all inputs
single map string to string
passed
0.969s
Integ tests > should work for all inputs
single map string to class
passed
0.696s
Integ tests > should work for all inputs
single map string to map
passed
0.524s
Integ tests > should work for all inputs
enum key in map
passed
0.522s
Integ tests > should work for all inputs
literal string union key in map
passed
0.751s
Integ tests > should work for all inputs
single literal string key in map
passed
0.485s
Integ tests
should work for all outputs
passed
4.308s
Integ tests
works with retries1
passed
1.035s
Integ tests
works with retries2
passed
2.34s
Integ tests
works with fallbacks
passed
1.769s
Integ tests
should work with image from url
passed
1.767s
Integ tests
should work with image from base 64
passed
1.426s
Integ tests
should work with audio base 64
passed
1.108s
Integ tests
should work with audio from url
passed
1.298s
Integ tests
should support streaming in OpenAI
passed
1.929s
Integ tests
should support streaming in Gemini
passed
7.575s
Integ tests
should support AWS
passed
1.996s
Integ tests
should support streaming in AWS
passed
1.519s
Integ tests
should allow overriding the region
passed
0.003s
Integ tests
should support OpenAI shorthand
passed
14.733s
Integ tests
should support OpenAI shorthand streaming
passed
8.501s
Integ tests
should support anthropic shorthand
failed
30.001s
Error: thrown: "Exceeded timeout of 30000 ms for a test.
+Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."
+    at it (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:318:3)
+    at _dispatchDescribe (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/index.js:91:26)
+    at describe (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/index.js:55:5)
+    at Object.describe (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:28:1)
+    at Runtime._execModule (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runtime@29.7.0/node_modules/jest-runtime/build/index.js:1439:24)
+    at Runtime._loadModule (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runtime@29.7.0/node_modules/jest-runtime/build/index.js:1022:12)
+    at Runtime.requireModule (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runtime@29.7.0/node_modules/jest-runtime/build/index.js:882:12)
+    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:77:13)
+    at processTicksAndRejections (node:internal/process/task_queues:95:5)
+    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)
Integ tests
should support anthropic shorthand streaming
passed
2.929s
Integ tests
should support streaming without iterating
passed
3.446s
Integ tests
should support streaming in Claude
passed
1.717s
Integ tests
should support vertex
passed
13.683s
Integ tests
supports tracing sync
passed
0.009s
Integ tests
supports tracing async
passed
3.727s
Integ tests
should work with dynamic types single
passed
1.356s
Integ tests
should work with dynamic types enum
passed
0.928s
Integ tests
should work with dynamic literals
passed
0.796s
Integ tests
should work with dynamic types class
passed
1.106s
Integ tests
should work with dynamic inputs class
passed
0.494s
Integ tests
should work with dynamic inputs list
passed
0.67s
Integ tests
should work with dynamic output map
passed
0.74s
Integ tests
should work with dynamic output union
passed
2.388s
Integ tests
should work with nested classes
passed
8.08s
Integ tests
should work with dynamic client
passed
0.675s
Integ tests
should work with 'onLogEvent'
passed
2.081s
Integ tests
should work with a sync client
passed
0.427s
Integ tests
should raise an error when appropriate
passed
0.825s
Integ tests
should raise a BAMLValidationError
passed
0.401s
Integ tests
should reset environment variables correctly
passed
1.208s
Integ tests
should use aliases when serializing input objects - classes
passed
0.934s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
1.019s
Integ tests
should use aliases when serializing input objects - enums
passed
0.442s
Integ tests
should use aliases when serializing input objects - lists
passed
0.355s
Integ tests
constraints: should handle checks in return types
passed
0.692s
Integ tests
constraints: should handle checks in returned unions
passed
0.726s
Integ tests
constraints: should handle block-level checks
passed
0.542s
Integ tests
constraints: should handle nested-block-level checks
passed
0.589s
Integ tests
simple recursive type
passed
3.388s
Integ tests
mutually recursive type
passed
2.093s
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)
@@ -289,11 +284,11 @@
     at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
     at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
calling with class
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts: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: 1734100925, tv_nsec: 874319000 }, latency: 170.868917ms, 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 }
+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: 1734101951, tv_nsec: 185276000 }, latency: 163.761042ms, 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: 1734100928, tv_nsec: 5118000 }, latency: 308.137167ms, 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 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: 1734101953, tv_nsec: 484408000 }, latency: 227.111042ms, 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'
@@ -691,13 +686,13 @@
     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', age: '30 years old' },
+  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', age: '30' },
+  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: 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: 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: 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: 'value', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: '', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+}
    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: 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: 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: 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: 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: 'value', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: '', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
   prop1: 'value1',
   prop2: { prop1: 'value', prop2: null, inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
@@ -1056,788 +1051,11 @@
     prop2: 'value3',
     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: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
 }
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:623:15)
     at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:70:17)
onLogEvent {
   metadata: {
-    eventId: '46a8e073-221d-4872-bb1d-701758db7488',
-    rootEventId: '46a8e073-221d-4872-bb1d-701758db7488'
+    eventId: '76a936f8-e133-4ea1-a58e-ce86919c1893',
+    rootEventId: '76a936f8-e133-4ea1-a58e-ce86919c1893'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -1851,12 +1069,12 @@
     ']',
   rawOutput: '["a", "b", "c"]',
   parsedOutput: '["a", "b", "c"]',
-  startTime: '2024-12-13T14:43:35.485Z'
+  startTime: '2024-12-13T15:01:10.937Z'
 }
    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: '062efcda-762b-4f4d-9a2e-d9c79abf2cae',
-    rootEventId: '062efcda-762b-4f4d-9a2e-d9c79abf2cae'
+    eventId: 'd0febbcd-9aa4-48f0-a4da-0c29167c4f5f',
+    rootEventId: 'd0febbcd-9aa4-48f0-a4da-0c29167c4f5f'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -1870,8 +1088,8 @@
     ']',
   rawOutput: '["d", "e", "f"]',
   parsedOutput: '["d", "e", "f"]',
-  startTime: '2024-12-13T14:43:35.925Z'
-}
    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: 1734101017, tv_nsec: 418733000 }, latency: 144.0895ms, 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 }
+  startTime: '2024-12-13T15:01:11.368Z'
+}
    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: 1734102072, tv_nsec: 835255000 }, latency: 153.168ms, 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'
diff --git a/tools/bump-version b/tools/bump-version
index 41af6ade3..2c63af3c4 100755
--- a/tools/bump-version
+++ b/tools/bump-version
@@ -23,7 +23,6 @@ Options:
     --vscode       Bump patch for vscode
     --all          Bump all versions [default]
     --allow-dirty  Allow dirty git status
-    --no-tests     Skip running integ tests
 EOF
 }
 
@@ -84,10 +83,6 @@ while [ $# -gt 0 ]; do
             _allow_dirty_mode=1
             shift
             ;;
-        --no-tests)
-            _no_tests_mode=1
-            shift
-            ;;
         --) # End of all options
             shift
             break
@@ -242,28 +237,23 @@ env -u CONDA_PREFIX poetry run maturin develop --manifest-path ${_repo_root}/eng
 poetry run baml-cli generate --from ../baml_src
 
 
-if [$_no_tests_mode -eq 1]; then
-    ts_tests_status="— Typescript integ tests skipped"
-    python_tests_status="— Python integ tests skipped"
+# Now run integ tests for each
+cd "${_repo_root}/integ-tests/typescript"
+# Echo version and date to integ-tests.log
+if pnpm integ-tests:ci; then
+    ts_tests_status="✅ Typescript integ tests"
 else
-    # Now run integ tests for each
-    cd "${_repo_root}/integ-tests/typescript"
-    # Echo version and date to integ-tests.log
-    if pnpm integ-tests:ci; then
-        ts_tests_status="✅ Typescript integ tests"
-    else
-        ts_tests_status="❌ Typescript integ tests"
-        echo "Typescript integ tests failed, but continuing..."
-    fi
+    ts_tests_status="❌ Typescript integ tests"
+    echo "Typescript integ tests failed, but continuing..."
+fi
 
-    cd "${_repo_root}/integ-tests/python"
-    # Echo version and date to integ-tests.log
-    if infisical run --env=test -- poetry run pytest --template=html1/index.html --report=report.html; then
-        python_tests_status="✅ Python integ tests"
-    else
-        python_tests_status="❌ Python integ tests"
-        echo "Python integ tests failed, but continuing..."
-    fi
+cd "${_repo_root}/integ-tests/python"
+# Echo version and date to integ-tests.log
+if infisical run --env=test -- poetry run pytest --template=html1/index.html --report=report.html; then
+    python_tests_status="✅ Python integ tests"
+else
+    python_tests_status="❌ Python integ tests"
+    echo "Python integ tests failed, but continuing..."
 fi
 
 cd "${_repo_root}"
@@ -273,9 +263,15 @@ git commit -m "Run integ tests for $NEW_VERSION"
 
 echo "All done! Please push the branch $_branch_name and create a PR."
 
-gh pr create --title "chore: Bump version to $NEW_VERSION" --body "Bump version to $NEW_VERSION
+COMMIT_BODY=$(cat <