From 859c6998cef7950d52cc3287f51d74106a58d89d Mon Sep 17 00:00:00 2001 From: Samuel Lijin Date: Thu, 12 Dec 2024 13:16:49 -0800 Subject: [PATCH 01/11] fix: bad link in docs (#1235) > [!IMPORTANT] > Fix broken link in `upgrade-baml-versions.mdx` documentation file. > > - **Docs**: > - Fix broken link in `upgrade-baml-versions.mdx` from `/guide/reference/vscode-ext/clipath` to `/ref/editor-extension-settings/baml-cli-path`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=BoundaryML%2Fbaml&utm_source=github&utm_medium=referral) for 54e62d173c43893d00e7895d289da917bc874ae4. It will automatically update as commits are pushed. --- fern/01-guide/03-development/upgrade-baml-versions.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fern/01-guide/03-development/upgrade-baml-versions.mdx b/fern/01-guide/03-development/upgrade-baml-versions.mdx index 0edfed2d1..76d090f3d 100644 --- a/fern/01-guide/03-development/upgrade-baml-versions.mdx +++ b/fern/01-guide/03-development/upgrade-baml-versions.mdx @@ -40,4 +40,4 @@ You only need to do this for minor version upgrades (e.g., 0.54.0 -> 0.62.0), no ## Troubleshooting -See the [VSCode BAML Extension reference](/guide/reference/vscode-ext/clipath) for more information on how to prevent version mismatches. \ No newline at end of file +See the [VSCode BAML Extension reference](/ref/editor-extension-settings/baml-cli-path) for more information on how to prevent version mismatches. From 16054f5f858dcaf80f013d466ceb9354c6a160b7 Mon Sep 17 00:00:00 2001 From: aaronvg Date: Thu, 12 Dec 2024 14:45:31 -0800 Subject: [PATCH 02/11] More fixes to proxy (#1237) > [!IMPORTANT] > Improved proxy handling in Rust and TypeScript by refining error messages, URL construction, and request routing logic. > > - **Rust Proxy Handling**: > - Improved error message in `to_base64_with_inferred_mime_type()` in `mod.rs` to include `media_url.url`. > - Refactored URL construction in `fetch_with_proxy()` in `mod.rs` to use `new_proxy_url` variable. > - **TypeScript Proxy Middleware**: > - Added logic in `extension.ts` to handle image GET requests by setting path to empty string. > - Removed trailing slashes from paths in `extension.ts`. > - Ensured `baml-original-url` header is used to route requests in `extension.ts`. > - **Miscellaneous**: > - Disabled ESLint rule `@typescript-eslint/no-misused-promises` in `extension.ts`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=BoundaryML%2Fbaml&utm_source=github&utm_medium=referral) for e38f259632d3d78476451a990b2a24a91aedbc49. It will automatically update as commits are pushed. --- .../src/internal/llm_client/traits/mod.rs | 22 +++---- .../packages/vscode/src/extension.ts | 60 +++++++++---------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/engine/baml-runtime/src/internal/llm_client/traits/mod.rs b/engine/baml-runtime/src/internal/llm_client/traits/mod.rs index 2b533a4bb..8d28d766b 100644 --- a/engine/baml-runtime/src/internal/llm_client/traits/mod.rs +++ b/engine/baml-runtime/src/internal/llm_client/traits/mod.rs @@ -635,9 +635,10 @@ async fn to_base64_with_inferred_mime_type( Ok((base64, mime_type)) } else { Err(anyhow::anyhow!( - "Failed to fetch media: {}, {}", + "Failed to fetch media: {} {}, {}", response.status(), - response.text().await.unwrap_or_default() + media_url.url, + response.text().await.unwrap_or_default(), )) } } @@ -664,15 +665,14 @@ async fn fetch_with_proxy( let client = reqwest::Client::new(); let request = if let Some(proxy) = proxy_url { - client - .get(format!( - "{}{}", - proxy, - url.parse::() - .map_err(|e| anyhow::anyhow!("Failed to parse URL: {}", e))? - .path() - )) - .header("baml-original-url", url) + let new_proxy_url = format!( + "{}{}", + proxy, + url.parse::() + .map_err(|e| anyhow::anyhow!("Failed to parse URL: {}", e))? + .path() + ); + client.get(new_proxy_url).header("baml-original-url", url) } else { client.get(url) }; diff --git a/typescript/vscode-ext/packages/vscode/src/extension.ts b/typescript/vscode-ext/packages/vscode/src/extension.ts index fdd277171..7809e20bf 100644 --- a/typescript/vscode-ext/packages/vscode/src/extension.ts +++ b/typescript/vscode-ext/packages/vscode/src/extension.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-misused-promises */ import * as vscode from 'vscode' import axios from 'axios' import glooLens from './LanguageToBamlCodeLensProvider' @@ -193,11 +194,21 @@ export function activate(context: vscode.ExtensionContext) { createProxyMiddleware({ changeOrigin: true, pathRewrite: (path, req) => { - // Ensure the URL does not end with a slash + console.log('reqmethod', req.method) + + // Remove the path in the case of images. Since we request things differently for image GET requests, where we add the url to localhost:4500/actual-url.png + // to prevent caching issues with Rust reqwest. + // But for normal completion POST requests, we always call localhost:4500. + // The original url is always in baml-original-url header. + + // Check for file extensions and set path to empty string. + if (/\.[a-zA-Z0-9]+$/.test(path) && req.method === 'GET') { + return '' + } + // Remove trailing slash if (path.endsWith('/')) { return path.slice(0, -1) } - console.log('pathRewrite', path, req) return path }, router: (req) => { @@ -209,11 +220,14 @@ export function activate(context: vscode.ExtensionContext) { delete req.headers['origin'] // Ensure the URL does not end with a slash + console.log('originalUrl1', originalUrl) if (originalUrl.endsWith('/')) { originalUrl = originalUrl.slice(0, -1) } console.log('returning original url', originalUrl) - return new URL(originalUrl).origin + // return new URL(originalUrl).toString() + + return originalUrl } else { console.log('baml-original-url header is missing or invalid') throw new Error('baml-original-url header is missing or invalid') @@ -222,33 +236,19 @@ export function activate(context: vscode.ExtensionContext) { logger: console, on: { proxyReq: (proxyReq, req, res) => { - console.log('proxying request') - - try { - const bamlOriginalUrl = req.headers['baml-original-url'] - if (bamlOriginalUrl === undefined) { - return - } - const targetUrl = new URL(bamlOriginalUrl) - // proxyReq.path = targetUrl.pathname - // proxyReq.p - // It is very important that we ONLY resolve against API_KEY_INJECTION_ALLOWED - // by using the URL origin! (i.e. NOT using str.startsWith - the latter can still - // leak API keys to malicious subdomains e.g. https://api.openai.com.evil.com) - // const headers = API_KEY_INJECTION_ALLOWED[proxyOrigin] - // if (headers === undefined) { - // return - // } - // for (const [header, value] of Object.entries(headers)) { - // proxyReq.setHeader(header, value) - // } - // proxyReq.removeHeader('origin') - // proxyReq.setHeader('Origin', targetUrl.origin) - console.info('Proxying an LLM request (to bypass CORS)', { proxyReq, req, res }) - } catch (err) { - // This is not console.warn because it's not important - console.log('baml-original-url is not parsable', err) - } + // const bamlOriginalUrl = req.headers['baml-original-url'] + // if (typeof bamlOriginalUrl === 'string') { + // const targetUrl = new URL(bamlOriginalUrl) + // // Copy all original headers except those we want to modify/remove + // Object.entries(req.headers).forEach(([key, value]) => { + // if (key !== 'host' && key !== 'origin' && key !== 'baml-original-url') { + // proxyReq.setHeader(key, value) + // } + // }) + // // Set the correct origin and host headers + // proxyReq.setHeader('origin', targetUrl.origin) + // proxyReq.setHeader('host', targetUrl.host) + // } }, proxyRes: (proxyRes, req, res) => { proxyRes.headers['Access-Control-Allow-Origin'] = '*' From 9c5da2ef8c7c99ee5a59f35ca92d2768506a34cf Mon Sep 17 00:00:00 2001 From: hellovai Date: Fri, 13 Dec 2024 06:26:54 -0800 Subject: [PATCH 03/11] chore: Bump version to 0.70.2 (#1239) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bump version to 0.70.2\n\n❌ Typescript integ tests\n❌ Python integ tests\n\nGenerated by bump-version script. --- CHANGELOG.md | 17 + engine/Cargo.lock | 32 +- engine/Cargo.toml | 2 +- engine/language_client_python/pyproject.toml | 2 +- engine/language_client_ruby/baml.gemspec | 2 +- .../language_client_typescript/package.json | 2 +- integ-tests/baml_src/generators.baml | 8 +- integ-tests/python/baml_client/inlinedbaml.py | 2 +- integ-tests/python/report.html | 794 ++++--- integ-tests/ruby/baml_client/inlined.rb | 2 +- .../typescript/baml_client/inlinedbaml.ts | 2 +- integ-tests/typescript/test-report.html | 2007 ++++++++++++----- tools/versions/engine.cfg | 2 +- tools/versions/integ-tests.cfg | 2 +- tools/versions/python.cfg | 2 +- tools/versions/ruby.cfg | 2 +- tools/versions/typescript.cfg | 2 +- tools/versions/vscode.cfg | 2 +- typescript/vscode-ext/packages/package.json | 2 +- 19 files changed, 2083 insertions(+), 803 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e42b65a98..b3c2959e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,23 @@ All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines. +## [0.70.2](https://github.com/boundaryml/baml/compare/0.70.1..0.70.2) - 2024-12-13 + +### Bug Fixes + +- Remove log statements (#1230) - ([4bcdd19](https://github.com/boundaryml/baml/commit/4bcdd198f219cd016ee64cc6444dd62e69f796fb)) - hellovai +- Fix playground proxy related issues (#1228, #1229, #1237) - ([7384ba8](https://github.com/boundaryml/baml/commit/7384ba8cb5d1f012c50ddfb2a44a142ec9654397)) ([7bb6df4](https://github.com/boundaryml/baml/commit/7bb6df40fe37753b946ceeec6b30c4d9cdcc4ce7)) ([16054f5](https://github.com/boundaryml/baml/commit/16054f5f858dcaf80f013d466ceb9354c6a160b7)) - aaronvg + +### DOCS + +- deno run instead of dpx (#1225) - ([7c64299](https://github.com/boundaryml/baml/commit/7c642992cd7d52b7e7cd718542dfa68c41b5aab3)) - Jeffrey Konowitch +- Fix broken links (#1235) - ([859c699](https://github.com/boundaryml/baml/commit/859c6998cef7950d52cc3287f51d74106a58d89d)) - Samuel Lijin + +### Features + +- Support parsing primitive values from single-key objects (#1224) - ([935a190](https://github.com/boundaryml/baml/commit/935a190556d12077f961ce083723e7c1f816f387)) - revidious + + ## [0.70.1](https://github.com/boundaryml/baml/compare/0.70.0..0.70.1) - 2024-12-05 ### Bug Fixes diff --git a/engine/Cargo.lock b/engine/Cargo.lock index e3e3ef421..7594e2ee8 100644 --- a/engine/Cargo.lock +++ b/engine/Cargo.lock @@ -785,7 +785,7 @@ dependencies = [ [[package]] name = "baml-cli" -version = "0.70.1" +version = "0.70.2" dependencies = [ "ambassador", "anyhow", @@ -873,7 +873,7 @@ dependencies = [ [[package]] name = "baml-lib" -version = "0.70.1" +version = "0.70.2" dependencies = [ "base64 0.13.1", "dissimilar", @@ -913,7 +913,7 @@ dependencies = [ [[package]] name = "baml-runtime" -version = "0.70.1" +version = "0.70.2" dependencies = [ "ambassador", "anyhow", @@ -1010,7 +1010,7 @@ dependencies = [ [[package]] name = "baml-schema-build" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "baml-runtime", @@ -1048,7 +1048,7 @@ dependencies = [ [[package]] name = "baml-types" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "clap", @@ -1177,7 +1177,7 @@ dependencies = [ [[package]] name = "bstd" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "assert_cmd", @@ -2571,7 +2571,7 @@ dependencies = [ [[package]] name = "internal-baml-codegen" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "askama", @@ -2596,7 +2596,7 @@ dependencies = [ [[package]] name = "internal-baml-core" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "baml-types", @@ -2633,7 +2633,7 @@ dependencies = [ [[package]] name = "internal-baml-diagnostics" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "colored", @@ -2646,7 +2646,7 @@ dependencies = [ [[package]] name = "internal-baml-jinja" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "askama", @@ -2667,7 +2667,7 @@ dependencies = [ [[package]] name = "internal-baml-jinja-types" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "askama", @@ -2686,7 +2686,7 @@ dependencies = [ [[package]] name = "internal-baml-parser-database" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "baml-types", @@ -2711,7 +2711,7 @@ dependencies = [ [[package]] name = "internal-baml-prompt-parser" -version = "0.70.1" +version = "0.70.2" dependencies = [ "internal-baml-diagnostics", "internal-baml-schema-ast", @@ -2723,7 +2723,7 @@ dependencies = [ [[package]] name = "internal-baml-schema-ast" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "baml-types", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "internal-llm-client" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "baml-types", @@ -2840,7 +2840,7 @@ checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105" [[package]] name = "jsonish" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "assert-json-diff", diff --git a/engine/Cargo.toml b/engine/Cargo.toml index 2f408ea46..8dc32a383 100644 --- a/engine/Cargo.toml +++ b/engine/Cargo.toml @@ -95,7 +95,7 @@ internal-baml-jinja = { path = "baml-lib/jinja" } internal-baml-schema-ast = { path = "baml-lib/schema-ast" } [workspace.package] -version = "0.70.1" +version = "0.70.2" authors = ["Boundary "] description = "BAML Toolchain" diff --git a/engine/language_client_python/pyproject.toml b/engine/language_client_python/pyproject.toml index 0038e6796..1656c7004 100644 --- a/engine/language_client_python/pyproject.toml +++ b/engine/language_client_python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "baml-py" -version = "0.70.1" +version = "0.70.2" description = "BAML python bindings (pyproject.toml)" readme = "README.md" authors = [["Boundary", "contact@boundaryml.com"]] diff --git a/engine/language_client_ruby/baml.gemspec b/engine/language_client_ruby/baml.gemspec index d0e3c1a12..b5ca4262f 100644 --- a/engine/language_client_ruby/baml.gemspec +++ b/engine/language_client_ruby/baml.gemspec @@ -2,7 +2,7 @@ Gem::Specification.new do |spec| spec.name = "baml" - spec.version = "0.70.1" + spec.version = "0.70.2" spec.authors = ["BoundaryML"] spec.email = ["contact@boundaryml.com"] diff --git a/engine/language_client_typescript/package.json b/engine/language_client_typescript/package.json index 9b582ec1e..1a5870973 100644 --- a/engine/language_client_typescript/package.json +++ b/engine/language_client_typescript/package.json @@ -1,6 +1,6 @@ { "name": "@boundaryml/baml", - "version": "0.70.1", + "version": "0.70.2", "description": "BAML typescript bindings (package.json)", "repository": { "type": "git", diff --git a/integ-tests/baml_src/generators.baml b/integ-tests/baml_src/generators.baml index 2080ba649..d666fd8a9 100644 --- a/integ-tests/baml_src/generators.baml +++ b/integ-tests/baml_src/generators.baml @@ -1,24 +1,24 @@ generator lang_python { output_type python/pydantic output_dir "../python" - version "0.70.1" + version "0.70.2" } generator lang_typescript { output_type typescript output_dir "../typescript" - version "0.70.1" + version "0.70.2" } generator lang_ruby { output_type ruby/sorbet output_dir "../ruby" - version "0.70.1" + version "0.70.2" } // generator openapi { // output_type rest/openapi // output_dir "../openapi" -// version "0.70.1" +// version "0.70.2" // on_generate "rm .gitignore" // } diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py index b07375e7b..0e46ddfcb 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.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.1\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.1\"\n// on_generate \"rm .gitignore\"\n// }\n", + "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.70.2\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.2\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.2\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.2\"\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 8839053a9..c1bd0bb53 100644 --- a/integ-tests/python/report.html +++ b/integ-tests/python/report.html @@ -3,82 +3,123 @@
Test Report

Summary

100
1 failed 99 passed

Tests

tests/test_functions.py 196 0:03:06.912160

PASSED test_env_vars_reset 0:00:01.598847

Setup

Call

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

Summary

102
1 failed 101 passed

Tests

tests/test_functions.py 196 0:03:33.568695

PASSED test_env_vars_reset 0:00:01.820627

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

Setup

Call

Captured stdout call
got response key
+

Teardown

PASSED test_sync 0:00:00.472794

Setup

Call

Captured stdout call
got response key
 true
 52
-

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.306592

Setup

Call

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.506679

Setup

Call

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.289915

Setup

Call

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.624947

Setup

Call

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.728360

Setup

Call

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.453278

Setup

Call

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001295

Setup

Call

Captured stderr call
[2024-12-04T06:30:44Z ERROR baml_runtime::tracing]   Error: a: Failed to evaluate assert: Error evaluating constraint: unknown method: object has no method named length (in <string>:1)
+

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.618615

Setup

Call

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.714492

Setup

Call

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.299170

Setup

Call

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.632056

Setup

Call

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.716871

Setup

Call

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.684505

Setup

Call

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001355

Setup

Call

Captured stderr call
[2024-12-13T14:21:47Z 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.368634

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.445836

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.344927

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.427340

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.354604

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.471760

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.776402

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.512772

Setup

Call

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:00.372423

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.702836

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.460990

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.568221

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.384364

Setup

Call

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:00.750769

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.649376

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:00.499413

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:05.532121

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.750962

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:02.252015

Setup

Call

Teardown

PASSED test_should_work_with_vertex 0:00:08.748015

Setup

Call

Teardown

PASSED test_should_work_with_image_base64 0:00:01.301831

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.151316

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.193011

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:02.273093

Setup

Call

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

Teardown

PASSED test_works_with_fallbacks 0:00:01.816097

Setup

Call

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.033483

Setup

Call

Teardown

PASSED test_claude 0:00:00.972559

Setup

Call

Teardown

PASSED test_gemini 0:00:09.202791

Setup

Call

Captured stdout call
LLM output from Gemini: Mildred adjusted her cat-eye glasses, squinting at the neon sign flickering above the dusty gas station. "Dr. Pepper," it buzzed, half the letters burnt out. "You sure this is the place, Earl?"
+

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.522007

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.524706

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.360591

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.443447

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.313055

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.452723

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.380532

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.323265

Setup

Call

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:00.497995

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.643937

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.475970

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.445885

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.419887

Setup

Call

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:01.046794

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.735357

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:00.380765

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:04.608649

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.381997

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:01.422734

Setup

Call

Teardown

PASSED test_should_work_with_vertex 0:00:09.970103

Setup

Call

Teardown

PASSED test_should_work_with_image_base64 0:00:01.379067

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.057976

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.101493

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:02.139693

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: 1734099738, tv_nsec: 399323000 }, latency: 236.591084ms, 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.990924

Setup

Call

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.036548

Setup

Call

Teardown

PASSED test_claude 0:00:01.445531

Setup

Call

Teardown

PASSED test_gemini 0:00:09.097367

Setup

Call

Captured stdout call
LLM output from Gemini: Bartholomew "Bart" Pepper was, by all accounts, a strange man. He spoke in riddles, tinkered with contraptions that defied logic, and smelled perpetually of licorice and burnt sugar.  His small shop, nestled in a forgotten corner of a bustling city, was a testament to his eccentricities.  Bells jingled incessantly from the ceiling, gears spun on walls adorned with cryptic diagrams, and the air crackled with a peculiar energy. 
 
-Earl, a portly beagle mix, snuffled at the cracked asphalt. "Positive. This is where the legend sleeps."
+Bart claimed he was a doctor, not of the body, but of the soul.  His medicine? A concoction he called "Dr. Pepper," a bubbling, fizzing elixir brewed in giant copper kettles that hissed and groaned with ancient secrets. 
 
-Mildred, a renowned historian specializing in the obscure and forgotten, patted her companion's head. They were on the trail of the fabled Dr. Pepper, not the sugary drink, but the man rumored to have invented it. Legend claimed he vanished decades ago, leaving behind whispers and a single, cryptic message: "The answer lies where the bubbles dance."
+One dreary afternoon, a young woman named Amelia wandered into his shop. Burdened with grief over a recent loss, she felt drawn to its warmth and the strange, comforting aroma.  Bart, with eyes that held the wisdom of a thousand lifetimes,  simply smiled and handed her a steaming mug of his concoction.
 
-The gas station attendant, a teenager with a bored expression and a name tag that read "Scooter," shrugged when Mildred inquired about Dr. Pepper. "Never heard of him. This place has been abandoned for years."
+Amelia took a tentative sip. The taste was like nothing she'd ever experienced: a kaleidoscope of flavors, sweet and tangy, with a hint of something indescribable.  As she drank, a warmth spread through her, melting away the chill in her heart.  She looked up, eyes wide with wonder.
 
-Undeterred, Mildred explored the dusty aisles. Earl, sniffing at a forgotten bag of chips, suddenly barked. He pawed at a loose floorboard, revealing a hidden compartment. Inside, nestled amongst cobwebs and faded newspaper clippings, lay a leather-bound journal.
+"What is this magic?" she breathed.
 
-"This is it," Mildred whispered, her heart pounding.
+Bart chuckled, his eyes twinkling. "It's not magic, my dear. It's the taste of possibility, of joy, of a thousand tiny sparks of hope, all bottled up for a rainy day."
 
-The journal chronicled Dr. Pepper's journey, his quest to create a drink that captured the feeling of joy, the fizz of excitement. The final entry detailed his creation, a recipe using a secret blend of 23 flavors.
+And as Amelia finished her mug, she realized he was right. The world outside might have remained gray, but within her, something had shifted.  A flicker of hope, ignited by the doctor's strange brew, had begun to burn. She left the shop that day, lighter in spirit, carrying with her the sweet, fizzy taste of possibility. 
 
-And then, the cryptic message: "The answer lies where the bubbles dance."
+Bart, watching her go, smiled. He knew his concoction couldn't erase her pain, but perhaps, it could help her remember the sweetness life still held. And that, he believed, was a kind of medicine all its own. 
 
-Mildred reread the line, then looked up. Through the dusty window, the setting sun cast an orange glow on a forgotten soda fountain. The bubbles in the forgotten syrup bottles danced in the light.
+

Teardown

PASSED test_gemini_streaming 0:00:08.035179

Setup

Call

Captured stdout call
LLM output from Gemini: The old diner was quiet, the only sound the gentle whir of the ceiling fan struggling against the Texas heat. Behind the counter, Mabel hummed along to a song only she could hear, polishing a glass until it gleamed. 
 
-With trembling hands, Mildred mixed the ingredients from the recipe, adding a final touch - a sprinkle of sunset-colored dust collected from the windowsill. She took a sip, the 23 flavors bursting on her tongue. It tasted of forgotten dreams and joyous memories, a symphony of sweetness and light.
+Suddenly, the bell above the door chimed, announcing a customer. A young woman, her face hidden by a worn cowboy hat, slumped into a booth by the window. Mabel recognized the look of someone who'd lost their way, a look she'd seen a thousand times reflected in the chrome of the napkin dispenser.
 
-Earl barked in agreement, lapping at a spilled drop. The legend wasn't about a drink, Mildred realized, but about capturing a feeling. And Dr. Pepper, the man, had bottled pure happiness. 
+"Howdy," Mabel greeted, setting down the glass. "What can I get you, hon?"
 
-

Teardown

PASSED test_gemini_streaming 0:00:01.480657

Setup

Call

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

Teardown

PASSED test_aws 0:00:01.698838

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:07.257032

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:12.582135

Setup

Call

Teardown

PASSED test_anthropic_shorthand 0:00:02.904237

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:02.755303

Setup

Call

Teardown

PASSED test_fallback_to_shorthand 0:00:01.038533

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:01.456936

Setup

Call

Teardown

PASSED test_streaming 0:00:02.959838

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:02.410336

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:02.568135

Setup

Call

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

Teardown

PASSED test_streaming_uniterated_sync 0:00:02.717052

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:00.978513

Setup

Call

Captured stdout call
msgs:
-Here's a haiku about Mt. Rainier:
+The woman sighed, pushing the hat back to reveal tired eyes. "Just coffee, black as my boots."
 
-Rainier stands alone
-Fourteen thousand feet skyward
-Guardian of clouds
+Mabel raised an eyebrow. "Now, I don't know about all that. How about a Dr. Pepper instead? It's got just the right amount of pep to chase away any blues."
+
+The woman hesitated, then a small smile flickered across her lips. "Alright, a Dr. Pepper it is."
+
+Mabel returned a moment later with a frosty glass, condensation clinging to its sides like tiny diamonds. The woman took a long sip, her eyes widening in surprise. 
+
+"This is... delicious." She took another gulp. "It tastes like...like hope mixed with a little bit of mischief."
+
+Mabel chuckled. "That's Dr. Pepper for ya. Ain't no problem it can't fix, at least for a little while."
+
+And as the woman finished her Dr. Pepper, sharing stories with Mabel and the few other patrons who wandered in, the diner didn't feel quite so quiet anymore. The air was filled with the clinking of glasses, the murmur of conversation, and the sweet, spicy scent of Dr. Pepper, a reminder that even on the loneliest of roads, a little bit of comfort could always be found. 
+
+

Teardown

PASSED test_aws 0:00:01.829658

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:10.503789

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:10.879226

Setup

Call

Teardown

PASSED test_anthropic_shorthand 0:00:03.933997

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.735164

Setup

Call

Teardown

PASSED test_fallback_to_shorthand 0:00:00.860333

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:01.449588

Setup

Call

Teardown

PASSED test_streaming 0:00:02.517329

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:03.343076

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:03.880195

Setup

Call

Teardown

PASSED test_streaming_uniterated_sync 0:00:05.060981

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:01.059323

Setup

Call

Captured stdout call
msgs:
+Here's a haiku about Mt. Rainier's height:
+
+Rainier stands proud, high
+Fourteen thousand feet of snow
+Pierce the summer sky
 final:
-Here's a haiku about Mt. Rainier:
+Here's a haiku about Mt. Rainier's height:
+
+Rainier stands proud, high
+Fourteen thousand feet of snow
+Pierce the summer sky
+

Teardown

PASSED test_streaming_gemini 0:00:09.398223

Setup

Call

Captured stdout call
msgs:
+Barnaby Butterfield, a man of discerning taste and handlebar mustache to match, slammed his newspaper on the table, rattling his wife Agnes' teacup. "Preposterous!" he boomed.
 
-Rainier stands alone
-Fourteen thousand feet skyward
-Guardian of clouds
-

Teardown

PASSED test_streaming_gemini 0:00:08.033064

Setup

Call

Captured stdout call
msgs:
-Dottie Mae clutched her lukewarm Dr Pepper, the condensation forming a sticky ring on the porch swing. A symphony of cicadas played in the muggy summer air. It was her Pawpaw's favorite drink, and even though he'd been gone a year, she still couldn't bring herself to buy the diet kind he'd switched to in his later years. 
+Agnes, a woman unfazed by decades of Barnaby's pronouncements, merely raised an eyebrow. "What is it now, dear?"
 
-She popped the top, the familiar fizz a comforting sound. Pawpaw always said Dr Pepper tasted like summer evenings and fireflies. Back then, Dottie Mae thought it tasted too grown-up, preferring the sickly sweetness of store-brand grape soda. Now, the unique blend of flavors – cherry, licorice, maybe even a hint of  that grape she used to love – brought a wave of bittersweet nostalgia. 
+"This newfangled soda fountain," Barnaby sputtered, jabbing the newspaper with his index finger. "Claims to have 23 flavors! Twenty-three! Utter poppycock, I say. Why, a man can barely discern five flavors in a lifetime, let alone twenty-three!"
 
-Pawpaw had a knack for making the ordinary extraordinary. He'd spin tales of how the 23 flavors in Dr Pepper represented the 23 adventures a person should have in their life. Each sip, he’d say, was a reminder to live life to the fullest. He'd even convinced her it could cure anything from hiccups to heartache. 
+Agnes sighed. Barnaby's disdain for anything new was as predictable as the sunrise. 
 
-Dottie Mae took a long swig, the carbonation biting her tongue. It didn't cure her grief, not exactly, but it did bring a smile to her face. It tasted like Pawpaw, like fireflies, like those endless summer evenings that stretched on forever. 
+Later that day, curiosity gnawing at him like a persistent squirrel, Barnaby found himself standing before the offending soda fountain. A young man with slicked-back hair and a charming smile greeted him.
 
-She imagined him now, sitting beside her on the porch swing, a mischievous twinkle in his eye. "Don't you go wastin' a good Dr Pepper frownin', Dottie Mae," he'd say, his voice raspy with laughter. "Life's too short, even with 23 adventures."
+"Welcome, sir! Care to try a Dr. Pepper? It's got 23 distinct flavors, guaranteed to tantalize your taste buds!"
 
-She took another sip, the bittersweetness comforting on her tongue. He was right, she realized. Life was too short. And maybe, just maybe, she had a few adventures left to experience.  
+Barnaby scoffed. "Twenty-three flavors, you say? Humbug!" But intrigued nonetheless, he relented.
+
+The young man filled a glass with a bubbly, caramel-colored concoction. Barnaby took a tentative sip. His eyes widened. He took another, larger gulp. And another.
+
+A slow smile spread across his face, his mustache twitching. He tasted licorice, cherry, even a hint of... was that amaretto? The flavors danced on his tongue, a delightful mystery he couldn't quite decipher.
+
+He finished the glass in stunned silence. 
+
+"Well, sir?" the young man asked, a twinkle in his eye. 
+
+Barnaby cleared his throat, his previous indignation forgotten. "Young man," he declared, adjusting his hat, "I may have been wrong about the number of flavors in a lifetime. But by Jove, this Dr. Pepper just might prove me wrong about everything else." 
+
+From that day forward, Barnaby Butterfield became Dr. Pepper's most enthusiastic convert, his handlebar mustache perpetually adorned with a telltale fizz. He never did figure out all 23 flavors, but the joy, he discovered, was in the delicious mystery of it all. 
 
 final:
-Dottie Mae clutched her lukewarm Dr Pepper, the condensation forming a sticky ring on the porch swing. A symphony of cicadas played in the muggy summer air. It was her Pawpaw's favorite drink, and even though he'd been gone a year, she still couldn't bring herself to buy the diet kind he'd switched to in his later years. 
+Barnaby Butterfield, a man of discerning taste and handlebar mustache to match, slammed his newspaper on the table, rattling his wife Agnes' teacup. "Preposterous!" he boomed.
+
+Agnes, a woman unfazed by decades of Barnaby's pronouncements, merely raised an eyebrow. "What is it now, dear?"
+
+"This newfangled soda fountain," Barnaby sputtered, jabbing the newspaper with his index finger. "Claims to have 23 flavors! Twenty-three! Utter poppycock, I say. Why, a man can barely discern five flavors in a lifetime, let alone twenty-three!"
 
-She popped the top, the familiar fizz a comforting sound. Pawpaw always said Dr Pepper tasted like summer evenings and fireflies. Back then, Dottie Mae thought it tasted too grown-up, preferring the sickly sweetness of store-brand grape soda. Now, the unique blend of flavors – cherry, licorice, maybe even a hint of  that grape she used to love – brought a wave of bittersweet nostalgia. 
+Agnes sighed. Barnaby's disdain for anything new was as predictable as the sunrise. 
 
-Pawpaw had a knack for making the ordinary extraordinary. He'd spin tales of how the 23 flavors in Dr Pepper represented the 23 adventures a person should have in their life. Each sip, he’d say, was a reminder to live life to the fullest. He'd even convinced her it could cure anything from hiccups to heartache. 
+Later that day, curiosity gnawing at him like a persistent squirrel, Barnaby found himself standing before the offending soda fountain. A young man with slicked-back hair and a charming smile greeted him.
 
-Dottie Mae took a long swig, the carbonation biting her tongue. It didn't cure her grief, not exactly, but it did bring a smile to her face. It tasted like Pawpaw, like fireflies, like those endless summer evenings that stretched on forever. 
+"Welcome, sir! Care to try a Dr. Pepper? It's got 23 distinct flavors, guaranteed to tantalize your taste buds!"
 
-She imagined him now, sitting beside her on the porch swing, a mischievous twinkle in his eye. "Don't you go wastin' a good Dr Pepper frownin', Dottie Mae," he'd say, his voice raspy with laughter. "Life's too short, even with 23 adventures."
+Barnaby scoffed. "Twenty-three flavors, you say? Humbug!" But intrigued nonetheless, he relented.
 
-She took another sip, the bittersweetness comforting on her tongue. He was right, she realized. Life was too short. And maybe, just maybe, she had a few adventures left to experience.  
+The young man filled a glass with a bubbly, caramel-colored concoction. Barnaby took a tentative sip. His eyes widened. He took another, larger gulp. And another.
 
-

Teardown

PASSED test_tracing_async_only 0:00:05.250146

Setup

Call

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

Teardown

PASSED test_tracing_sync 0:00:00.000317

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.393780

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.048189

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.139718

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.325910

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.049657

Setup

Call

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

Teardown

PASSED test_dynamic_class_output 0:00:00.955351

Setup

Call

Captured stdout call
[]
+A slow smile spread across his face, his mustache twitching. He tasted licorice, cherry, even a hint of... was that amaretto? The flavors danced on his tongue, a delightful mystery he couldn't quite decipher.
+
+He finished the glass in stunned silence. 
+
+"Well, sir?" the young man asked, a twinkle in his eye. 
+
+Barnaby cleared his throat, his previous indignation forgotten. "Young man," he declared, adjusting his hat, "I may have been wrong about the number of flavors in a lifetime. But by Jove, this Dr. Pepper just might prove me wrong about everything else." 
+
+From that day forward, Barnaby Butterfield became Dr. Pepper's most enthusiastic convert, his handlebar mustache perpetually adorned with a telltale fizz. He never did figure out all 23 flavors, but the joy, he discovered, was in the delicious mystery of it all. 
+
+

Teardown

PASSED test_tracing_async_only 0:00:04.823691

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

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.394251

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.024693

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.441707

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.484387

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.525739

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

Setup

Call

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

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.877010

Setup

Call

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

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.527380

Setup

Call

Captured stdout call
streamed  name=None hair_color=None
+

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.772107

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

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}
@@ -155,7 +196,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:00.630070

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.646184

Setup

Call

Captured stdout call
[]
 streamed  {'hair_color': '{'}
 streamed  {'hair_color': '{'}
 streamed  {'hair_color': '{\n  "'}
@@ -172,18 +213,37 @@
 final  hair_color='black'
 final  {'hair_color': 'black'}
 final  {"hair_color":"black"}
-

Teardown

PASSED test_dynamic_inputs_list2 0:00:00.933096

Setup

Call

Teardown

PASSED test_dynamic_types_new_enum 0:00:01.227953

Setup

Call

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.667437

Setup

Call

Teardown

PASSED test_dynamic_literals 0:00:03.292589

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:00.998444

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:00.608324

Setup

Call

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

Teardown

PASSED test_dynamic_output_union 0:00:01.733173

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.215553

Setup

Call

Teardown

PASSED test_dynamic_types_new_enum 0:00:01.613053

Setup

Call

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.541909

Setup

Call

Teardown

PASSED test_dynamic_literals 0:00:00.734552

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:00.901091

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:00.657098

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

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

Setup

Call

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

Teardown

PASSED test_nested_class_streaming 0:00:05.007773

Setup

Call

Captured stdout call
streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
@@ -191,80 +251,269 @@
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': '', 'prop2': None}
-streamed  {'prop1': 'value', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': '', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-final  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.426431

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:01.472761

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:01.233944

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.221894

Setup

Call

Captured stdout call
Event log hook1: 
+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': 'ag', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+final  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.760949

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:01.095419

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:00.824506

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.131149

Setup

Call

Captured stdout call
Event log hook1: 
 Event log event  BamlLogEvent {
     metadata: {
-        event_id: "65de820f-a524-4e75-b641-ad1d7ebedd54",
+        event_id: "78dc8c9b-f55c-437d-a06c-18928848d89e",
         parent_id: None,
-        root_event_id: "65de820f-a524-4e75-b641-ad1d7ebedd54"
+        root_event_id: "78dc8c9b-f55c-437d-a06c-18928848d89e"
     },
     prompt: "[
   {
@@ -278,124 +527,124 @@
 ]",
     raw_output: "["a", "b", "c"]",
     parsed_output: "["a", "b", "c"]",
-    start_time: "2024-12-04T06:33:01.559Z"
+    start_time: "2024-12-13T14:24:20.930Z"
 }
-

Teardown

PASSED test_aws_bedrock 0:00:03.490771

Setup

Call

Captured stdout call
unstreamed 
+

Teardown

PASSED test_aws_bedrock 0:00:03.121428

Setup

Call

Captured stdout call
unstreamed 
 
-In the heart of the ancient forest, there was a peculiar rock that had been passed down through generations of the local tribe. It was said that the rock held a secret, a spark of magic that only revealed itself to those who possessed a pure heart and a curious mind.
+The old geologist, Dr. Maria, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the twisted granite, the layered sandstone, the glittering quartz. But nothing could have prepared her for what she was about to discover.
 
-The rock was a deep, rich brown, with veins of silver that seemed to shimmer in the sunlight. It was smooth to the touch, as if it had been worn down by the gentle touch of countless hands over the
+As she made her way through the dense forest, her eyes scanning the ground for the perfect specimen, she stumbled upon a peculiar rock. It was unlike any she had ever seen before - a deep, rich blue
 streamed  '\n\n'
-streamed  '\n\nThe'
-streamed  '\n\nThe old'
-streamed  '\n\nThe old ge'
-streamed  '\n\nThe old geologist'
-streamed  '\n\nThe old geologist,'
-streamed  '\n\nThe old geologist, Professor'
-streamed  '\n\nThe old geologist, Professor Thompson'
-streamed  '\n\nThe old geologist, Professor Thompson,'
-streamed  '\n\nThe old geologist, Professor Thompson, had'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying the'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying the ancient'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying the ancient rocks'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying the ancient rocks of'
-streamed  'The old geologist, Professor Thompson, had spent his entire career studying the ancient rocks of the'
-streamed  'ogist, Professor Thompson, had spent his entire career studying the ancient rocks of the Appalachian'
-streamed  'fessor Thompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains'
-streamed  'essor Thompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains.'
-streamed  'or Thompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains. He'
-streamed  'hompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains. He had'
-streamed  'on, had spent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen'
-streamed  ' had spent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it'
-streamed  ' spent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it all'
-streamed  'pent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it all -'
-streamed  ' his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it all - the'
-streamed  'tire career studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossil'
-streamed  ' career studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized'
-streamed  'reer studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized tr'
-streamed  'er studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized tril'
-streamed  ' studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilob'
-streamed  'dying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites'
-streamed  'ying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites,'
-streamed  ' the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the'
-streamed  'cient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz'
-streamed  'ks of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals'
-streamed  's of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals,'
-streamed  ' the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the'
-streamed  'ppalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins'
-streamed  'lachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of'
-streamed  'an Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold'
-streamed  'n Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold.'
-streamed  'untains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold. But'
-streamed  ' He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold. But nothing'
-streamed  'had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold. But nothing had'
-streamed  'een it all - the fossilized trilobites, the quartz crystals, the veins of gold. But nothing had ever'
-streamed  '- the fossilized trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated'
-streamed  'e fossilized trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him'
-streamed  'silized trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him more'
-streamed  'ed trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him more than'
-streamed  'rilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him more than the'
-streamed  's, the quartz crystals, the veins of gold. But nothing had ever fascinated him more than the strange'
-streamed  ', the quartz crystals, the veins of gold. But nothing had ever fascinated him more than the strange,'
-streamed  'artz crystals, the veins of gold. But nothing had ever fascinated him more than the strange, glowing'
-streamed  'crystals, the veins of gold. But nothing had ever fascinated him more than the strange, glowing rock'
-streamed  'stals, the veins of gold. But nothing had ever fascinated him more than the strange, glowing rock he'
-streamed  's, the veins of gold. But nothing had ever fascinated him more than the strange, glowing rock he had'
-streamed  's of gold. But nothing had ever fascinated him more than the strange, glowing rock he had discovered'
-streamed  'gold. But nothing had ever fascinated him more than the strange, glowing rock he had discovered deep'
-streamed  'd. But nothing had ever fascinated him more than the strange, glowing rock he had discovered deep in'
-streamed  'ut nothing had ever fascinated him more than the strange, glowing rock he had discovered deep in the'
-streamed  'hing had ever fascinated him more than the strange, glowing rock he had discovered deep in the heart'
-streamed  'g had ever fascinated him more than the strange, glowing rock he had discovered deep in the heart of'
-streamed  'd ever fascinated him more than the strange, glowing rock he had discovered deep in the heart of the'
-streamed  'cinated him more than the strange, glowing rock he had discovered deep in the heart of the mountains'
-streamed  'ated him more than the strange, glowing rock he had discovered deep in the heart of the mountains.\n\n'
-streamed  'ed him more than the strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt'
-streamed  'im more than the strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was'
-streamed  ' more than the strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a'
-streamed  'n the strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar'
-streamed  'strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing'
-streamed  'trange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing,'
-streamed  'e, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this'
-streamed  'owing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock'
-streamed  'wing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock.'
-streamed  'g rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It'
-streamed  'he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked'
-streamed  'd discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like'
-streamed  'scovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any'
-streamed  'ed deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other'
-streamed  'in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite'
-streamed  'n the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite,'
-streamed  'e heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite, but'
-streamed  'rt of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite, but when'
-streamed  'mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite, but when Professor'
-streamed  '.\n\nIt was a peculiar thing, this rock. It looked like any other granite, but when Professor Thompson'
-streamed  ' was a peculiar thing, this rock. It looked like any other granite, but when Professor Thompson held'
-streamed  's a peculiar thing, this rock. It looked like any other granite, but when Professor Thompson held it'
-streamed  ' peculiar thing, this rock. It looked like any other granite, but when Professor Thompson held it up'
-streamed  'culiar thing, this rock. It looked like any other granite, but when Professor Thompson held it up to'
-streamed  'ar thing, this rock. It looked like any other granite, but when Professor Thompson held it up to the'
-streamed  'ng, this rock. It looked like any other granite, but when Professor Thompson held it up to the light'
-streamed  'g, this rock. It looked like any other granite, but when Professor Thompson held it up to the light,'
-streamed  'this rock. It looked like any other granite, but when Professor Thompson held it up to the light, he'
-streamed  'ock. It looked like any other granite, but when Professor Thompson held it up to the light, he could'
-streamed  't looked like any other granite, but when Professor Thompson held it up to the light, he could swear'
-streamed  't looked like any other granite, but when Professor Thompson held it up to the light, he could swear'
-streamed  't looked like any other granite, but when Professor Thompson held it up to the light, he could swear'
-streamed  't looked like any other granite, but when Professor Thompson held it up to the light, he could swear'
+streamed  '\n\nIn'
+streamed  '\n\nIn the'
+streamed  '\n\nIn the heart'
+streamed  '\n\nIn the heart of'
+streamed  '\n\nIn the heart of the'
+streamed  '\n\nIn the heart of the ancient'
+streamed  '\n\nIn the heart of the ancient forest'
+streamed  '\n\nIn the heart of the ancient forest,'
+streamed  '\n\nIn the heart of the ancient forest, there'
+streamed  '\n\nIn the heart of the ancient forest, there was'
+streamed  '\n\nIn the heart of the ancient forest, there was a'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that had'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that had been'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that had been passed'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that had been passed down'
+streamed  'e heart of the ancient forest, there was a peculiar rock formation that had been passed down through'
+streamed  'he ancient forest, there was a peculiar rock formation that had been passed down through generations'
+streamed  'ancient forest, there was a peculiar rock formation that had been passed down through generations of'
+streamed  't forest, there was a peculiar rock formation that had been passed down through generations of local'
+streamed  't, there was a peculiar rock formation that had been passed down through generations of local legend'
+streamed  ', there was a peculiar rock formation that had been passed down through generations of local legend.'
+streamed  'here was a peculiar rock formation that had been passed down through generations of local legend. It'
+streamed  ' was a peculiar rock formation that had been passed down through generations of local legend. It was'
+streamed  'a peculiar rock formation that had been passed down through generations of local legend. It was said'
+streamed  'uliar rock formation that had been passed down through generations of local legend. It was said that'
+streamed  'iar rock formation that had been passed down through generations of local legend. It was said that a'
+streamed  'ock formation that had been passed down through generations of local legend. It was said that a bolt'
+streamed  ' formation that had been passed down through generations of local legend. It was said that a bolt of'
+streamed  ' that had been passed down through generations of local legend. It was said that a bolt of lightning'
+streamed  't had been passed down through generations of local legend. It was said that a bolt of lightning had'
+streamed  'een passed down through generations of local legend. It was said that a bolt of lightning had struck'
+streamed  'passed down through generations of local legend. It was said that a bolt of lightning had struck the'
+streamed  'd down through generations of local legend. It was said that a bolt of lightning had struck the rock'
+streamed  'ough generations of local legend. It was said that a bolt of lightning had struck the rock centuries'
+streamed  ' generations of local legend. It was said that a bolt of lightning had struck the rock centuries ago'
+streamed  'generations of local legend. It was said that a bolt of lightning had struck the rock centuries ago,'
+streamed  'rations of local legend. It was said that a bolt of lightning had struck the rock centuries ago, imb'
+streamed  'ons of local legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing'
+streamed  ' of local legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it'
+streamed  'ocal legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it with'
+streamed  'al legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a'
+streamed  'd. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange'
+streamed  't was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and'
+streamed  'was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and w'
+streamed  'd that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous'
+streamed  ' a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power'
+streamed  'bolt of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\n'
+streamed  't of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe'
+streamed  'lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock'
+streamed  'ightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock,'
+streamed  'ng had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known'
+streamed  'had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as'
+streamed  'd struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "'
+streamed  'truck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The'
+streamed  'the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heart'
+streamed  'ock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone'
+streamed  'k centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone,"'
+streamed  'nturies ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was'
+streamed  'uries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a'
+streamed  ' ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep'
+streamed  'ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep,'
+streamed  'imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich'
+streamed  'g it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown'
+streamed  'ith a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color'
+streamed  'th a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color,'
+streamed  'strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with'
+streamed  'e and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins'
+streamed  'nd wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins of'
+streamed  'ous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins of glitter'
+streamed  ' power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins of glittering'
+streamed  '\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz'
+streamed  ' rock, known as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz that'
+streamed  'known as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed'
+streamed  'wn as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed to'
+streamed  '"The Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse'
+streamed  'Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse with'
+streamed  'rtstone," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an'
+streamed  'e," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner'
+streamed  's a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner light'
+streamed  ' a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner light.'
+streamed  'deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner light. It'
+streamed  'rich brown color, with veins of glittering quartz that seemed to pulse with an inner light. It stood'
+streamed  'brown color, with veins of glittering quartz that seemed to pulse with an inner light. It stood tall'
+streamed  'n color, with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and'
+streamed  'r, with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and proud'
+streamed  ', with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and proud,'
+streamed  'with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and proud, a'
+streamed  's of glittering quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel'
+streamed  'f glittering quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of'
+streamed  'ittering quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the'
+streamed  'g quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest'
+streamed  'tz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor'
+streamed  'z that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor,'
+streamed  'at seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and'
+streamed  'eemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was'
+streamed  'eemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was'
+streamed  'eemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was'
+streamed  'eemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was'
 streamed final 
 
-The old geologist, Professor Thompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him more than the strange, glowing rock he had discovered deep in the heart of the mountains.
+In the heart of the ancient forest, there was a peculiar rock formation that had been passed down through generations of local legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.
 
-It was a peculiar thing, this rock. It looked like any other granite, but when Professor Thompson held it up to the light, he could swear
-

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.005549

Setup

Call

Teardown

PASSED test_serialization_exception 0:00:00.437666

Setup

Call

Captured stdout call
Exception message from test:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
+The rock, known as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was
+

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.005544

Setup

Call

Teardown

PASSED test_serialization_exception 0:00:01.364374

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

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None
+

Teardown

PASSED test_stream_serialization_exception 0:00:00.500441

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

Setup

Call

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

Teardown

PASSED test_stream2_serialization_exception 0:00:00.413288

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

Teardown

PASSED test_descriptions 0:00:06.361985

Setup

Call

Teardown

FAILED test_caching 0:00:06.736878

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

Setup

Call

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

Teardown

PASSED test_descriptions 0:00:06.557638

Setup

Call

Teardown

FAILED test_caching 0:00:07.004457

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

Setup

Call

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

Teardown

PASSED test_arg_exceptions 0:00:00.796212

Setup

Call

Captured stderr call
[2024-12-04T06:33:21Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
+tests/test_functions.py:1271: AssertionError
Captured stdout call
Duration no caching:  3.379484176635742
+Duration with caching:  3.624055862426758
+

Teardown

PASSED test_arg_exceptions 0:00:01.166600

Setup

Call

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

Teardown

PASSED test_map_as_param 0:00:00.001158

Setup

Call

Captured stderr call
[2024-12-04T06:33:21Z ERROR baml_runtime::tracing]   Error: myMap: a: Expected map, got `String("b")`
+

Teardown

PASSED test_map_as_param 0:00:00.001121

Setup

Call

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

Teardown

PASSED test_baml_validation_error_format 0:00:00.384686

Setup

Call

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

Teardown

PASSED test_baml_validation_error_format 0:00:00.476185

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 help you today?, prompt=[chat] system: Say "hello there".
+  - <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.523697

Setup

Call

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.483117

Setup

Call

Teardown

PASSED test_no_stream_compound_object 0:00:06.729537

Setup

Call

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:05.083854

Setup

Call

Teardown

PASSED test_differing_unions 0:00:02.546719

Setup

Call

Teardown

PASSED test_return_failing_assert 0:00:00.302599

Setup

Call

Teardown

PASSED test_parameter_failing_assert 0:00:00.001364

Setup

Call

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

Teardown

PASSED test_no_stream_big_integer 0:00:00.625432

Setup

Call

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.461699

Setup

Call

Teardown

PASSED test_no_stream_compound_object 0:00:04.063495

Setup

Call

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:16.651412

Setup

Call

Teardown

PASSED test_differing_unions 0:00:00.809205

Setup

Call

Teardown

PASSED test_return_failing_assert 0:00:00.351492

Setup

Call

Teardown

PASSED test_parameter_failing_assert 0:00:00.001113

Setup

Call

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

Teardown

PASSED test_failing_assert_can_stream 0:00:02.397616

Setup

Call

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

Teardown

PASSED test_failing_assert_can_stream 0:00:03.925711

Setup

Call

Captured stdout call
None
 None
 None
 None
@@ -1080,9 +1352,9 @@
 None
 None
 None
-

Teardown

PASSED test_simple_recursive_type 0:00:02.784238

Setup

Call

Teardown

PASSED test_mutually_recursive_type 0:00:02.297518

Setup

Call

Teardown

PASSED test_block_constraints 0:00:00.800160

Setup

Call

Teardown

PASSED test_nested_block_constraints 0:00:00.603441

Setup

Call

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

Teardown

PASSED test_block_constraint_arguments 0:00:00.001755

Setup

Call

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

Teardown

PASSED test_simple_recursive_type 0:00:02.897785

Setup

Call

Teardown

PASSED test_mutually_recursive_type 0:00:02.089253

Setup

Call

Teardown

PASSED test_block_constraints 0:00:00.576212

Setup

Call

Teardown

PASSED test_nested_block_constraints 0:00:00.518378

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

Setup

Call

Captured stderr call
[2024-12-13T14:25:15Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-[2024-12-04T06:33:46Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+[2024-12-13T14:25:15Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-

Teardown

tests/test_pydantic.py 3 0:00:00.003358

PASSED test_model_validate_success 0:00:00.001464

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000840

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.001054

Setup

Call

Teardown

\ No newline at end of file +

Teardown

tests/test_pydantic.py 3 0:00:00.001558

PASSED test_model_validate_success 0:00:00.000497

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000529

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000532

Setup

Call

Teardown

tests/test_python.py 2 0:00:00.005403

PASSED test_inspect 0:00:00.005053

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

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 d3d1f5a73..993eeb0c1 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.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.1\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.1\"\n// on_generate \"rm .gitignore\"\n// }\n", + "generators.baml" => "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.70.2\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.2\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.2\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.2\"\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 8d011450c..2139e8c6f 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.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.1\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.1\"\n// on_generate \"rm .gitignore\"\n// }\n", + "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.70.2\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.2\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.2\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.2\"\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 b15e66c77..d1d5fad24 100644 --- a/integ-tests/typescript/test-report.html +++ b/integ-tests/typescript/test-report.html @@ -257,65 +257,24 @@ font-size: 1rem; padding: 0 0.5rem; } -

Test Report

Started: 2024-12-03 22:28:38
Suites (1)
0 passed
1 failed
0 pending
Tests (67)
65 passed
2 failed
0 pending
Integ tests > should work for all inputs
single bool
passed
0.783s
Integ tests > should work for all inputs
single string list
passed
0.427s
Integ tests > should work for all inputs
return literal union
passed
0.379s
Integ tests > should work for all inputs
single class
passed
0.455s
Integ tests > should work for all inputs
multiple classes
passed
0.354s
Integ tests > should work for all inputs
single enum list
passed
0.382s
Integ tests > should work for all inputs
single float
passed
0.424s
Integ tests > should work for all inputs
single int
passed
0.455s
Integ tests > should work for all inputs
single literal int
passed
0.3s
Integ tests > should work for all inputs
single literal bool
passed
0.601s
Integ tests > should work for all inputs
single literal string
passed
0.316s
Integ tests > should work for all inputs
single class with literal prop
passed
0.524s
Integ tests > should work for all inputs
single class with literal union prop
passed
3.24s
Integ tests > should work for all inputs
single optional string
passed
0.43s
Integ tests > should work for all inputs
single map string to string
passed
0.524s
Integ tests > should work for all inputs
single map string to class
passed
0.558s
Integ tests > should work for all inputs
single map string to map
passed
0.521s
Integ tests > should work for all inputs
enum key in map
passed
0.805s
Integ tests > should work for all inputs
literal string union key in map
passed
0.735s
Integ tests > should work for all inputs
single literal string key in map
passed
0.546s
Integ tests
should work for all outputs
passed
4.698s
Integ tests
works with retries1
passed
1.184s
Integ tests
works with retries2
passed
2.143s
Integ tests
works with fallbacks
passed
1.991s
Integ tests
should work with image from url
passed
1.839s
Integ tests
should work with image from base 64
passed
1.328s
Integ tests
should work with audio base 64
passed
1.158s
Integ tests
should work with audio from url
passed
1.171s
Integ tests
should support streaming in OpenAI
passed
3.161s
Integ tests
should support streaming in Gemini
passed
7.739s
Integ tests
should support AWS
passed
1.883s
Integ tests
should support streaming in AWS
passed
1.524s
Integ tests
should allow overriding the region
passed
0.08s
Integ tests
should support OpenAI shorthand
passed
9.47s
Integ tests
should support OpenAI shorthand streaming
passed
7.945s
Integ tests
should support anthropic shorthand
passed
3.566s
Integ tests
should support anthropic shorthand streaming
passed
3.256s
Integ tests
should support streaming without iterating
passed
2.014s
Integ tests
should support streaming in Claude
passed
1.12s
Integ tests
should support vertex
passed
11.387s
Integ tests
supports tracing sync
passed
0.01s
Integ tests
supports tracing async
passed
2.306s
Integ tests
should work with dynamic types single
passed
1.641s
Integ tests
should work with dynamic types enum
passed
0.848s
Integ tests
should work with dynamic literals
passed
0.961s
Integ tests
should work with dynamic types class
passed
1.049s
Integ tests
should work with dynamic inputs class
passed
0.597s
Integ tests
should work with dynamic inputs list
passed
0.995s
Integ tests
should work with dynamic output map
passed
0.759s
Integ tests
should work with dynamic output union
passed
1.62s
Integ tests
should work with nested classes
failed
10.39s
Error: expect(received).toEqual(expected) // deep equality
+

Test Report

Started: 2024-12-13 06:19:24
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.519s
Integ tests > should work for all inputs
single string list
passed
0.413s
Integ tests > should work for all inputs
return literal union
passed
0.491s
Integ tests > should work for all inputs
single class
passed
0.667s
Integ tests > should work for all inputs
multiple classes
passed
0.525s
Integ tests > should work for all inputs
single enum list
passed
0.325s
Integ tests > should work for all inputs
single float
passed
0.364s
Integ tests > should work for all inputs
single int
passed
0.358s
Integ tests > should work for all inputs
single literal int
passed
0.318s
Integ tests > should work for all inputs
single literal bool
passed
0.42s
Integ tests > should work for all inputs
single literal string
passed
0.36s
Integ tests > should work for all inputs
single class with literal prop
passed
0.76s
Integ tests > should work for all inputs
single class with literal union prop
passed
0.592s
Integ tests > should work for all inputs
single optional string
passed
0.273s
Integ tests > should work for all inputs
single map string to string
passed
0.466s
Integ tests > should work for all inputs
single map string to class
passed
0.653s
Integ tests > should work for all inputs
single map string to map
passed
0.542s
Integ tests > should work for all inputs
enum key in map
passed
3.123s
Integ tests > should work for all inputs
literal string union key in map
passed
0.882s
Integ tests > should work for all inputs
single literal string key in map
passed
0.431s
Integ tests
should work for all outputs
passed
5.12s
Integ tests
works with retries1
passed
1.027s
Integ tests
works with retries2
passed
2.329s
Integ tests
works with fallbacks
passed
1.671s
Integ tests
should work with image from url
passed
1.523s
Integ tests
should work with image from base 64
passed
1.843s
Integ tests
should work with audio base 64
passed
1.37s
Integ tests
should work with audio from url
passed
1.114s
Integ tests
should support streaming in OpenAI
passed
2.027s
Integ tests
should support streaming in Gemini
passed
9.788s
Integ tests
should support AWS
passed
1.777s
Integ tests
should support streaming in AWS
passed
1.416s
Integ tests
should allow overriding the region
passed
0.046s
Integ tests
should support OpenAI shorthand
passed
17.821s
Integ tests
should support OpenAI shorthand streaming
passed
9.413s
Integ tests
should support anthropic shorthand
passed
3.275s
Integ tests
should support anthropic shorthand streaming
passed
3.013s
Integ tests
should support streaming without iterating
passed
3.361s
Integ tests
should support streaming in Claude
passed
1.412s
Integ tests
should support vertex
passed
10.957s
Integ tests
supports tracing sync
passed
0.009s
Integ tests
supports tracing async
passed
3.22s
Integ tests
should work with dynamic types single
passed
0.985s
Integ tests
should work with dynamic types enum
passed
1.212s
Integ tests
should work with dynamic literals
passed
1.211s
Integ tests
should work with dynamic types class
passed
1.75s
Integ tests
should work with dynamic inputs class
passed
0.524s
Integ tests
should work with dynamic inputs list
passed
0.597s
Integ tests
should work with dynamic output map
passed
1.157s
Integ tests
should work with dynamic output union
passed
1.951s
Integ tests
should work with nested classes
failed
12.333s
Error: expect(received).toEqual(expected) // deep equality
 
 - Expected  - 1
 + Received  + 1
 
   Object {
-    "prop1": "hello",
+    "prop1": "Hello",
     "prop2": Object {
       "inner": Object {
         "prop2": 42,
--       "prop3": 3.14,
+-       "prop3": 3.14159,
 +       "prop3": null,
       },
-      "prop1": "world",
-      "prop2": "again",
+      "prop1": "World",
+      "prop2": "JSON is coolest thing ever",
     },
   }
-    at Object.toEqual (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:604:25)
Integ tests
should work with dynamic client
passed
0.377s
Integ tests
should work with 'onLogEvent'
passed
1.83s
Integ tests
should work with a sync client
passed
0.718s
Integ tests
should raise an error when appropriate
passed
0.734s
Integ tests
should raise a BAMLValidationError
passed
0.496s
Integ tests
should reset environment variables correctly
passed
1.114s
Integ tests
should use aliases when serializing input objects - classes
passed
0.801s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.944s
Integ tests
should use aliases when serializing input objects - enums
passed
0.531s
Integ tests
should use aliases when serializing input objects - lists
passed
0.518s
Integ tests
constraints: should handle checks in return types
passed
0.703s
Integ tests
constraints: should handle checks in returned unions
passed
0.614s
Integ tests
constraints: should handle block-level checks
passed
0.512s
Integ tests
constraints: should handle nested-block-level checks
passed
0.583s
Integ tests
simple recursive type
passed
3.062s
Integ tests
mutually recursive type
failed
1.974s
Error: expect(received).toEqual(expected) // deep equality
-
-- Expected  - 6
-+ Received  + 5
-
-@@ -4,30 +4,29 @@
-        Object {
-          "children": Object {
-            "trees": Array [
-              Object {
-                "children": Object {
--                 "trees": Array [
-+                 "trees": Array [],
-+               },
-+               "data": 1,
-+             },
-              Object {
-                "children": Object {
-                  "trees": Array [],
-                },
-                "data": 2,
-              },
-            ],
-          },
--               "data": 1,
-+         "data": 3,
-        },
-        Object {
-          "children": Object {
-            "trees": Array [],
-          },
-          "data": 4,
--             },
--           ],
--         },
--         "data": 3,
-        },
-        Object {
-          "children": Object {
-            "trees": Array [
-              Object {
-    at Object.toEqual (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:838:17)
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:48:15)
+    at 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.404s
Integ tests
should work with 'onLogEvent'
passed
1.754s
Integ tests
should work with a sync client
passed
0.546s
Integ tests
should raise an error when appropriate
passed
1.02s
Integ tests
should raise a BAMLValidationError
passed
0.447s
Integ tests
should reset environment variables correctly
passed
1.274s
Integ tests
should use aliases when serializing input objects - classes
passed
1.22s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.752s
Integ tests
should use aliases when serializing input objects - enums
passed
0.511s
Integ tests
should use aliases when serializing input objects - lists
passed
0.461s
Integ tests
constraints: should handle checks in return types
passed
0.894s
Integ tests
constraints: should handle checks in returned unions
passed
0.713s
Integ tests
constraints: should handle block-level checks
passed
0.569s
Integ tests
constraints: should handle nested-block-level checks
passed
0.652s
Integ tests
simple recursive type
passed
2.685s
Integ tests
mutually recursive type
passed
1.828s
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)
@@ -330,11 +289,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: 1733293736, tv_nsec: 692524000 }, latency: 260.464458ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blah. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+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: 1734099582, tv_nsec: 912302000 }, latency: 167.358ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blah. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
     at BamlAsyncClient.parsed [as TestRetryConstant] (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:2810:18)
     at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:191:7) {
   code: 'GenericFailure'
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:203:15)
Expected error Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "RetryClientExponential", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1733293738, tv_nsec: 928829000 }, latency: 188.79025ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+}
    at 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: 1734099585, tv_nsec: 226179000 }, latency: 206.093041ms, 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'
@@ -584,6 +543,9 @@
     at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
     at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
     at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:407:17)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
     at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
     at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
     at async Promise.all (index 1)
@@ -668,7 +630,7 @@
     at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
     at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
Property: attributes
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:540:13)
final  {
   hair_color: 'black',
-  attributes: { height: '6 feet', eye_color: 'blue', facial_hair: 'beard' }
+  attributes: { eye_color: 'blue', facial_hair: 'beard' }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:564:13)
     at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
     at new Promise (<anonymous>)
@@ -729,718 +691,1747 @@
     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' },
+  attributes: { eye_color: 'blue', facial_hair: 'beard', age: '30' },
   height: { feet: 6, inches: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:585:13)
final  {
   hair_color: 'black',
   attributes: { eye_color: 'blue', facial_hair: 'beard' },
   height: { meters: 1.8 }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: '', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: '', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: '', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: 'ag', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 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: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: '', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: '', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is cool', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:623:15)
     at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:70:17)
onLogEvent {
   metadata: {
-    eventId: '3ba42dd3-7328-4270-b476-0d52a0c451b9',
-    rootEventId: '3ba42dd3-7328-4270-b476-0d52a0c451b9'
+    eventId: '698b0f9e-abd8-427b-b30f-7110633ad6cf',
+    rootEventId: '698b0f9e-abd8-427b-b30f-7110633ad6cf'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -1454,12 +2445,12 @@
     ']',
   rawOutput: '["a", "b", "c"]',
   parsedOutput: '["a", "b", "c"]',
-  startTime: '2024-12-04T06:30:21.857Z'
+  startTime: '2024-12-13T14:21:23.051Z'
 }
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:623:15)
     at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:70:17)
onLogEvent {
   metadata: {
-    eventId: '85f3901f-ce3e-4eda-bf67-1e6b1164a424',
-    rootEventId: '85f3901f-ce3e-4eda-bf67-1e6b1164a424'
+    eventId: '31cf7c7e-0dac-429d-ad4c-b8bd2e12b83b',
+    rootEventId: '31cf7c7e-0dac-429d-ad4c-b8bd2e12b83b'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -1473,8 +2464,8 @@
     ']',
   rawOutput: '["d", "e", "f"]',
   parsedOutput: '["d", "e", "f"]',
-  startTime: '2024-12-04T06:30:22.354Z'
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:657:15)
Error: Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "MyClient", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Given a string, extract info using the schema:\n\nMy name is Harrison. My hair is black and I'm 6 feet tall.\n\nAnswer in JSON using this schema:\n{\n}")] }]), request_options: {"model": String("gpt-4o-mini")}, start_time: SystemTime { tv_sec: 1733293824, tv_nsec: 6034000 }, latency: 139.540125ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: INVALID_KEY. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+  startTime: '2024-12-13T14:21:23.475Z'
+}
    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: 1734099685, tv_nsec: 155253000 }, latency: 137.060167ms, 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/versions/engine.cfg b/tools/versions/engine.cfg
index 229df7b0d..b885fafbf 100644
--- a/tools/versions/engine.cfg
+++ b/tools/versions/engine.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.1
+current_version = 0.70.2
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/integ-tests.cfg b/tools/versions/integ-tests.cfg
index bac0af901..48e067ef0 100644
--- a/tools/versions/integ-tests.cfg
+++ b/tools/versions/integ-tests.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.1
+current_version = 0.70.2
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/python.cfg b/tools/versions/python.cfg
index 2da5d49b6..060dbfb24 100644
--- a/tools/versions/python.cfg
+++ b/tools/versions/python.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.1
+current_version = 0.70.2
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/ruby.cfg b/tools/versions/ruby.cfg
index 026c85ce6..236e2ce41 100644
--- a/tools/versions/ruby.cfg
+++ b/tools/versions/ruby.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.1
+current_version = 0.70.2
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/typescript.cfg b/tools/versions/typescript.cfg
index af21949a8..358d57e8a 100644
--- a/tools/versions/typescript.cfg
+++ b/tools/versions/typescript.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.1
+current_version = 0.70.2
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/vscode.cfg b/tools/versions/vscode.cfg
index 083289496..5b6257586 100644
--- a/tools/versions/vscode.cfg
+++ b/tools/versions/vscode.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.1
+current_version = 0.70.2
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/typescript/vscode-ext/packages/package.json b/typescript/vscode-ext/packages/package.json
index 04057c9fa..08cd8c3ec 100644
--- a/typescript/vscode-ext/packages/package.json
+++ b/typescript/vscode-ext/packages/package.json
@@ -2,7 +2,7 @@
   "name": "baml-extension",
   "displayName": "Baml",
   "description": "BAML is a DSL for AI applications.",
-  "version": "0.70.1",
+  "version": "0.70.2",
   "publisher": "Boundary",
   "repository": "https://github.com/BoundaryML/baml",
   "homepage": "https://www.boundaryml.com",

From 52040dcb4bf292c4acd36a0ffb3c5eff63fa1cc5 Mon Sep 17 00:00:00 2001
From: hellovai 
Date: Fri, 13 Dec 2024 06:49:19 -0800
Subject: [PATCH 04/11] chore: Bump version to 0.70.3 (#1240)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Bump version to 0.70.3\n\n❌ Typescript integ tests\n❌ Python integ
tests\n\nGenerated by bump-version script.
---
 CHANGELOG.md                                  |    2 +-
 engine/Cargo.lock                             |   32 +-
 engine/Cargo.toml                             |    2 +-
 engine/language_client_python/pyproject.toml  |    2 +-
 engine/language_client_ruby/baml.gemspec      |    2 +-
 .../language_client_typescript/package.json   |    2 +-
 integ-tests/baml_src/generators.baml          |    8 +-
 integ-tests/python/baml_client/inlinedbaml.py |    2 +-
 integ-tests/python/report.html                |  824 ++++----
 integ-tests/ruby/baml_client/inlined.rb       |    2 +-
 .../typescript/baml_client/inlinedbaml.ts     |    2 +-
 integ-tests/typescript/test-report.html       | 1868 ++++++-----------
 tools/bump-version                            |   22 +-
 tools/versions/engine.cfg                     |    2 +-
 tools/versions/integ-tests.cfg                |    2 +-
 tools/versions/python.cfg                     |    2 +-
 tools/versions/ruby.cfg                       |    2 +-
 tools/versions/typescript.cfg                 |    2 +-
 tools/versions/vscode.cfg                     |    2 +-
 typescript/vscode-ext/packages/package.json   |    2 +-
 20 files changed, 1095 insertions(+), 1689 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index b3c2959e1..56053e6d0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@
 
 All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines.
 
-## [0.70.2](https://github.com/boundaryml/baml/compare/0.70.1..0.70.2) - 2024-12-13
+## [0.70.3](https://github.com/boundaryml/baml/compare/0.70.1..0.70.3) - 2024-12-13
 
 ### Bug Fixes
 
diff --git a/engine/Cargo.lock b/engine/Cargo.lock
index 7594e2ee8..7fb147b24 100644
--- a/engine/Cargo.lock
+++ b/engine/Cargo.lock
@@ -785,7 +785,7 @@ dependencies = [
 
 [[package]]
 name = "baml-cli"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "ambassador",
  "anyhow",
@@ -873,7 +873,7 @@ dependencies = [
 
 [[package]]
 name = "baml-lib"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "base64 0.13.1",
  "dissimilar",
@@ -913,7 +913,7 @@ dependencies = [
 
 [[package]]
 name = "baml-runtime"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "ambassador",
  "anyhow",
@@ -1010,7 +1010,7 @@ dependencies = [
 
 [[package]]
 name = "baml-schema-build"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "anyhow",
  "baml-runtime",
@@ -1048,7 +1048,7 @@ dependencies = [
 
 [[package]]
 name = "baml-types"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "anyhow",
  "clap",
@@ -1177,7 +1177,7 @@ dependencies = [
 
 [[package]]
 name = "bstd"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "anyhow",
  "assert_cmd",
@@ -2571,7 +2571,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-codegen"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "anyhow",
  "askama",
@@ -2596,7 +2596,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-core"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "anyhow",
  "baml-types",
@@ -2633,7 +2633,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-diagnostics"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "anyhow",
  "colored",
@@ -2646,7 +2646,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-jinja"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "anyhow",
  "askama",
@@ -2667,7 +2667,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-jinja-types"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "anyhow",
  "askama",
@@ -2686,7 +2686,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-parser-database"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "anyhow",
  "baml-types",
@@ -2711,7 +2711,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-prompt-parser"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "internal-baml-diagnostics",
  "internal-baml-schema-ast",
@@ -2723,7 +2723,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-schema-ast"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "anyhow",
  "baml-types",
@@ -2742,7 +2742,7 @@ dependencies = [
 
 [[package]]
 name = "internal-llm-client"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "anyhow",
  "baml-types",
@@ -2840,7 +2840,7 @@ checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105"
 
 [[package]]
 name = "jsonish"
-version = "0.70.2"
+version = "0.70.3"
 dependencies = [
  "anyhow",
  "assert-json-diff",
diff --git a/engine/Cargo.toml b/engine/Cargo.toml
index 8dc32a383..0421de70b 100644
--- a/engine/Cargo.toml
+++ b/engine/Cargo.toml
@@ -95,7 +95,7 @@ internal-baml-jinja = { path = "baml-lib/jinja" }
 internal-baml-schema-ast = { path = "baml-lib/schema-ast" }
 
 [workspace.package]
-version = "0.70.2"
+version = "0.70.3"
 authors = ["Boundary "]
 
 description = "BAML Toolchain"
diff --git a/engine/language_client_python/pyproject.toml b/engine/language_client_python/pyproject.toml
index 1656c7004..b345ceb19 100644
--- a/engine/language_client_python/pyproject.toml
+++ b/engine/language_client_python/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "baml-py"
-version = "0.70.2"
+version = "0.70.3"
 description = "BAML python bindings (pyproject.toml)"
 readme = "README.md"
 authors = [["Boundary", "contact@boundaryml.com"]]
diff --git a/engine/language_client_ruby/baml.gemspec b/engine/language_client_ruby/baml.gemspec
index b5ca4262f..9c651416d 100644
--- a/engine/language_client_ruby/baml.gemspec
+++ b/engine/language_client_ruby/baml.gemspec
@@ -2,7 +2,7 @@
 
 Gem::Specification.new do |spec|
   spec.name = "baml"
-  spec.version = "0.70.2"
+  spec.version = "0.70.3"
   spec.authors = ["BoundaryML"]
   spec.email = ["contact@boundaryml.com"]
 
diff --git a/engine/language_client_typescript/package.json b/engine/language_client_typescript/package.json
index 1a5870973..379054efc 100644
--- a/engine/language_client_typescript/package.json
+++ b/engine/language_client_typescript/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@boundaryml/baml",
-  "version": "0.70.2",
+  "version": "0.70.3",
   "description": "BAML typescript bindings (package.json)",
   "repository": {
     "type": "git",
diff --git a/integ-tests/baml_src/generators.baml b/integ-tests/baml_src/generators.baml
index d666fd8a9..656982e23 100644
--- a/integ-tests/baml_src/generators.baml
+++ b/integ-tests/baml_src/generators.baml
@@ -1,24 +1,24 @@
 generator lang_python {
   output_type python/pydantic
   output_dir "../python"
-  version "0.70.2"
+  version "0.70.3"
 }
 
 generator lang_typescript {
   output_type typescript
   output_dir "../typescript"
-  version "0.70.2"
+  version "0.70.3"
 }
 
 generator lang_ruby {
   output_type ruby/sorbet
   output_dir "../ruby"
-  version "0.70.2"
+  version "0.70.3"
 }
 
 // generator openapi {
 //   output_type rest/openapi
 //   output_dir "../openapi"
-//   version "0.70.2"
+//   version "0.70.3"
 //   on_generate "rm .gitignore"
 // }
diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py
index 0e46ddfcb..b5816bd6d 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.2\"\n}\n\ngenerator lang_typescript {\n  output_type typescript\n  output_dir \"../typescript\"\n  version \"0.70.2\"\n}\n\ngenerator lang_ruby {\n  output_type ruby/sorbet\n  output_dir \"../ruby\"\n  version \"0.70.2\"\n}\n\n// generator openapi {\n//   output_type rest/openapi\n//   output_dir \"../openapi\"\n//   version \"0.70.2\"\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.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",
     "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 c1bd0bb53..a4a427278 100644
--- a/integ-tests/python/report.html
+++ b/integ-tests/python/report.html
@@ -3,123 +3,115 @@
     
Test Report

Summary

102
1 failed 101 passed

Tests

tests/test_functions.py 196 0:03:33.568695

PASSED test_env_vars_reset 0:00:01.820627

Setup

Call

Captured stdout call
Context depth is greater than 0!
+    
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!
 Except but ending trace!
 Context depth is greater than 0!
-

Teardown

PASSED test_sync 0:00:00.472794

Setup

Call

Captured stdout call
got response key
+

Teardown

PASSED test_sync 0:00:00.379372

Setup

Call

Captured stdout call
got response key
 true
 52
-

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.618615

Setup

Call

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.714492

Setup

Call

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.299170

Setup

Call

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.632056

Setup

Call

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.716871

Setup

Call

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.684505

Setup

Call

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001355

Setup

Call

Captured stderr call
[2024-12-13T14:21:47Z 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.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_class 0:00:00.522007

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.524706

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.360591

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.443447

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.313055

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.452723

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.380532

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.323265

Setup

Call

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:00.497995

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.643937

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.475970

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.445885

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.419887

Setup

Call

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:01.046794

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.735357

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:00.380765

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:04.608649

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.381997

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:01.422734

Setup

Call

Teardown

PASSED test_should_work_with_vertex 0:00:09.970103

Setup

Call

Teardown

PASSED test_should_work_with_image_base64 0:00:01.379067

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.057976

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.101493

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:02.139693

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: 1734099738, tv_nsec: 399323000 }, latency: 236.591084ms, 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.990924

Setup

Call

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.036548

Setup

Call

Teardown

PASSED test_claude 0:00:01.445531

Setup

Call

Teardown

PASSED test_gemini 0:00:09.097367

Setup

Call

Captured stdout call
LLM output from Gemini: Bartholomew "Bart" Pepper was, by all accounts, a strange man. He spoke in riddles, tinkered with contraptions that defied logic, and smelled perpetually of licorice and burnt sugar.  His small shop, nestled in a forgotten corner of a bustling city, was a testament to his eccentricities.  Bells jingled incessantly from the ceiling, gears spun on walls adorned with cryptic diagrams, and the air crackled with a peculiar energy. 
+

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. 
 
-Bart claimed he was a doctor, not of the body, but of the soul.  His medicine? A concoction he called "Dr. Pepper," a bubbling, fizzing elixir brewed in giant copper kettles that hissed and groaned with ancient secrets. 
+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."
 
-One dreary afternoon, a young woman named Amelia wandered into his shop. Burdened with grief over a recent loss, she felt drawn to its warmth and the strange, comforting aroma.  Bart, with eyes that held the wisdom of a thousand lifetimes,  simply smiled and handed her a steaming mug of his concoction.
+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.
 
-Amelia took a tentative sip. The taste was like nothing she'd ever experienced: a kaleidoscope of flavors, sweet and tangy, with a hint of something indescribable.  As she drank, a warmth spread through her, melting away the chill in her heart.  She looked up, eyes wide with wonder.
+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. 
 
-"What is this magic?" she breathed.
+"Wow," she breathed, a smile blooming on her face.  "What is this magical elixir?"
 
-Bart chuckled, his eyes twinkling. "It's not magic, my dear. It's the taste of possibility, of joy, of a thousand tiny sparks of hope, all bottled up for a rainy day."
+Dr. Pete chuckled. "Why, it's a Dream Reviver, of course. One sip, and you'll remember what you're fighting for."
 
-And as Amelia finished her mug, she realized he was right. The world outside might have remained gray, but within her, something had shifted.  A flicker of hope, ignited by the doctor's strange brew, had begun to burn. She left the shop that day, lighter in spirit, carrying with her the sweet, fizzy taste of possibility. 
+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. 
 
-Bart, watching her go, smiled. He knew his concoction couldn't erase her pain, but perhaps, it could help her remember the sweetness life still held. And that, he believed, was a kind of medicine all its own. 
+

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

Teardown

PASSED test_gemini_streaming 0:00:08.035179

Setup

Call

Captured stdout call
LLM output from Gemini: The old diner was quiet, the only sound the gentle whir of the ceiling fan struggling against the Texas heat. Behind the counter, Mabel hummed along to a song only she could hear, polishing a glass until it gleamed. 
+"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. 
 
-Suddenly, the bell above the door chimed, announcing a customer. A young woman, her face hidden by a worn cowboy hat, slumped into a booth by the window. Mabel recognized the look of someone who'd lost their way, a look she'd seen a thousand times reflected in the chrome of the napkin dispenser.
+The woman, Sarah, smiled wearily. "You know me too well, Millie." 
 
-"Howdy," Mabel greeted, setting down the glass. "What can I get you, hon?"
+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.  
 
-The woman sighed, pushing the hat back to reveal tired eyes. "Just coffee, black as my boots."
+"Another all-nighter?" Millie asked, already refilling Sarah's coffee.
 
-Mabel raised an eyebrow. "Now, I don't know about all that. How about a Dr. Pepper instead? It's got just the right amount of pep to chase away any blues."
+Sarah nodded. "I'm so close to finishing, Millie, but I feel like I’m hitting a wall."
 
-The woman hesitated, then a small smile flickered across her lips. "Alright, a Dr. Pepper it is."
+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." 
 
-Mabel returned a moment later with a frosty glass, condensation clinging to its sides like tiny diamonds. The woman took a long sip, her eyes widening in surprise. 
+Sarah chuckled. "That's oddly specific, Millie, but I get your point."
 
-"This is... delicious." She took another gulp. "It tastes like...like hope mixed with a little bit of mischief."
+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. 
 
-Mabel chuckled. "That's Dr. Pepper for ya. Ain't no problem it can't fix, at least for a little while."
+As if reading her mind, Millie placed a paper bag on the counter. "Here," she said, "a little something for your walk."
 
-And as the woman finished her Dr. Pepper, sharing stories with Mabel and the few other patrons who wandered in, the diner didn't feel quite so quiet anymore. The air was filled with the clinking of glasses, the murmur of conversation, and the sweet, spicy scent of Dr. Pepper, a reminder that even on the loneliest of roads, a little bit of comfort could always be found. 
+Inside, Sarah found a freshly baked muffin and, to her surprise, another Dr. Pepper. 
 
-

Teardown

PASSED test_aws 0:00:01.829658

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:10.503789

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:10.879226

Setup

Call

Teardown

PASSED test_anthropic_shorthand 0:00:03.933997

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.735164

Setup

Call

Teardown

PASSED test_fallback_to_shorthand 0:00:00.860333

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:01.449588

Setup

Call

Teardown

PASSED test_streaming 0:00:02.517329

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:03.343076

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:03.880195

Setup

Call

Teardown

PASSED test_streaming_uniterated_sync 0:00:05.060981

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:01.059323

Setup

Call

Captured stdout call
msgs:
+"Millie, you're an angel," Sarah said, her heart full. 
+
+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 stands proud, high
+Rainier towers high
 Fourteen thousand feet of snow
-Pierce the summer sky
+Guardian of sound
 final:
 Here's a haiku about Mt. Rainier's height:
 
-Rainier stands proud, high
+Rainier towers high
 Fourteen thousand feet of snow
-Pierce the summer sky
-

Teardown

PASSED test_streaming_gemini 0:00:09.398223

Setup

Call

Captured stdout call
msgs:
-Barnaby Butterfield, a man of discerning taste and handlebar mustache to match, slammed his newspaper on the table, rattling his wife Agnes' teacup. "Preposterous!" he boomed.
-
-Agnes, a woman unfazed by decades of Barnaby's pronouncements, merely raised an eyebrow. "What is it now, dear?"
-
-"This newfangled soda fountain," Barnaby sputtered, jabbing the newspaper with his index finger. "Claims to have 23 flavors! Twenty-three! Utter poppycock, I say. Why, a man can barely discern five flavors in a lifetime, let alone twenty-three!"
+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.
 
-Agnes sighed. Barnaby's disdain for anything new was as predictable as the sunrise. 
+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. 
 
-Later that day, curiosity gnawing at him like a persistent squirrel, Barnaby found himself standing before the offending soda fountain. A young man with slicked-back hair and a charming smile greeted him.
+"Afternoon, Millie," he drawled, his voice smooth as melted caramel. "The usual, please."
 
-"Welcome, sir! Care to try a Dr. Pepper? It's got 23 distinct flavors, guaranteed to tantalize your taste buds!"
+Millie grinned, already filling a tall glass with ice. "Coming right up, Dr. Pepper."
 
-Barnaby scoffed. "Twenty-three flavors, you say? Humbug!" But intrigued nonetheless, he relented.
+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. 
 
-The young man filled a glass with a bubbly, caramel-colored concoction. Barnaby took a tentative sip. His eyes widened. He took another, larger gulp. And another.
+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. 
 
-A slow smile spread across his face, his mustache twitching. He tasted licorice, cherry, even a hint of... was that amaretto? The flavors danced on his tongue, a delightful mystery he couldn't quite decipher.
+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 finished the glass in stunned silence. 
+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.
 
-"Well, sir?" the young man asked, a twinkle in his eye. 
+"Until next time," he said, his voice barely a whisper. 
 
-Barnaby cleared his throat, his previous indignation forgotten. "Young man," he declared, adjusting his hat, "I may have been wrong about the number of flavors in a lifetime. But by Jove, this Dr. Pepper just might prove me wrong about everything else." 
-
-From that day forward, Barnaby Butterfield became Dr. Pepper's most enthusiastic convert, his handlebar mustache perpetually adorned with a telltale fizz. He never did figure out all 23 flavors, but the joy, he discovered, was in the delicious mystery of it all. 
+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. 
 
 final:
-Barnaby Butterfield, a man of discerning taste and handlebar mustache to match, slammed his newspaper on the table, rattling his wife Agnes' teacup. "Preposterous!" he boomed.
-
-Agnes, a woman unfazed by decades of Barnaby's pronouncements, merely raised an eyebrow. "What is it now, dear?"
-
-"This newfangled soda fountain," Barnaby sputtered, jabbing the newspaper with his index finger. "Claims to have 23 flavors! Twenty-three! Utter poppycock, I say. Why, a man can barely discern five flavors in a lifetime, let alone twenty-three!"
-
-Agnes sighed. Barnaby's disdain for anything new was as predictable as the sunrise. 
+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.
 
-Later that day, curiosity gnawing at him like a persistent squirrel, Barnaby found himself standing before the offending soda fountain. A young man with slicked-back hair and a charming smile greeted him.
+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. 
 
-"Welcome, sir! Care to try a Dr. Pepper? It's got 23 distinct flavors, guaranteed to tantalize your taste buds!"
+"Afternoon, Millie," he drawled, his voice smooth as melted caramel. "The usual, please."
 
-Barnaby scoffed. "Twenty-three flavors, you say? Humbug!" But intrigued nonetheless, he relented.
+Millie grinned, already filling a tall glass with ice. "Coming right up, Dr. Pepper."
 
-The young man filled a glass with a bubbly, caramel-colored concoction. Barnaby took a tentative sip. His eyes widened. He took another, larger gulp. And another.
+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. 
 
-A slow smile spread across his face, his mustache twitching. He tasted licorice, cherry, even a hint of... was that amaretto? The flavors danced on his tongue, a delightful mystery he couldn't quite decipher.
+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 finished the glass in stunned silence. 
+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. 
 
-"Well, sir?" the young man asked, a twinkle in his eye. 
+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.
 
-Barnaby cleared his throat, his previous indignation forgotten. "Young man," he declared, adjusting his hat, "I may have been wrong about the number of flavors in a lifetime. But by Jove, this Dr. Pepper just might prove me wrong about everything else." 
+"Until next time," he said, his voice barely a whisper. 
 
-From that day forward, Barnaby Butterfield became Dr. Pepper's most enthusiastic convert, his handlebar mustache perpetually adorned with a telltale fizz. He never did figure out all 23 flavors, but the joy, he discovered, was in the delicious mystery of it all. 
+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:04.823691

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

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.394251

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.024693

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.441707

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.484387

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.525739

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

Setup

Call

Captured stdout call
[]
+

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
[]
 {"hair_color":"black"}
-

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.772107

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

Setup

Call

Captured stdout call
streamed  name=None hair_color=None
+

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
 streamed  {'name': None, 'hair_color': None}
 streamed  name=None hair_color=None
 streamed  {'name': None, 'hair_color': None}
@@ -196,7 +188,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:00.646184

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_stream_dynamic_class_output 0:00:01.674849

Setup

Call

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

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.215553

Setup

Call

Teardown

PASSED test_dynamic_types_new_enum 0:00:01.613053

Setup

Call

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.541909

Setup

Call

Teardown

PASSED test_dynamic_literals 0:00:00.734552

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:00.901091

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:00.657098

Setup

Call

Captured stdout call
[]
+

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
[]
 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:01.769073

Setup

Call

Captured stdout call
[]
+

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

Setup

Call

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

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}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
@@ -276,244 +271,185 @@
 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': 'ag', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
-final  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.760949

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:01.095419

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:00.824506

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.131149

Setup

Call

Captured stdout call
Event log hook1: 
+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: 
 Event log event  BamlLogEvent {
     metadata: {
-        event_id: "78dc8c9b-f55c-437d-a06c-18928848d89e",
+        event_id: "c13e21d5-f374-4c98-8013-b003aedb8fa3",
         parent_id: None,
-        root_event_id: "78dc8c9b-f55c-437d-a06c-18928848d89e"
+        root_event_id: "c13e21d5-f374-4c98-8013-b003aedb8fa3"
     },
     prompt: "[
   {
@@ -527,13 +463,13 @@
 ]",
     raw_output: "["a", "b", "c"]",
     parsed_output: "["a", "b", "c"]",
-    start_time: "2024-12-13T14:24:20.930Z"
+    start_time: "2024-12-13T14:46:34.169Z"
 }
-

Teardown

PASSED test_aws_bedrock 0:00:03.121428

Setup

Call

Captured stdout call
unstreamed 
+

Teardown

PASSED test_aws_bedrock 0:00:03.126423

Setup

Call

Captured stdout call
unstreamed 
 
-The old geologist, Dr. Maria, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the twisted granite, the layered sandstone, the glittering quartz. But nothing could have prepared her for what she was about to discover.
+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.
 
-As she made her way through the dense forest, her eyes scanning the ground for the perfect specimen, she stumbled upon a peculiar rock. It was unlike any she had ever seen before - a deep, rich blue
+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.
 streamed  '\n\n'
 streamed  '\n\nIn'
 streamed  '\n\nIn the'
@@ -546,105 +482,105 @@
 streamed  '\n\nIn the heart of the ancient forest, there'
 streamed  '\n\nIn the heart of the ancient forest, there was'
 streamed  '\n\nIn the heart of the ancient forest, there was a'
-streamed  '\n\nIn the heart of the ancient forest, there was a peculiar'
-streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock'
-streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation'
-streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that'
-streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that had'
-streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that had been'
-streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that had been passed'
-streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that had been passed down'
-streamed  'e heart of the ancient forest, there was a peculiar rock formation that had been passed down through'
-streamed  'he ancient forest, there was a peculiar rock formation that had been passed down through generations'
-streamed  'ancient forest, there was a peculiar rock formation that had been passed down through generations of'
-streamed  't forest, there was a peculiar rock formation that had been passed down through generations of local'
-streamed  't, there was a peculiar rock formation that had been passed down through generations of local legend'
-streamed  ', there was a peculiar rock formation that had been passed down through generations of local legend.'
-streamed  'here was a peculiar rock formation that had been passed down through generations of local legend. It'
-streamed  ' was a peculiar rock formation that had been passed down through generations of local legend. It was'
-streamed  'a peculiar rock formation that had been passed down through generations of local legend. It was said'
-streamed  'uliar rock formation that had been passed down through generations of local legend. It was said that'
-streamed  'iar rock formation that had been passed down through generations of local legend. It was said that a'
-streamed  'ock formation that had been passed down through generations of local legend. It was said that a bolt'
-streamed  ' formation that had been passed down through generations of local legend. It was said that a bolt of'
-streamed  ' that had been passed down through generations of local legend. It was said that a bolt of lightning'
-streamed  't had been passed down through generations of local legend. It was said that a bolt of lightning had'
-streamed  'een passed down through generations of local legend. It was said that a bolt of lightning had struck'
-streamed  'passed down through generations of local legend. It was said that a bolt of lightning had struck the'
-streamed  'd down through generations of local legend. It was said that a bolt of lightning had struck the rock'
-streamed  'ough generations of local legend. It was said that a bolt of lightning had struck the rock centuries'
-streamed  ' generations of local legend. It was said that a bolt of lightning had struck the rock centuries ago'
-streamed  'generations of local legend. It was said that a bolt of lightning had struck the rock centuries ago,'
-streamed  'rations of local legend. It was said that a bolt of lightning had struck the rock centuries ago, imb'
-streamed  'ons of local legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing'
-streamed  ' of local legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it'
-streamed  'ocal legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it with'
-streamed  'al legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a'
-streamed  'd. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange'
-streamed  't was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and'
-streamed  'was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and w'
-streamed  'd that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous'
-streamed  ' a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power'
-streamed  'bolt of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\n'
-streamed  't of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe'
-streamed  'lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock'
-streamed  'ightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock,'
-streamed  'ng had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known'
-streamed  'had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as'
-streamed  'd struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "'
-streamed  'truck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The'
-streamed  'the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heart'
-streamed  'ock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone'
-streamed  'k centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone,"'
-streamed  'nturies ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was'
-streamed  'uries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a'
-streamed  ' ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep'
-streamed  'ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep,'
-streamed  'imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich'
-streamed  'g it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown'
-streamed  'ith a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color'
-streamed  'th a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color,'
-streamed  'strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with'
-streamed  'e and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins'
-streamed  'nd wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins of'
-streamed  'ous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins of glitter'
-streamed  ' power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins of glittering'
-streamed  '\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz'
-streamed  ' rock, known as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz that'
-streamed  'known as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed'
-streamed  'wn as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed to'
-streamed  '"The Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse'
-streamed  'Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse with'
-streamed  'rtstone," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an'
-streamed  'e," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner'
-streamed  's a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner light'
-streamed  ' a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner light.'
-streamed  'deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner light. It'
-streamed  'rich brown color, with veins of glittering quartz that seemed to pulse with an inner light. It stood'
-streamed  'brown color, with veins of glittering quartz that seemed to pulse with an inner light. It stood tall'
-streamed  'n color, with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and'
-streamed  'r, with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and proud'
-streamed  ', with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and proud,'
-streamed  'with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and proud, a'
-streamed  's of glittering quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel'
-streamed  'f glittering quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of'
-streamed  'ittering quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the'
-streamed  'g quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest'
-streamed  'tz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor'
-streamed  'z that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor,'
-streamed  'at seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and'
-streamed  'eemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was'
-streamed  'eemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was'
-streamed  'eemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was'
-streamed  'eemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was'
+streamed  '\n\nIn the heart of the ancient forest, there was a rock'
+streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike'
+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 final 
 
-In the heart of the ancient forest, there was a peculiar rock formation that had been passed down through generations of local legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.
+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.
 
-The rock, known as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was
-

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.005544

Setup

Call

Teardown

PASSED test_serialization_exception 0:00:01.364374

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".
+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".
 ) tblen=2>
-

Teardown

PASSED test_stream_serialization_exception 0:00:00.500441

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None
+

Teardown

PASSED test_stream_serialization_exception 0:00:00.634719

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
@@ -659,7 +595,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.413288

Setup

Call

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

Teardown

PASSED test_stream2_serialization_exception 0:00:00.383816

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

Teardown

PASSED test_descriptions 0:00:06.557638

Setup

Call

Teardown

FAILED test_caching 0:00:07.004457

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

Setup

Call

@pytest.mark.asyncio
+

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.
@@ -711,22 +647,72 @@
 >       assert (
             duration2 < duration
         ), f"{duration2} < {duration}. Expected second call to be faster than first by a large margin."
-E       AssertionError: 3.624055862426758 < 3.379484176635742. Expected second call to be faster than first by a large margin.
-E       assert 3.624055862426758 < 3.379484176635742
+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:  3.379484176635742
-Duration with caching:  3.624055862426758
-

Teardown

PASSED test_arg_exceptions 0:00:01.166600

Setup

Call

Captured stderr call
[2024-12-13T14:24:40Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
+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.001121

Setup

Call

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

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

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

Setup

Call

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.461699

Setup

Call

Teardown

PASSED test_no_stream_compound_object 0:00:04.063495

Setup

Call

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:16.651412

Setup

Call

Teardown

PASSED test_differing_unions 0:00:00.809205

Setup

Call

Teardown

PASSED test_return_failing_assert 0:00:00.351492

Setup

Call

Teardown

PASSED test_parameter_failing_assert 0:00:00.001113

Setup

Call

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

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_failing_assert_can_stream 0:00:03.925711

Setup

Call

Captured stdout call
None
+

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
@@ -1352,9 +1338,9 @@
 None
 None
 None
-

Teardown

PASSED test_simple_recursive_type 0:00:02.897785

Setup

Call

Teardown

PASSED test_mutually_recursive_type 0:00:02.089253

Setup

Call

Teardown

PASSED test_block_constraints 0:00:00.576212

Setup

Call

Teardown

PASSED test_nested_block_constraints 0:00:00.518378

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

Setup

Call

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

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
     
-[2024-12-13T14:25:15Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+[2024-12-13T14:47:15Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-

Teardown

tests/test_pydantic.py 3 0:00:00.001558

PASSED test_model_validate_success 0:00:00.000497

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000529

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000532

Setup

Call

Teardown

tests/test_python.py 2 0:00:00.005403

PASSED test_inspect 0:00:00.005053

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

Setup

Call

Teardown

\ No newline at end of file +

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 diff --git a/integ-tests/ruby/baml_client/inlined.rb b/integ-tests/ruby/baml_client/inlined.rb index 993eeb0c1..10f842787 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.2\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.2\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.2\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.2\"\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.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", "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 2139e8c6f..0f65cd4fc 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.2\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.2\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.2\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.2\"\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.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", "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 d1d5fad24..37290fbbd 100644 --- a/integ-tests/typescript/test-report.html +++ b/integ-tests/typescript/test-report.html @@ -257,24 +257,24 @@ font-size: 1rem; padding: 0 0.5rem; } -

Test Report

Started: 2024-12-13 06:19:24
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.519s
Integ tests > should work for all inputs
single string list
passed
0.413s
Integ tests > should work for all inputs
return literal union
passed
0.491s
Integ tests > should work for all inputs
single class
passed
0.667s
Integ tests > should work for all inputs
multiple classes
passed
0.525s
Integ tests > should work for all inputs
single enum list
passed
0.325s
Integ tests > should work for all inputs
single float
passed
0.364s
Integ tests > should work for all inputs
single int
passed
0.358s
Integ tests > should work for all inputs
single literal int
passed
0.318s
Integ tests > should work for all inputs
single literal bool
passed
0.42s
Integ tests > should work for all inputs
single literal string
passed
0.36s
Integ tests > should work for all inputs
single class with literal prop
passed
0.76s
Integ tests > should work for all inputs
single class with literal union prop
passed
0.592s
Integ tests > should work for all inputs
single optional string
passed
0.273s
Integ tests > should work for all inputs
single map string to string
passed
0.466s
Integ tests > should work for all inputs
single map string to class
passed
0.653s
Integ tests > should work for all inputs
single map string to map
passed
0.542s
Integ tests > should work for all inputs
enum key in map
passed
3.123s
Integ tests > should work for all inputs
literal string union key in map
passed
0.882s
Integ tests > should work for all inputs
single literal string key in map
passed
0.431s
Integ tests
should work for all outputs
passed
5.12s
Integ tests
works with retries1
passed
1.027s
Integ tests
works with retries2
passed
2.329s
Integ tests
works with fallbacks
passed
1.671s
Integ tests
should work with image from url
passed
1.523s
Integ tests
should work with image from base 64
passed
1.843s
Integ tests
should work with audio base 64
passed
1.37s
Integ tests
should work with audio from url
passed
1.114s
Integ tests
should support streaming in OpenAI
passed
2.027s
Integ tests
should support streaming in Gemini
passed
9.788s
Integ tests
should support AWS
passed
1.777s
Integ tests
should support streaming in AWS
passed
1.416s
Integ tests
should allow overriding the region
passed
0.046s
Integ tests
should support OpenAI shorthand
passed
17.821s
Integ tests
should support OpenAI shorthand streaming
passed
9.413s
Integ tests
should support anthropic shorthand
passed
3.275s
Integ tests
should support anthropic shorthand streaming
passed
3.013s
Integ tests
should support streaming without iterating
passed
3.361s
Integ tests
should support streaming in Claude
passed
1.412s
Integ tests
should support vertex
passed
10.957s
Integ tests
supports tracing sync
passed
0.009s
Integ tests
supports tracing async
passed
3.22s
Integ tests
should work with dynamic types single
passed
0.985s
Integ tests
should work with dynamic types enum
passed
1.212s
Integ tests
should work with dynamic literals
passed
1.211s
Integ tests
should work with dynamic types class
passed
1.75s
Integ tests
should work with dynamic inputs class
passed
0.524s
Integ tests
should work with dynamic inputs list
passed
0.597s
Integ tests
should work with dynamic output map
passed
1.157s
Integ tests
should work with dynamic output union
passed
1.951s
Integ tests
should work with nested classes
failed
12.333s
Error: expect(received).toEqual(expected) // deep equality
+

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": "Hello",
+    "prop1": "value1",
     "prop2": Object {
       "inner": Object {
         "prop2": 42,
--       "prop3": 3.14159,
+-       "prop3": 3.14,
 +       "prop3": null,
       },
-      "prop1": "World",
-      "prop2": "JSON is coolest thing ever",
+      "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.404s
Integ tests
should work with 'onLogEvent'
passed
1.754s
Integ tests
should work with a sync client
passed
0.546s
Integ tests
should raise an error when appropriate
passed
1.02s
Integ tests
should raise a BAMLValidationError
passed
0.447s
Integ tests
should reset environment variables correctly
passed
1.274s
Integ tests
should use aliases when serializing input objects - classes
passed
1.22s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.752s
Integ tests
should use aliases when serializing input objects - enums
passed
0.511s
Integ tests
should use aliases when serializing input objects - lists
passed
0.461s
Integ tests
constraints: should handle checks in return types
passed
0.894s
Integ tests
constraints: should handle checks in returned unions
passed
0.713s
Integ tests
constraints: should handle block-level checks
passed
0.569s
Integ tests
constraints: should handle nested-block-level checks
passed
0.652s
Integ tests
simple recursive type
passed
2.685s
Integ tests
mutually recursive type
passed
1.828s
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:48:15)
+    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)
     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 +289,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: 1734099582, tv_nsec: 912302000 }, latency: 167.358ms, 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: 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 }
     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: 1734099585, tv_nsec: 226179000 }, latency: 206.093041ms, 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: 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 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'
@@ -630,7 +630,7 @@
     at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
     at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
Property: attributes
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:540:13)
final  {
   hair_color: 'black',
-  attributes: { eye_color: 'blue', facial_hair: 'beard' }
+  attributes: { height: '6 feet', eye_color: 'blue', facial_hair: 'beard' }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:564:13)
     at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
     at new Promise (<anonymous>)
@@ -691,1747 +691,1153 @@
     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' },
+  attributes: { eye_color: 'blue', facial_hair: 'beard', age: '30 years old' },
   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' },
+  attributes: { eye_color: 'blue', facial_hair: 'beard', age: '30' },
   height: { meters: 1.8 }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts: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: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: '', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: '', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: { prop1: 'World', prop2: 'JSON', inner: 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 {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: { prop1: 'World', prop2: 'JSON is', inner: null }
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: { prop1: 'World', prop2: 'JSON is cool', inner: null }
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: { prop1: 'World', prop2: 'JSON is coolest', inner: null }
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: { prop1: 'World', prop2: 'JSON is coolest thing', inner: null }
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: 'value2', prop2: '', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    prop1: 'value2',
+    prop2: 'value3',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    prop1: 'value2',
+    prop2: 'value3',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    prop1: 'value2',
+    prop2: 'value3',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    prop1: 'value2',
+    prop2: 'value3',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    prop1: 'value2',
+    prop2: 'value3',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    prop1: 'value2',
+    prop2: 'value3',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    prop1: 'value2',
+    prop2: 'value3',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    prop1: 'value2',
+    prop2: 'value3',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    prop1: 'value2',
+    prop2: 'value3',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    prop1: 'value2',
+    prop2: 'value3',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    prop1: 'value2',
+    prop2: 'value3',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: null }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: null }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: null }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: null }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: null }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: null }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: null }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: null }
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
-  prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
-    inner: { prop2: 42, prop3: 3.14159 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop1: 'value1',
   prop2: {
-    prop1: 'World',
-    prop2: 'JSON is coolest thing ever',
+    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: '698b0f9e-abd8-427b-b30f-7110633ad6cf',
-    rootEventId: '698b0f9e-abd8-427b-b30f-7110633ad6cf'
+    eventId: '46a8e073-221d-4872-bb1d-701758db7488',
+    rootEventId: '46a8e073-221d-4872-bb1d-701758db7488'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -2445,12 +1851,12 @@
     ']',
   rawOutput: '["a", "b", "c"]',
   parsedOutput: '["a", "b", "c"]',
-  startTime: '2024-12-13T14:21:23.051Z'
+  startTime: '2024-12-13T14:43:35.485Z'
 }
    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: '31cf7c7e-0dac-429d-ad4c-b8bd2e12b83b',
-    rootEventId: '31cf7c7e-0dac-429d-ad4c-b8bd2e12b83b'
+    eventId: '062efcda-762b-4f4d-9a2e-d9c79abf2cae',
+    rootEventId: '062efcda-762b-4f4d-9a2e-d9c79abf2cae'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -2464,8 +1870,8 @@
     ']',
   rawOutput: '["d", "e", "f"]',
   parsedOutput: '["d", "e", "f"]',
-  startTime: '2024-12-13T14:21:23.475Z'
-}
    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: 1734099685, tv_nsec: 155253000 }, latency: 137.060167ms, 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-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 }
     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 6c91fbf39..db8996cda 100755
--- a/tools/bump-version
+++ b/tools/bump-version
@@ -22,6 +22,7 @@ Options:
     --ruby         Bump patch for ruby
     --vscode       Bump patch for vscode
     --all          Bump all versions [default]
+    --allow-dirty  Allow dirty git status
 EOF
 }
 
@@ -49,6 +50,7 @@ _python_mode=0
 _ruby_mode=0
 _vscode_mode=0
 _all_mode=0
+_allow_dirty_mode=0
 
 while [ $# -gt 0 ]; do
     case "$1" in
@@ -76,6 +78,10 @@ while [ $# -gt 0 ]; do
             _all_mode=1
             shift
             ;;
+        --allow-dirty)
+            _allow_dirty_mode=1
+            shift
+            ;;
         --) # End of all options
             shift
             break
@@ -112,14 +118,18 @@ git pull --tags
 echo "Checking git diff..."
 # # Ensure clean git status
 if ! git diff --quiet; then
-    echo "Error: Git status is not clean. Please commit or stash your changes."
-    exit 1
+    if [ "$_allow_dirty_mode" -eq 1 ]; then
+        echo "Warning: Git status is not clean. Proceeding due to --allow-dirty flag."
+    else
+        echo "Error: Git status is not clean. Please commit or stash your changes."
+        exit 1
+    fi
 fi
 
 PRE_BUMP_VERSION=$(grep "current_version =" tools/versions/engine.cfg | awk '{print $3}')
 
 echo "Checking for changes from version $PRE_BUMP_VERSION in 'engine/language_client_codegen/src'..."
-GIT_DIFF_OUTPUT=$(git diff ${PRE_BUMP_VERSION} -- 'engine/language_client_codegen/src')
+GIT_DIFF_OUTPUT=$(git diff ${PRE_BUMP_VERSION} -- 'engine/language_client_codegen/src' || true)
 
 if [ -z "$GIT_DIFF_OUTPUT" ]; then
     echo "No changes detected."
@@ -156,7 +166,11 @@ fi
 
 cd "${_repo_root}/tools"
 if [ "$_all_mode" -eq 1 ]; then
-  bump2version --config-file ./versions/engine.cfg $version_bump
+  if [ "$_allow_dirty_mode" -eq 1 ]; then
+    bump2version --config-file ./versions/engine.cfg $version_bump --allow-dirty
+  else
+    bump2version --config-file ./versions/engine.cfg $version_bump
+  fi
   bump2version --config-file ./versions/python.cfg $version_bump --allow-dirty
   bump2version --config-file ./versions/typescript.cfg $version_bump --allow-dirty
   bump2version --config-file ./versions/ruby.cfg $version_bump --allow-dirty
diff --git a/tools/versions/engine.cfg b/tools/versions/engine.cfg
index b885fafbf..838ad4149 100644
--- a/tools/versions/engine.cfg
+++ b/tools/versions/engine.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.2
+current_version = 0.70.3
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/integ-tests.cfg b/tools/versions/integ-tests.cfg
index 48e067ef0..a8ca71672 100644
--- a/tools/versions/integ-tests.cfg
+++ b/tools/versions/integ-tests.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.2
+current_version = 0.70.3
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/python.cfg b/tools/versions/python.cfg
index 060dbfb24..1ad210a55 100644
--- a/tools/versions/python.cfg
+++ b/tools/versions/python.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.2
+current_version = 0.70.3
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/ruby.cfg b/tools/versions/ruby.cfg
index 236e2ce41..13305dc99 100644
--- a/tools/versions/ruby.cfg
+++ b/tools/versions/ruby.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.2
+current_version = 0.70.3
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/typescript.cfg b/tools/versions/typescript.cfg
index 358d57e8a..d148c9bf0 100644
--- a/tools/versions/typescript.cfg
+++ b/tools/versions/typescript.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.2
+current_version = 0.70.3
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/vscode.cfg b/tools/versions/vscode.cfg
index 5b6257586..268252cec 100644
--- a/tools/versions/vscode.cfg
+++ b/tools/versions/vscode.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.2
+current_version = 0.70.3
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/typescript/vscode-ext/packages/package.json b/typescript/vscode-ext/packages/package.json
index 08cd8c3ec..6028b6729 100644
--- a/typescript/vscode-ext/packages/package.json
+++ b/typescript/vscode-ext/packages/package.json
@@ -2,7 +2,7 @@
   "name": "baml-extension",
   "displayName": "Baml",
   "description": "BAML is a DSL for AI applications.",
-  "version": "0.70.2",
+  "version": "0.70.3",
   "publisher": "Boundary",
   "repository": "https://github.com/BoundaryML/baml",
   "homepage": "https://www.boundaryml.com",

From d5209e70a89076efb746cfaf0b6e988e34658a5f Mon Sep 17 00:00:00 2001
From: hellovai 
Date: Fri, 13 Dec 2024 07:13:29 -0800
Subject: [PATCH 05/11] chore: Bump version to 0.70.4 (#1241)

- **Bump version to 0.70.4**
- **chore: Bump version to 0.70.4**
---
 CHANGELOG.md                                  |   2 +-
 engine/Cargo.lock                             |  32 +-
 engine/Cargo.toml                             |   2 +-
 engine/language_client_python/pyproject.toml  |   2 +-
 engine/language_client_ruby/baml.gemspec      |   2 +-
 .../language_client_typescript/package.json   |   2 +-
 integ-tests/baml_src/generators.baml          |   8 +-
 integ-tests/python/baml_client/inlinedbaml.py |   2 +-
 integ-tests/python/report.html                | 872 ++++++++----------
 integ-tests/ruby/baml_client/inlined.rb       |   2 +-
 .../typescript/baml_client/inlinedbaml.ts     |   2 +-
 integ-tests/typescript/test-report.html       | 832 +----------------
 tools/bump-version                            |  14 +-
 tools/versions/engine.cfg                     |   2 +-
 tools/versions/integ-tests.cfg                |   2 +-
 tools/versions/python.cfg                     |   2 +-
 tools/versions/ruby.cfg                       |   2 +-
 tools/versions/typescript.cfg                 |   2 +-
 tools/versions/vscode.cfg                     |   2 +-
 typescript/vscode-ext/packages/package.json   |   2 +-
 20 files changed, 451 insertions(+), 1337 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 56053e6d0..f64d1d1f3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@
 
 All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines.
 
-## [0.70.3](https://github.com/boundaryml/baml/compare/0.70.1..0.70.3) - 2024-12-13
+## [0.70.4](https://github.com/boundaryml/baml/compare/0.70.1..0.70.4) - 2024-12-13
 
 ### Bug Fixes
 
diff --git a/engine/Cargo.lock b/engine/Cargo.lock
index 7fb147b24..47e3a822a 100644
--- a/engine/Cargo.lock
+++ b/engine/Cargo.lock
@@ -785,7 +785,7 @@ dependencies = [
 
 [[package]]
 name = "baml-cli"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "ambassador",
  "anyhow",
@@ -873,7 +873,7 @@ dependencies = [
 
 [[package]]
 name = "baml-lib"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "base64 0.13.1",
  "dissimilar",
@@ -913,7 +913,7 @@ dependencies = [
 
 [[package]]
 name = "baml-runtime"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "ambassador",
  "anyhow",
@@ -1010,7 +1010,7 @@ dependencies = [
 
 [[package]]
 name = "baml-schema-build"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "anyhow",
  "baml-runtime",
@@ -1048,7 +1048,7 @@ dependencies = [
 
 [[package]]
 name = "baml-types"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "anyhow",
  "clap",
@@ -1177,7 +1177,7 @@ dependencies = [
 
 [[package]]
 name = "bstd"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "anyhow",
  "assert_cmd",
@@ -2571,7 +2571,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-codegen"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "anyhow",
  "askama",
@@ -2596,7 +2596,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-core"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "anyhow",
  "baml-types",
@@ -2633,7 +2633,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-diagnostics"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "anyhow",
  "colored",
@@ -2646,7 +2646,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-jinja"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "anyhow",
  "askama",
@@ -2667,7 +2667,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-jinja-types"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "anyhow",
  "askama",
@@ -2686,7 +2686,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-parser-database"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "anyhow",
  "baml-types",
@@ -2711,7 +2711,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-prompt-parser"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "internal-baml-diagnostics",
  "internal-baml-schema-ast",
@@ -2723,7 +2723,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-schema-ast"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "anyhow",
  "baml-types",
@@ -2742,7 +2742,7 @@ dependencies = [
 
 [[package]]
 name = "internal-llm-client"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "anyhow",
  "baml-types",
@@ -2840,7 +2840,7 @@ checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105"
 
 [[package]]
 name = "jsonish"
-version = "0.70.3"
+version = "0.70.4"
 dependencies = [
  "anyhow",
  "assert-json-diff",
diff --git a/engine/Cargo.toml b/engine/Cargo.toml
index 0421de70b..794483be4 100644
--- a/engine/Cargo.toml
+++ b/engine/Cargo.toml
@@ -95,7 +95,7 @@ internal-baml-jinja = { path = "baml-lib/jinja" }
 internal-baml-schema-ast = { path = "baml-lib/schema-ast" }
 
 [workspace.package]
-version = "0.70.3"
+version = "0.70.4"
 authors = ["Boundary "]
 
 description = "BAML Toolchain"
diff --git a/engine/language_client_python/pyproject.toml b/engine/language_client_python/pyproject.toml
index b345ceb19..701dad675 100644
--- a/engine/language_client_python/pyproject.toml
+++ b/engine/language_client_python/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "baml-py"
-version = "0.70.3"
+version = "0.70.4"
 description = "BAML python bindings (pyproject.toml)"
 readme = "README.md"
 authors = [["Boundary", "contact@boundaryml.com"]]
diff --git a/engine/language_client_ruby/baml.gemspec b/engine/language_client_ruby/baml.gemspec
index 9c651416d..614847ac9 100644
--- a/engine/language_client_ruby/baml.gemspec
+++ b/engine/language_client_ruby/baml.gemspec
@@ -2,7 +2,7 @@
 
 Gem::Specification.new do |spec|
   spec.name = "baml"
-  spec.version = "0.70.3"
+  spec.version = "0.70.4"
   spec.authors = ["BoundaryML"]
   spec.email = ["contact@boundaryml.com"]
 
diff --git a/engine/language_client_typescript/package.json b/engine/language_client_typescript/package.json
index 379054efc..0bd8ab9fe 100644
--- a/engine/language_client_typescript/package.json
+++ b/engine/language_client_typescript/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@boundaryml/baml",
-  "version": "0.70.3",
+  "version": "0.70.4",
   "description": "BAML typescript bindings (package.json)",
   "repository": {
     "type": "git",
diff --git a/integ-tests/baml_src/generators.baml b/integ-tests/baml_src/generators.baml
index 656982e23..d5f2bad70 100644
--- a/integ-tests/baml_src/generators.baml
+++ b/integ-tests/baml_src/generators.baml
@@ -1,24 +1,24 @@
 generator lang_python {
   output_type python/pydantic
   output_dir "../python"
-  version "0.70.3"
+  version "0.70.4"
 }
 
 generator lang_typescript {
   output_type typescript
   output_dir "../typescript"
-  version "0.70.3"
+  version "0.70.4"
 }
 
 generator lang_ruby {
   output_type ruby/sorbet
   output_dir "../ruby"
-  version "0.70.3"
+  version "0.70.4"
 }
 
 // generator openapi {
 //   output_type rest/openapi
 //   output_dir "../openapi"
-//   version "0.70.3"
+//   version "0.70.4"
 //   on_generate "rm .gitignore"
 // }
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 db8996cda..2c63af3c4 100755
--- a/tools/bump-version
+++ b/tools/bump-version
@@ -51,6 +51,7 @@ _ruby_mode=0
 _vscode_mode=0
 _all_mode=0
 _allow_dirty_mode=0
+_no_tests_mode=0
 
 while [ $# -gt 0 ]; do
     case "$1" in
@@ -262,4 +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\n\n$ts_tests_status\n$python_tests_status\n\nGenerated by bump-version script."
+COMMIT_BODY=$(cat <\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/integ-tests.cfg b/tools/versions/integ-tests.cfg
index a8ca71672..f264e5a83 100644
--- a/tools/versions/integ-tests.cfg
+++ b/tools/versions/integ-tests.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.3
+current_version = 0.70.4
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/python.cfg b/tools/versions/python.cfg
index 1ad210a55..c670f6858 100644
--- a/tools/versions/python.cfg
+++ b/tools/versions/python.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.3
+current_version = 0.70.4
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/ruby.cfg b/tools/versions/ruby.cfg
index 13305dc99..f5a8fca9d 100644
--- a/tools/versions/ruby.cfg
+++ b/tools/versions/ruby.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.3
+current_version = 0.70.4
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/typescript.cfg b/tools/versions/typescript.cfg
index d148c9bf0..c83e523f3 100644
--- a/tools/versions/typescript.cfg
+++ b/tools/versions/typescript.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.3
+current_version = 0.70.4
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/vscode.cfg b/tools/versions/vscode.cfg
index 268252cec..ceb445f07 100644
--- a/tools/versions/vscode.cfg
+++ b/tools/versions/vscode.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.3
+current_version = 0.70.4
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/typescript/vscode-ext/packages/package.json b/typescript/vscode-ext/packages/package.json
index 6028b6729..0b16ac4ef 100644
--- a/typescript/vscode-ext/packages/package.json
+++ b/typescript/vscode-ext/packages/package.json
@@ -2,7 +2,7 @@
   "name": "baml-extension",
   "displayName": "Baml",
   "description": "BAML is a DSL for AI applications.",
-  "version": "0.70.3",
+  "version": "0.70.4",
   "publisher": "Boundary",
   "repository": "https://github.com/BoundaryML/baml",
   "homepage": "https://www.boundaryml.com",

From 398cfc81f508a063cfc754a8128dfa22b99ad010 Mon Sep 17 00:00:00 2001
From: hellovai 
Date: Fri, 13 Dec 2024 07:42:46 -0800
Subject: [PATCH 06/11] chore: Bump version to 0.70.5 (#1242)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Bump version to 0.70.5

✅ Typescript integ tests
✅ Python integ tests

Generated by bump-version script.
---
 CHANGELOG.md                                  |   2 +-
 engine/Cargo.lock                             |  32 +-
 engine/Cargo.toml                             |   2 +-
 engine/language_client_python/pyproject.toml  |   2 +-
 engine/language_client_ruby/baml.gemspec      |   2 +-
 .../language_client_typescript/package.json   |   2 +-
 integ-tests/baml_src/generators.baml          |   8 +-
 integ-tests/python/baml_client/inlinedbaml.py |   2 +-
 integ-tests/python/report.html                | 746 +++++++++---------
 integ-tests/ruby/baml_client/inlined.rb       |   2 +-
 .../typescript/baml_client/inlinedbaml.ts     |   2 +-
 integ-tests/typescript/test-report.html       | 412 +++-------
 tools/versions/engine.cfg                     |   2 +-
 tools/versions/integ-tests.cfg                |   2 +-
 tools/versions/python.cfg                     |   2 +-
 tools/versions/ruby.cfg                       |   2 +-
 tools/versions/typescript.cfg                 |   2 +-
 tools/versions/vscode.cfg                     |   2 +-
 typescript/vscode-ext/packages/package.json   |   2 +-
 19 files changed, 488 insertions(+), 740 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index f64d1d1f3..28a22c3a4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@
 
 All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines.
 
-## [0.70.4](https://github.com/boundaryml/baml/compare/0.70.1..0.70.4) - 2024-12-13
+## [0.70.5](https://github.com/boundaryml/baml/compare/0.70.1..0.70.5) - 2024-12-13
 
 ### Bug Fixes
 
diff --git a/engine/Cargo.lock b/engine/Cargo.lock
index 47e3a822a..5006542f1 100644
--- a/engine/Cargo.lock
+++ b/engine/Cargo.lock
@@ -785,7 +785,7 @@ dependencies = [
 
 [[package]]
 name = "baml-cli"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "ambassador",
  "anyhow",
@@ -873,7 +873,7 @@ dependencies = [
 
 [[package]]
 name = "baml-lib"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "base64 0.13.1",
  "dissimilar",
@@ -913,7 +913,7 @@ dependencies = [
 
 [[package]]
 name = "baml-runtime"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "ambassador",
  "anyhow",
@@ -1010,7 +1010,7 @@ dependencies = [
 
 [[package]]
 name = "baml-schema-build"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "anyhow",
  "baml-runtime",
@@ -1048,7 +1048,7 @@ dependencies = [
 
 [[package]]
 name = "baml-types"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "anyhow",
  "clap",
@@ -1177,7 +1177,7 @@ dependencies = [
 
 [[package]]
 name = "bstd"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "anyhow",
  "assert_cmd",
@@ -2571,7 +2571,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-codegen"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "anyhow",
  "askama",
@@ -2596,7 +2596,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-core"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "anyhow",
  "baml-types",
@@ -2633,7 +2633,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-diagnostics"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "anyhow",
  "colored",
@@ -2646,7 +2646,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-jinja"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "anyhow",
  "askama",
@@ -2667,7 +2667,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-jinja-types"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "anyhow",
  "askama",
@@ -2686,7 +2686,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-parser-database"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "anyhow",
  "baml-types",
@@ -2711,7 +2711,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-prompt-parser"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "internal-baml-diagnostics",
  "internal-baml-schema-ast",
@@ -2723,7 +2723,7 @@ dependencies = [
 
 [[package]]
 name = "internal-baml-schema-ast"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "anyhow",
  "baml-types",
@@ -2742,7 +2742,7 @@ dependencies = [
 
 [[package]]
 name = "internal-llm-client"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "anyhow",
  "baml-types",
@@ -2840,7 +2840,7 @@ checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105"
 
 [[package]]
 name = "jsonish"
-version = "0.70.4"
+version = "0.70.5"
 dependencies = [
  "anyhow",
  "assert-json-diff",
diff --git a/engine/Cargo.toml b/engine/Cargo.toml
index 794483be4..5206fcd5d 100644
--- a/engine/Cargo.toml
+++ b/engine/Cargo.toml
@@ -95,7 +95,7 @@ internal-baml-jinja = { path = "baml-lib/jinja" }
 internal-baml-schema-ast = { path = "baml-lib/schema-ast" }
 
 [workspace.package]
-version = "0.70.4"
+version = "0.70.5"
 authors = ["Boundary "]
 
 description = "BAML Toolchain"
diff --git a/engine/language_client_python/pyproject.toml b/engine/language_client_python/pyproject.toml
index 701dad675..f8fddc48a 100644
--- a/engine/language_client_python/pyproject.toml
+++ b/engine/language_client_python/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "baml-py"
-version = "0.70.4"
+version = "0.70.5"
 description = "BAML python bindings (pyproject.toml)"
 readme = "README.md"
 authors = [["Boundary", "contact@boundaryml.com"]]
diff --git a/engine/language_client_ruby/baml.gemspec b/engine/language_client_ruby/baml.gemspec
index 614847ac9..b0fe42f8b 100644
--- a/engine/language_client_ruby/baml.gemspec
+++ b/engine/language_client_ruby/baml.gemspec
@@ -2,7 +2,7 @@
 
 Gem::Specification.new do |spec|
   spec.name = "baml"
-  spec.version = "0.70.4"
+  spec.version = "0.70.5"
   spec.authors = ["BoundaryML"]
   spec.email = ["contact@boundaryml.com"]
 
diff --git a/engine/language_client_typescript/package.json b/engine/language_client_typescript/package.json
index 0bd8ab9fe..ce111573d 100644
--- a/engine/language_client_typescript/package.json
+++ b/engine/language_client_typescript/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@boundaryml/baml",
-  "version": "0.70.4",
+  "version": "0.70.5",
   "description": "BAML typescript bindings (package.json)",
   "repository": {
     "type": "git",
diff --git a/integ-tests/baml_src/generators.baml b/integ-tests/baml_src/generators.baml
index d5f2bad70..fef5b4e88 100644
--- a/integ-tests/baml_src/generators.baml
+++ b/integ-tests/baml_src/generators.baml
@@ -1,24 +1,24 @@
 generator lang_python {
   output_type python/pydantic
   output_dir "../python"
-  version "0.70.4"
+  version "0.70.5"
 }
 
 generator lang_typescript {
   output_type typescript
   output_dir "../typescript"
-  version "0.70.4"
+  version "0.70.5"
 }
 
 generator lang_ruby {
   output_type ruby/sorbet
   output_dir "../ruby"
-  version "0.70.4"
+  version "0.70.5"
 }
 
 // generator openapi {
 //   output_type rest/openapi
 //   output_dir "../openapi"
-//   version "0.70.4"
+//   version "0.70.5"
 //   on_generate "rm .gitignore"
 // }
diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py
index 5ad6ca5a3..7af9855cb 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.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",
+    "generators.baml": "generator lang_python {\n  output_type python/pydantic\n  output_dir \"../python\"\n  version \"0.70.5\"\n}\n\ngenerator lang_typescript {\n  output_type typescript\n  output_dir \"../typescript\"\n  version \"0.70.5\"\n}\n\ngenerator lang_ruby {\n  output_type ruby/sorbet\n  output_dir \"../ruby\"\n  version \"0.70.5\"\n}\n\n// generator openapi {\n//   output_type rest/openapi\n//   output_dir \"../openapi\"\n//   version \"0.70.5\"\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 c0d92aea1..a2bf7f2b2 100644
--- a/integ-tests/python/report.html
+++ b/integ-tests/python/report.html
@@ -3,107 +3,107 @@
     
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!
+    
Test Report

Summary

102
102 passed

Tests

tests/test_functions.py 97 0:03:46.102683

PASSED test_env_vars_reset 0:00:01.724247

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

Setup

Call

Captured stdout call
got response key
+

Teardown

PASSED test_sync 0:00:00.711866

Setup

Call

Captured stdout call
got response key
 true
 52
-

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_bool 0:00:00.390461

Setup

Call

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.541253

Setup

Call

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.638103

Setup

Call

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.707337

Setup

Call

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.751209

Setup

Call

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.520349

Setup

Call

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001717

Setup

Call

Captured stderr call
[2024-12-13T15:37:30Z 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.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.
+

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.640746

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.677625

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.391208

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.338163

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.449043

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.307882

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.306098

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.342438

Setup

Call

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:00.574151

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:01.234555

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.619017

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.525969

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:05.381838

Setup

Call

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:00.725482

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.944775

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:01.689217

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:09.106303

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.247719

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:01.860304

Setup

Call

Teardown

PASSED test_should_work_with_vertex 0:00:09.442870

Setup

Call

Teardown

PASSED test_should_work_with_image_base64 0:00:01.575767

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.127755

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.295709

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:02.286246

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: 1734104292, tv_nsec: 898945000 }, latency: 213.33125ms, 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.883552

Setup

Call

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.034322

Setup

Call

Teardown

PASSED test_claude 0:00:01.074194

Setup

Call

Teardown

PASSED test_gemini 0:00:08.252263

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pete Pepper wasn't a medical doctor, no matter what his name tag proclaimed.  He was a botanist, specializing in, of all things, peppers. Not the bell peppers you'd find in your salad, but their wilder, spicier cousins.  His small shop, tucked between a bakery and a vintage clothing store, was a haven for chili heads. 
 
-"Aim for the moon, little brother," his eldest sister, Flicker, would always tell him. "Even if you miss, you'll land among the stars." 
+One afternoon, a young woman named Lily hurried in, desperation etched on her face. "Dr. Pepper? Please, you have to help!"
 
-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. 
+Dr. Pepper, a portly man with a pepper-shaped birthmark on his cheek, peered at her over his spectacles. "What seems to be the trouble?" 
 
-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.
+Lily held out a withered plant. "This," she whispered, "is Beatrice. She's a Carolina Reaper, and she's… well, she's dying!"
 
-"My signal is failing!" one cried. "I can't reach my cousin Barry!"
+Dr. Pepper examined the plant.  "Hmm, overwatering, I see.  And a touch of aphid infestation.  Don't worry, we can fix this."
 
-Dr. Pepper, who had been studying a particularly shimmering dewdrop, knew this was his moment. He scurried over, his tiny heart thumping. 
+For the next hour, Lily watched, captivated, as Dr. Pepper treated Beatrice with a gentle touch and a pharmacist's precision, mixing homemade concoctions and whispering words of encouragement. 
 
-"Don't worry!" he declared. "I, Dr. Pepper, have just the thing!"
+When he finished, he smiled.  "There you go. She'll be right as rain in no time."
 
-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. 
+Lily beamed, relief flooding her features. "Thank you, Dr. Pepper!  Beatrice is very special to me."
 
-As if by magic, their lights blazed with renewed intensity, brighter than ever before. The meadow was bathed in a warm, pulsating glow. 
+Dr. Pepper chuckled.  "They all are, my dear.  Each pepper has its own story, its own unique fire."
 
-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. 
+From then on, Lily became a regular, bringing Dr. Pepper fresh-baked cookies shaped like chili peppers and listening to his tales of pepper expeditions around the world.  And Beatrice? She thrived, producing the hottest, most delicious Carolina Reapers anyone had ever tasted – a testament to the magic touch of the one and only Dr. Pepper. 
 
-

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

Teardown

PASSED test_gemini_streaming 0:00:09.945069

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pete Pepper wasn't a doctor of medicine, but everyone called him "Doc" anyway.  He owned the Pepper Place Soda Fountain, a cozy shop on Main Street where the cherry-red booths and checkered floor had seen generations of gossip, first dates, and ice cream dreams. 
 
-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. 
+Doc, with his twinkling eyes and a handlebar mustache that seemed to hold a lifetime of stories, wasn't just a soda jerk, he was a craftsman. He concocted his own syrups, each a secret recipe passed down from his grandfather: sarsaparilla with a hint of nutmeg, creamy vanilla bean, and his most popular, a spicy, effervescent blend he called "Doc's Pep." 
 
-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. 
+One sweltering afternoon, a young girl named Lily sat forlornly at the counter.  She picked at her vanilla ice cream, her face as droopy as a wilted daisy. 
 
-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.
+"What's got you down, little one?" Doc asked, drying a glass. 
 
-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. 
+"It's my Pa," Lily sighed, "He's been working too hard.  He needs a pep in his step, but nothing seems to work."
 
-"Fuel pump's had its day, sonny. But don't you worry," she winked, "Dr. Pepper's got just the cure."
+Doc's eyes twinkled. He knew just the thing. He mixed together a tall glass of his special soda, adding a scoop of vanilla ice cream and a splash of Lily’s favorite cherry syrup. 
 
-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.
+Lily brought the drink to her Pa, a tired construction worker with kind eyes. He took a sip, and his face lit up like a Christmas tree. "Now that's what I call a pick-me-up!" he exclaimed. 
 
-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. 
+From that day on, the drink became a local legend.  People came from miles around to try "Lily's Pep," a drink that tasted like sunshine and hope. Doc's Soda Fountain, overflowing with laughter and the sweet scent of success, became a place where people didn't just come to quench their thirst, but to find a little bit of joy, all thanks to a special girl, a caring soda jerk, and a drink that truly put the pep back in their step. 
 
-

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

Teardown

PASSED test_aws 0:00:02.873132

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:16.978485

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:20.264603

Setup

Call

Captured log call
WARNING  asyncio:base_events.py:1982 Executing <Task pending name='Task-44' coro=<BamlStream.__drive_to_completion() running at /Users/vbv/repos/gloo-lang/engine/language_client_python/python_src/baml_py/stream.py:48> wait_for=<Future pending cb=[<builtins.PyDoneCallback object at 0x11a41f350>(), Task.task_wakeup()] created at /opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py:449> cb=[_run_until_complete_cb() at /opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py:182] created at /opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py:100> took 0.418 seconds

Teardown

PASSED test_anthropic_shorthand 0:00:03.639071

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:04.997820

Setup

Call

Captured log call
WARNING  asyncio:base_events.py:1982 Executing <Handle <builtins.CheckedCompletor object at 0x11a41f390>(<Future finis...events.py:449>, <built-in met...t 0x1193fc5e0>, <baml_py.baml...t 0x11a58b5a0>)> took 0.149 seconds

Teardown

PASSED test_fallback_to_shorthand 0:00:01.786834

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:01.634205

Setup

Call

Teardown

PASSED test_streaming 0:00:03.029945

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:03.856884

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:04.308863

Setup

Call

Teardown

PASSED test_streaming_uniterated_sync 0:00:02.649873

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:02.280925

Setup

Call

Captured stdout call
msgs:
 Here's a haiku about Mt. Rainier:
 
-Rainier stands proud, strong
-Piercing through clouds to bright sky
-Mountain king supreme
+Rainier towers high
+Ancient glacier-crowned giant
+Watches Puget Sound
 final:
 Here's a haiku about Mt. Rainier:
 
-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. 
+Rainier towers high
+Ancient glacier-crowned giant
+Watches Puget Sound
+

Teardown

PASSED test_streaming_gemini 0:00:10.312743

Setup

Call

Captured stdout call
msgs:
+Dr. Pepper wasn't actually a doctor, though many in his small town jokingly called him that. His real name was Edward, but everyone knew him by his peculiar habit of always having a can of Dr Pepper in hand. He wasn't addicted, not really, but the caramel-colored fizz seemed to fuel his days.
 
-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.
+Edward ran the local clock tower, a beautiful, if slightly crooked, structure that loomed over their quaint town square. Every day, rain or shine, he climbed its winding steps, his trusty Dr Pepper accompanying him, to wind the ancient mechanism and ensure the town kept ticking. 
 
-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.
+One day, a young girl named Lily started visiting him. Her eyes, wide with wonder, would follow Edward's every move as he oiled gears and tightened springs. Lily, much like the town, seemed drawn to Edward's quiet dedication, his gentle humming as he worked, and yes, even his ever-present Dr Pepper.
 
-William looked up, surprised. "Dr. Pepper? For me?" 
+One particularly dreary afternoon, Lily arrived at the clock tower with a worried frown. "Mr. Edward," she began, her voice small, "the clock, it seems sad today. It doesn't chime like it used to."
 
-Millie chuckled. "Saw you staring at the young couple at booth three sharing one. Figured you could use a trip down memory lane."
+Edward chuckled, taking a sip from his can. He always told Lily the clock talked to him, that it whispered its woes through creaks and groans. To Lily, who looked at him with the unshakeable trust only a child could possess, this wasn't a matter of fantasy, it was simply fact.
 
-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.
+Together, they examined the clock's giant pendulum, its swing sluggish and slow.  "Ah," Edward said finally, pointing to a worn-out spring, "Looks like our friend needs a little pick-me-up, just like you sometimes need a good night's sleep."
 
-A small smile touched his lips. "Thank you, Millie," he murmured. 
+As Edward replaced the spring, Lily, much like her mother did every week, offered him a freshly baked cookie. This time, however, alongside it sat a can of Dr Pepper, its condensation forming a perfect, tiny halo around the base. 
 
-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.  
+"For when the clock makes you thirsty," Lily said with a shy smile.
 
-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. 
+Edward's heart, much like the revitalized clock, felt a warmth spread through it, a feeling as comforting and familiar as his favorite drink. He realized then that perhaps he wasn't just keeping time in this town, but also making memories, one can of Dr Pepper and one chime at a time. 
 
 final:
-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. 
+Dr. Pepper wasn't actually a doctor, though many in his small town jokingly called him that. His real name was Edward, but everyone knew him by his peculiar habit of always having a can of Dr Pepper in hand. He wasn't addicted, not really, but the caramel-colored fizz seemed to fuel his days.
 
-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.
+Edward ran the local clock tower, a beautiful, if slightly crooked, structure that loomed over their quaint town square. Every day, rain or shine, he climbed its winding steps, his trusty Dr Pepper accompanying him, to wind the ancient mechanism and ensure the town kept ticking. 
 
-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.
+One day, a young girl named Lily started visiting him. Her eyes, wide with wonder, would follow Edward's every move as he oiled gears and tightened springs. Lily, much like the town, seemed drawn to Edward's quiet dedication, his gentle humming as he worked, and yes, even his ever-present Dr Pepper.
 
-William looked up, surprised. "Dr. Pepper? For me?" 
+One particularly dreary afternoon, Lily arrived at the clock tower with a worried frown. "Mr. Edward," she began, her voice small, "the clock, it seems sad today. It doesn't chime like it used to."
 
-Millie chuckled. "Saw you staring at the young couple at booth three sharing one. Figured you could use a trip down memory lane."
+Edward chuckled, taking a sip from his can. He always told Lily the clock talked to him, that it whispered its woes through creaks and groans. To Lily, who looked at him with the unshakeable trust only a child could possess, this wasn't a matter of fantasy, it was simply fact.
 
-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.
+Together, they examined the clock's giant pendulum, its swing sluggish and slow.  "Ah," Edward said finally, pointing to a worn-out spring, "Looks like our friend needs a little pick-me-up, just like you sometimes need a good night's sleep."
 
-A small smile touched his lips. "Thank you, Millie," he murmured. 
+As Edward replaced the spring, Lily, much like her mother did every week, offered him a freshly baked cookie. This time, however, alongside it sat a can of Dr Pepper, its condensation forming a perfect, tiny halo around the base. 
 
-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.  
+"For when the clock makes you thirsty," Lily said with a shy smile.
 
-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. 
+Edward's heart, much like the revitalized clock, felt a warmth spread through it, a feeling as comforting and familiar as his favorite drink. He realized then that perhaps he wasn't just keeping time in this town, but also making memories, one can of Dr Pepper and one chime at a time. 
 
-

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
[]
+

Teardown

PASSED test_tracing_async_only 0:00:06.292172

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

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.502396

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:13.928513

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.500037

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.459186

Setup

Call

Teardown

PASSED test_dynamic 0:00:00.787106

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

Setup

Call

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

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
+

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.830211

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

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}
@@ -180,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:00.619440

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.514480

Setup

Call

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

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
[]
+

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.167632

Setup

Call

Teardown

PASSED test_dynamic_types_new_enum 0:00:01.248098

Setup

Call

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.879871

Setup

Call

Teardown

PASSED test_dynamic_literals 0:00:00.815644

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:01.074834

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:00.733588

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

Teardown

PASSED test_dynamic_output_union 0:00:02.036545

Setup

Call

Captured stdout call
[]
+final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30 years old'} height={'feet': 6.0, 'inches': None}
+final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30 years old'}, 'height': {'feet': 6.0, 'inches': None}}
+final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard","age":"30 years old"},"height":{"feet":6.0,"inches":null}}
+final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', '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.660840

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}
@@ -262,190 +259,175 @@
 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: 
+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': 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': 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': 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': 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': 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': 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}}}
+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}}}
+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': 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': None}}}
+final  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.391049

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:00.890284

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:01.153630

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.496045

Setup

Call

Captured stdout call
Event log hook1: 
 Event log event  BamlLogEvent {
     metadata: {
-        event_id: "0fad094a-7b15-4103-b2d0-4004c72cf447",
+        event_id: "583e4e49-bd71-4328-808c-c2ab71ab7d2f",
         parent_id: None,
-        root_event_id: "0fad094a-7b15-4103-b2d0-4004c72cf447"
+        root_event_id: "583e4e49-bd71-4328-808c-c2ab71ab7d2f"
     },
     prompt: "[
   {
@@ -459,124 +441,124 @@
 ]",
     raw_output: "["a", "b", "c"]",
     parsed_output: "["a", "b", "c"]",
-    start_time: "2024-12-13T15:06:45.817Z"
+    start_time: "2024-12-13T15:40:37.185Z"
 }
-

Teardown

PASSED test_aws_bedrock 0:00:03.034956

Setup

Call

Captured stdout call
unstreamed 
+

Teardown

PASSED test_aws_bedrock 0:00:03.226659

Setup

Call

Captured stdout call
unstreamed 
 
-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.
+The old geologist, Dr. Maria, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the layers of sediment, the fossilized creatures, the veins of precious metals. But nothing had ever prepared her for the discovery she was about to make.
 
-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
+As she climbed up the rocky slope, her eyes scanned the ground for any sign of the unusual rock formation she had heard rumors about. It was said to be a rare type of quartz, one
 streamed  '\n\n'
-streamed  '\n\nIn'
-streamed  '\n\nIn the'
-streamed  '\n\nIn the heart'
-streamed  '\n\nIn the heart of'
-streamed  '\n\nIn the heart of the'
-streamed  '\n\nIn the heart of the ancient'
-streamed  '\n\nIn the heart of the ancient forest'
-streamed  '\n\nIn the heart of the ancient forest,'
-streamed  '\n\nIn the heart of the ancient forest, there'
-streamed  '\n\nIn the heart of the ancient forest, there was'
-streamed  '\n\nIn the heart of the ancient forest, there was a'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike'
-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. 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  '\n\nThe'
+streamed  '\n\nThe old'
+streamed  '\n\nThe old ge'
+streamed  '\n\nThe old geologist'
+streamed  '\n\nThe old geologist,'
+streamed  '\n\nThe old geologist, Emma'
+streamed  '\n\nThe old geologist, Emma,'
+streamed  '\n\nThe old geologist, Emma, had'
+streamed  '\n\nThe old geologist, Emma, had spent'
+streamed  '\n\nThe old geologist, Emma, had spent her'
+streamed  '\n\nThe old geologist, Emma, had spent her entire'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying the'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying the ancient'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying the ancient rocks'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying the ancient rocks of'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying the ancient rocks of the'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying the ancient rocks of the Appalachian'
+streamed  'geologist, Emma, had spent her entire career studying the ancient rocks of the Appalachian Mountains'
+streamed  'eologist, Emma, had spent her entire career studying the ancient rocks of the Appalachian Mountains.'
+streamed  'gist, Emma, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She'
+streamed  ', Emma, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had'
+streamed  'a, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen'
+streamed  'had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it'
+streamed  'spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all'
+streamed  'ent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all -'
+streamed  'her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the'
+streamed  'ire career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the fossil'
+streamed  'career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the fossilized'
+streamed  ' studying the ancient rocks of the Appalachian Mountains. She had seen it all - the fossilized trees'
+streamed  'studying the ancient rocks of the Appalachian Mountains. She had seen it all - the fossilized trees,'
+streamed  'ying the ancient rocks of the Appalachian Mountains. She had seen it all - the fossilized trees, the'
+streamed  'e ancient rocks of the Appalachian Mountains. She had seen it all - the fossilized trees, the quartz'
+streamed  ' rocks of the Appalachian Mountains. She had seen it all - the fossilized trees, the quartz crystals'
+streamed  'rocks of the Appalachian Mountains. She had seen it all - the fossilized trees, the quartz crystals,'
+streamed  's of the Appalachian Mountains. She had seen it all - the fossilized trees, the quartz crystals, the'
+streamed  'he Appalachian Mountains. She had seen it all - the fossilized trees, the quartz crystals, the veins'
+streamed  'Appalachian Mountains. She had seen it all - the fossilized trees, the quartz crystals, the veins of'
+streamed  'achian Mountains. She had seen it all - the fossilized trees, the quartz crystals, the veins of gold'
+streamed  'chian Mountains. She had seen it all - the fossilized trees, the quartz crystals, the veins of gold.'
+streamed  'n Mountains. She had seen it all - the fossilized trees, the quartz crystals, the veins of gold. But'
+streamed  'ins. She had seen it all - the fossilized trees, the quartz crystals, the veins of gold. But nothing'
+streamed  'he had seen it all - the fossilized trees, the quartz crystals, the veins of gold. But nothing could'
+streamed  'd seen it all - the fossilized trees, the quartz crystals, the veins of gold. But nothing could have'
+streamed  ' all - the fossilized trees, the quartz crystals, the veins of gold. But nothing could have prepared'
+streamed  ' - the fossilized trees, the quartz crystals, the veins of gold. But nothing could have prepared her'
+streamed  'he fossilized trees, the quartz crystals, the veins of gold. But nothing could have prepared her for'
+streamed  'ssilized trees, the quartz crystals, the veins of gold. But nothing could have prepared her for what'
+streamed  'ized trees, the quartz crystals, the veins of gold. But nothing could have prepared her for what she'
+streamed  ' trees, the quartz crystals, the veins of gold. But nothing could have prepared her for what she was'
+streamed  ', the quartz crystals, the veins of gold. But nothing could have prepared her for what she was about'
+streamed  'he quartz crystals, the veins of gold. But nothing could have prepared her for what she was about to'
+streamed  ' crystals, the veins of gold. But nothing could have prepared her for what she was about to discover'
+streamed  'ystals, the veins of gold. But nothing could have prepared her for what she was about to discover.\n\n'
+streamed  'tals, the veins of gold. But nothing could have prepared her for what she was about to discover.\n\nAs'
+streamed  ', the veins of gold. But nothing could have prepared her for what she was about to discover.\n\nAs she'
+streamed  ' veins of gold. But nothing could have prepared her for what she was about to discover.\n\nAs she made'
+streamed  'ns of gold. But nothing could have prepared her for what she was about to discover.\n\nAs she made her'
+streamed  'f gold. But nothing could have prepared her for what she was about to discover.\n\nAs she made her way'
+streamed  'But nothing could have prepared her for what she was about to discover.\n\nAs she made her way through'
+streamed  'nothing could have prepared her for what she was about to discover.\n\nAs she made her way through the'
+streamed  'g could have prepared her for what she was about to discover.\n\nAs she made her way through the dense'
+streamed  ' have prepared her for what she was about to discover.\n\nAs she made her way through the dense forest'
+streamed  'have prepared her for what she was about to discover.\n\nAs she made her way through the dense forest,'
+streamed  ' prepared her for what she was about to discover.\n\nAs she made her way through the dense forest, her'
+streamed  'ared her for what she was about to discover.\n\nAs she made her way through the dense forest, her eyes'
+streamed  'for what she was about to discover.\n\nAs she made her way through the dense forest, her eyes scanning'
+streamed  'what she was about to discover.\n\nAs she made her way through the dense forest, her eyes scanning the'
+streamed  'e was about to discover.\n\nAs she made her way through the dense forest, her eyes scanning the ground'
+streamed  's about to discover.\n\nAs she made her way through the dense forest, her eyes scanning the ground for'
+streamed  'out to discover.\n\nAs she made her way through the dense forest, her eyes scanning the ground for any'
+streamed  'o discover.\n\nAs she made her way through the dense forest, her eyes scanning the ground for any sign'
+streamed  'iscover.\n\nAs she made her way through the dense forest, her eyes scanning the ground for any sign of'
+streamed  ' she made her way through the dense forest, her eyes scanning the ground for any sign of interesting'
+streamed  'made her way through the dense forest, her eyes scanning the ground for any sign of interesting rock'
+streamed  'y through the dense forest, her eyes scanning the ground for any sign of interesting rock formations'
+streamed  ' through the dense forest, her eyes scanning the ground for any sign of interesting rock formations,'
+streamed  'ugh the dense forest, her eyes scanning the ground for any sign of interesting rock formations, Emma'
+streamed  'ense forest, her eyes scanning the ground for any sign of interesting rock formations, Emma stumbled'
+streamed  'forest, her eyes scanning the ground for any sign of interesting rock formations, Emma stumbled upon'
+streamed  'rest, her eyes scanning the ground for any sign of interesting rock formations, Emma stumbled upon a'
+streamed  ' eyes scanning the ground for any sign of interesting rock formations, Emma stumbled upon a peculiar'
+streamed  's scanning the ground for any sign of interesting rock formations, Emma stumbled upon a peculiar out'
+streamed  'canning the ground for any sign of interesting rock formations, Emma stumbled upon a peculiar outcro'
+streamed  'ng the ground for any sign of interesting rock formations, Emma stumbled upon a peculiar outcropping'
+streamed  'g the ground for any sign of interesting rock formations, Emma stumbled upon a peculiar outcropping.'
+streamed  'e ground for any sign of interesting rock formations, Emma stumbled upon a peculiar outcropping. The'
+streamed  'und for any sign of interesting rock formations, Emma stumbled upon a peculiar outcropping. The rock'
+streamed  'for any sign of interesting rock formations, Emma stumbled upon a peculiar outcropping. The rock was'
+streamed  ' sign of interesting rock formations, Emma stumbled upon a peculiar outcropping. The rock was unlike'
+streamed  'n of interesting rock formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any'
+streamed  ' interesting rock formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she'
+streamed  'eresting rock formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she had'
+streamed  'ing rock formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen'
+streamed  'k formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before'
+streamed  'formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before -'
+streamed  'ations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before - its'
+streamed  'Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before - its surface'
+streamed  'Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before - its surface'
+streamed  'Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before - its surface'
+streamed  'Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before - its surface'
 streamed final 
 
-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 old geologist, Emma, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the fossilized trees, the quartz crystals, the veins of gold. But nothing could have prepared her for what she was about to discover.
 
-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".
+As she made her way through the dense forest, her eyes scanning the ground for any sign of interesting rock formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before - its surface
+

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.005077

Setup

Call

Teardown

PASSED test_serialization_exception 0:00:00.414764

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

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None
+

Teardown

PASSED test_stream_serialization_exception 0:00:00.525969

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

Teardown

PASSED test_stream2_serialization_exception 0:00:00.400340

Setup

Call

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

Teardown

PASSED test_stream2_serialization_exception 0:00:00.475911

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
@@ -606,43 +588,19 @@
 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...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: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)`
+

Teardown

PASSED test_descriptions 0:00:01.901301

Setup

Call

Teardown

PASSED test_caching 0:00:06.765143

Setup

Call

Captured stdout call
Duration no caching:  3.484745979309082
+Duration with caching:  3.279601812362671
+

Teardown

PASSED test_arg_exceptions 0:00:00.823517

Setup

Call

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

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")`
+

Teardown

PASSED test_map_as_param 0:00:00.001031

Setup

Call

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

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
+

Teardown

PASSED test_baml_validation_error_format 0:00:00.615744

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.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_no_stream_big_integer 0:00:01.048209

Setup

Call

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.662949

Setup

Call

Teardown

PASSED test_no_stream_compound_object 0:00:03.712300

Setup

Call

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:02.777885

Setup

Call

Teardown

PASSED test_differing_unions 0:00:00.860191

Setup

Call

Teardown

PASSED test_return_failing_assert 0:00:00.372300

Setup

Call

Teardown

PASSED test_parameter_failing_assert 0:00:00.001057

Setup

Call

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

Teardown

PASSED test_failing_assert_can_stream 0:00:02.406054

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
+

Teardown

PASSED test_failing_assert_can_stream 0:00:03.449452

Setup

Call

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

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
+

Teardown

PASSED test_simple_recursive_type 0:00:01.959081

Setup

Call

Teardown

PASSED test_mutually_recursive_type 0:00:02.151441

Setup

Call

Teardown

PASSED test_block_constraints 0:00:00.575196

Setup

Call

Teardown

PASSED test_nested_block_constraints 0:00:00.537941

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

Setup

Call

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

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 +

Teardown

tests/test_pydantic.py 3 0:00:00.002336

PASSED test_model_validate_success 0:00:00.001317

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000530

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000489

Setup

Call

Teardown

tests/test_python.py 2 0:00:00.024115

PASSED test_inspect 0:00:00.023680

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

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 468fc80cd..a24270955 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.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", + "generators.baml" => "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.70.5\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.5\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.5\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.5\"\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 891188dc1..58c92e590 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.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", + "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.70.5\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.5\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.5\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.5\"\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 5889a4d2e..7576857d3 100644 --- a/integ-tests/typescript/test-report.html +++ b/integ-tests/typescript/test-report.html @@ -257,19 +257,7 @@ font-size: 1rem; padding: 0 0.5rem; } -

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

Test Report

Started: 2024-12-13 07:35:13
Suites (1)
1 passed
0 failed
0 pending
Tests (67)
67 passed
0 failed
0 pending
Integ tests > should work for all inputs
single bool
passed
0.941s
Integ tests > should work for all inputs
single string list
passed
0.384s
Integ tests > should work for all inputs
return literal union
passed
0.401s
Integ tests > should work for all inputs
single class
passed
0.636s
Integ tests > should work for all inputs
multiple classes
passed
0.469s
Integ tests > should work for all inputs
single enum list
passed
0.466s
Integ tests > should work for all inputs
single float
passed
0.365s
Integ tests > should work for all inputs
single int
passed
0.313s
Integ tests > should work for all inputs
single literal int
passed
0.4s
Integ tests > should work for all inputs
single literal bool
passed
0.363s
Integ tests > should work for all inputs
single literal string
passed
0.425s
Integ tests > should work for all inputs
single class with literal prop
passed
0.466s
Integ tests > should work for all inputs
single class with literal union prop
passed
0.661s
Integ tests > should work for all inputs
single optional string
passed
0.466s
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.65s
Integ tests > should work for all inputs
single map string to map
passed
0.786s
Integ tests > should work for all inputs
enum key in map
passed
0.909s
Integ tests > should work for all inputs
literal string union key in map
passed
0.922s
Integ tests > should work for all inputs
single literal string key in map
passed
0.549s
Integ tests
should work for all outputs
passed
5.774s
Integ tests
works with retries1
passed
1.159s
Integ tests
works with retries2
passed
2.221s
Integ tests
works with fallbacks
passed
1.988s
Integ tests
should work with image from url
passed
1.413s
Integ tests
should work with image from base 64
passed
1.698s
Integ tests
should work with audio base 64
passed
1.085s
Integ tests
should work with audio from url
passed
1.332s
Integ tests
should support streaming in OpenAI
passed
1.927s
Integ tests
should support streaming in Gemini
passed
7.571s
Integ tests
should support AWS
passed
1.722s
Integ tests
should support streaming in AWS
passed
1.618s
Integ tests
should allow overriding the region
passed
0.042s
Integ tests
should support OpenAI shorthand
passed
19.04s
Integ tests
should support OpenAI shorthand streaming
passed
9.894s
Integ tests
should support anthropic shorthand
passed
2.456s
Integ tests
should support anthropic shorthand streaming
passed
2.835s
Integ tests
should support streaming without iterating
passed
2.147s
Integ tests
should support streaming in Claude
passed
1.513s
Integ tests
should support vertex
passed
10.78s
Integ tests
supports tracing sync
passed
0.009s
Integ tests
supports tracing async
passed
3.32s
Integ tests
should work with dynamic types single
passed
3.489s
Integ tests
should work with dynamic types enum
passed
0.86s
Integ tests
should work with dynamic literals
passed
0.787s
Integ tests
should work with dynamic types class
passed
1.544s
Integ tests
should work with dynamic inputs class
passed
0.508s
Integ tests
should work with dynamic inputs list
passed
0.545s
Integ tests
should work with dynamic output map
passed
0.62s
Integ tests
should work with dynamic output union
passed
1.536s
Integ tests
should work with nested classes
passed
7.784s
Integ tests
should work with dynamic client
passed
0.494s
Integ tests
should work with 'onLogEvent'
passed
1.945s
Integ tests
should work with a sync client
passed
0.411s
Integ tests
should raise an error when appropriate
passed
0.893s
Integ tests
should raise a BAMLValidationError
passed
0.422s
Integ tests
should reset environment variables correctly
passed
1.046s
Integ tests
should use aliases when serializing input objects - classes
passed
0.802s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.769s
Integ tests
should use aliases when serializing input objects - enums
passed
0.368s
Integ tests
should use aliases when serializing input objects - lists
passed
0.421s
Integ tests
constraints: should handle checks in return types
passed
0.784s
Integ tests
constraints: should handle checks in returned unions
passed
0.797s
Integ tests
constraints: should handle block-level checks
passed
0.568s
Integ tests
constraints: should handle nested-block-level checks
passed
0.793s
Integ tests
simple recursive type
passed
3.139s
Integ tests
mutually recursive type
passed
2.043s
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)
@@ -284,11 +272,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: 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 }
+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: 1734104132, tv_nsec: 832000 }, latency: 148.325833ms, 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: 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 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: 1734104134, tv_nsec: 158534000 }, latency: 230.130959ms, 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'
@@ -692,370 +680,172 @@
   hair_color: 'black',
   attributes: { eye_color: 'blue', facial_hair: 'beard' },
   height: { meters: 1.8 }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 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 {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: '', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: '', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: '', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: 'ag', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', 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: 'value2', prop2: '', 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: 'value2', prop2: 'value', inner: null }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', 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: 'value2', prop2: 'value3', 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: 'value2', prop2: 'value3', 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: 'value2', prop2: 'value3', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: '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 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: '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 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: '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 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: '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 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    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: '76a936f8-e133-4ea1-a58e-ce86919c1893',
-    rootEventId: '76a936f8-e133-4ea1-a58e-ce86919c1893'
+    eventId: '9ad5196c-2fe4-428b-bf00-1191272356cf',
+    rootEventId: '9ad5196c-2fe4-428b-bf00-1191272356cf'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -1069,12 +859,12 @@
     ']',
   rawOutput: '["a", "b", "c"]',
   parsedOutput: '["a", "b", "c"]',
-  startTime: '2024-12-13T15:01:10.937Z'
+  startTime: '2024-12-13T15:37:05.264Z'
 }
    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: 'd0febbcd-9aa4-48f0-a4da-0c29167c4f5f',
-    rootEventId: 'd0febbcd-9aa4-48f0-a4da-0c29167c4f5f'
+    eventId: '3ed3c62a-4348-46bf-924c-047cfa0f93a8',
+    rootEventId: '3ed3c62a-4348-46bf-924c-047cfa0f93a8'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -1088,8 +878,8 @@
     ']',
   rawOutput: '["d", "e", "f"]',
   parsedOutput: '["d", "e", "f"]',
-  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 }
+  startTime: '2024-12-13T15:37:05.907Z'
+}
    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: 1734104227, tv_nsec: 481679000 }, latency: 228.444916ms, 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'
@@ -1103,7 +893,7 @@
     at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:663:9
     at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:661:5) {
   prompt: '[\x1B[2mchat\x1B[0m] \x1B[43msystem: \x1B[0mSay "hello there".\n',
-  raw_output: 'Hello there! How can I assist you today?'
+  raw_output: 'Hello there! How can I help you today?'
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:677:17)
error BamlValidationError: BamlValidationError: Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
   - <root>: Missing required field: nonce
   - <root>: Missing required field: nonce2
diff --git a/tools/versions/engine.cfg b/tools/versions/engine.cfg
index 681f0e69e..7b0297730 100644
--- a/tools/versions/engine.cfg
+++ b/tools/versions/engine.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.4
+current_version = 0.70.5
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/integ-tests.cfg b/tools/versions/integ-tests.cfg
index f264e5a83..48a1bcd28 100644
--- a/tools/versions/integ-tests.cfg
+++ b/tools/versions/integ-tests.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.4
+current_version = 0.70.5
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/python.cfg b/tools/versions/python.cfg
index c670f6858..f2ee856be 100644
--- a/tools/versions/python.cfg
+++ b/tools/versions/python.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.4
+current_version = 0.70.5
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/ruby.cfg b/tools/versions/ruby.cfg
index f5a8fca9d..f8f0b8ca5 100644
--- a/tools/versions/ruby.cfg
+++ b/tools/versions/ruby.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.4
+current_version = 0.70.5
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/typescript.cfg b/tools/versions/typescript.cfg
index c83e523f3..5f2984fcd 100644
--- a/tools/versions/typescript.cfg
+++ b/tools/versions/typescript.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.4
+current_version = 0.70.5
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/vscode.cfg b/tools/versions/vscode.cfg
index ceb445f07..f4c02a2da 100644
--- a/tools/versions/vscode.cfg
+++ b/tools/versions/vscode.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.4
+current_version = 0.70.5
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/typescript/vscode-ext/packages/package.json b/typescript/vscode-ext/packages/package.json
index 0b16ac4ef..676e5f684 100644
--- a/typescript/vscode-ext/packages/package.json
+++ b/typescript/vscode-ext/packages/package.json
@@ -2,7 +2,7 @@
   "name": "baml-extension",
   "displayName": "Baml",
   "description": "BAML is a DSL for AI applications.",
-  "version": "0.70.4",
+  "version": "0.70.5",
   "publisher": "Boundary",
   "repository": "https://github.com/BoundaryML/baml",
   "homepage": "https://www.boundaryml.com",

From d3b959674957bfd07fd44817022c64e5b4d248c7 Mon Sep 17 00:00:00 2001
From: Samuel Lijin 
Date: Fri, 13 Dec 2024 09:03:30 -0800
Subject: [PATCH 07/11] chore: add approval reqs to release workflows (#1243)





> [!IMPORTANT]
> Add approval requirement to `publish-to-github`,
`publish-to-open-vsx`, and `publish-to-vscode-marketplace` jobs in
`release.yml`.
>
>   - **Workflows**:
> - Add `environment: release` to `publish-to-github`,
`publish-to-open-vsx`, and `publish-to-vscode-marketplace` jobs in
`release.yml` to require approval before execution.
>
> This description was created by [Ellipsis](https://www.ellipsis.dev?ref=BoundaryML%2Fbaml&utm_source=github&utm_medium=referral)
for daea535f79bd7eb2278c352f015f623de93b89a7. It will automatically
update as commits are pushed.


---
 .github/workflows/release.yml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 62c6d3f6f..46acfa443 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -164,6 +164,7 @@ jobs:
           done
 
   publish-to-github:
+    environment: release
     needs: [all-builds]
     if: ${{ startsWith(github.ref, 'refs/tags/') }}
     runs-on: ubuntu-latest
@@ -181,6 +182,7 @@ jobs:
           body: ${{steps.latest_release.outputs.changelog}}
 
   publish-to-open-vsx:
+    environment: release
     needs: [all-builds]
     runs-on: ubuntu-latest
     if: ${{ startsWith(github.ref, 'refs/tags/') || inputs.force_publish_vscode }}
@@ -202,6 +204,7 @@ jobs:
           OVSX_PAT: ${{ secrets.OVSX_PAT }}
 
   publish-to-vscode-marketplace:
+    environment: release
     needs: [all-builds]
     runs-on: ubuntu-latest
     if: ${{ startsWith(github.ref, 'refs/tags/') || inputs.force_publish_vscode }}

From 66af7c57d22098b8d4c42f0d49ead84090b16407 Mon Sep 17 00:00:00 2001
From: Samuel Lijin 
Date: Fri, 13 Dec 2024 17:53:01 -0800
Subject: [PATCH 08/11] feat: implement format-on-save in vscode and baml-cli
 fmt (#1246)

This wires up Dylan's work on setting up a BAML formatter and makes it
possible to auto-format _some_ BAML code:

- it is now possible to format-on-save BAML code using the vscode
extension by running `baml.setDefaultFormatter` as a command in vscode
- `baml-cli fmt` will now work, if run in a dir containing a `baml_src`
dir; it also supports dry-run (will write to stdout instead) and
explicitly specifying baml files

The formatter itself is... not quite there yet. So `baml-cli fmt` will
stay a hidden command.

- there are some syntax rules it barfs on (enums? literals? something in
integ-tests)
- it rewrites comments possibly too aggressively (e.g. across multiple
lines they're concatenated)
- unclear how useful/useless it is without the ability to format
template string contents
- our current grammar can be pretty brittle in some cases (e.g. newlines
are not allowed in angle brackets, c.f.`"map<\nstring, string>"` is
invalid)
---
 engine/baml-schema-wasm/src/lib.rs            | 22 +++++++
 engine/cli/src/commands.rs                    |  7 ++-
 engine/cli/src/format.rs                      | 61 ++++++++++++++-----
 tools/build                                   |  4 +-
 .../packages/language-server/src/server.ts    | 17 +++++-
 typescript/vscode-ext/packages/package.json   |  5 ++
 .../packages/vscode/src/extension.ts          |  7 ++-
 .../src/plugins/language-server/index.ts      | 43 +++++++++++++
 8 files changed, 147 insertions(+), 19 deletions(-)

diff --git a/engine/baml-schema-wasm/src/lib.rs b/engine/baml-schema-wasm/src/lib.rs
index 243f94848..b9fb05baa 100644
--- a/engine/baml-schema-wasm/src/lib.rs
+++ b/engine/baml-schema-wasm/src/lib.rs
@@ -1,6 +1,7 @@
 #[cfg(target_arch = "wasm32")]
 pub mod runtime_wasm;
 
+use internal_baml_core::internal_baml_schema_ast::{format_schema, FormatOptions};
 use std::env;
 use wasm_bindgen::prelude::*;
 
@@ -9,3 +10,24 @@ pub fn version() -> String {
     // register_panic_hook();
     env!("CARGO_PKG_VERSION").to_string()
 }
+
+#[wasm_bindgen]
+pub fn format_document(path: String, text: String) -> Option {
+    log::info!("Trying to format document (rust): {}", path);
+    match format_schema(
+        &text,
+        FormatOptions {
+            indent_width: 2,
+            fail_on_unhandled_rule: false,
+        },
+    ) {
+        Ok(formatted) => {
+            log::info!("Formatted document: {}", formatted);
+            Some(formatted)
+        }
+        Err(e) => {
+            log::error!("Failed to format document: {} {:?}", path, e);
+            None
+        }
+    }
+}
diff --git a/engine/cli/src/commands.rs b/engine/cli/src/commands.rs
index 874ecb83e..273dea571 100644
--- a/engine/cli/src/commands.rs
+++ b/engine/cli/src/commands.rs
@@ -68,7 +68,12 @@ impl RuntimeCli {
                 args.from = BamlRuntime::parse_baml_src_path(&args.from)?;
                 t.block_on(async { args.run_async().await })
             }
-            Commands::Format(args) => args.run(),
+            Commands::Format(args) => {
+                // We deliberately don't apply parse_baml_src_path here
+                // see format.rs for more details
+                // args.from = BamlRuntime::parse_baml_src_path(&args.from)?;
+                args.run()
+            }
         }
     }
 }
diff --git a/engine/cli/src/format.rs b/engine/cli/src/format.rs
index fd077d3eb..974604c24 100644
--- a/engine/cli/src/format.rs
+++ b/engine/cli/src/format.rs
@@ -1,6 +1,7 @@
 use std::{fs, path::PathBuf};
 
 use anyhow::Result;
+use baml_runtime::{baml_src_files, BamlRuntime};
 use clap::Args;
 use internal_baml_core::internal_baml_schema_ast::{format_schema, FormatOptions};
 
@@ -8,24 +9,56 @@ use internal_baml_core::internal_baml_schema_ast::{format_schema, FormatOptions}
 pub struct FormatArgs {
     #[arg(long, help = "path/to/baml_src", default_value = "./baml_src")]
     pub from: PathBuf,
+
+    #[arg(
+        help = "Specific files to format. If none provided, formats all files in the baml_src directory"
+    )]
+    pub paths: Vec,
+
+    #[arg(
+        short = 'n',
+        long = "dry-run",
+        help = "Write formatter changes to stdout instead of files",
+        default_value = "false"
+    )]
+    pub dry_run: bool,
 }
 
 impl FormatArgs {
     pub fn run(&self) -> Result<()> {
-        let source = fs::read_to_string(&self.from)?;
-        let formatted = format_schema(
-            &source,
-            FormatOptions {
-                indent_width: 4,
-                fail_on_unhandled_rule: false,
-            },
-        )?;
-
-        let mut to = self.from.clone();
-        to.set_extension("formatted.baml");
-        fs::write(&to, formatted)?;
-
-        log::info!("Formatted {} to {}", self.from.display(), to.display());
+        let paths = if self.paths.is_empty() {
+            // Usually this is done in commands.rs, but fmt is a special case
+            // because it doesn't need to actually load the BAML runtime to parse
+            // BAML files.
+            let from = BamlRuntime::parse_baml_src_path(&self.from)?;
+            baml_src_files(&from)?
+        } else {
+            self.paths.clone()
+        };
+
+        for path in paths.iter() {
+            let source = fs::read_to_string(&path)?;
+            match format_schema(
+                &source,
+                FormatOptions {
+                    indent_width: 2,
+                    fail_on_unhandled_rule: false,
+                },
+            ) {
+                Ok(formatted) => {
+                    if self.dry_run {
+                        println!("{}", formatted);
+                    } else {
+                        fs::write(&path, formatted)?;
+                    }
+                }
+                Err(e) => {
+                    log::error!("Failed to format {}: {}", path.display(), e);
+                }
+            }
+        }
+
+        log::info!("Formatted {} files", paths.len());
 
         Ok(())
     }
diff --git a/tools/build b/tools/build
index 0bac5abf9..2402b8781 100755
--- a/tools/build
+++ b/tools/build
@@ -137,7 +137,7 @@ case "$_path" in
 
     if [ "$_watch_mode" -eq 1 ]; then
       npx nodemon \
-        --ext rs,hb,hbs,j2,toml,baml \
+        --ext rs,hb,hbs,j2,toml \
         --watch "${_repo_root}/engine" \
         --ignore 'target' \
         --exec "${command}"
@@ -157,7 +157,7 @@ case "$_path" in
 
     if [ "$_watch_mode" -eq 1 ]; then
       npx nodemon \
-        --ext rs,hb,hbs,j2,toml,baml \
+        --ext rs,hb,hbs,j2,toml \
         --watch "${_repo_root}/engine" \
         --ignore 'target/**' \
         --exec "${command}"
diff --git a/typescript/vscode-ext/packages/language-server/src/server.ts b/typescript/vscode-ext/packages/language-server/src/server.ts
index 1520d0057..771318138 100644
--- a/typescript/vscode-ext/packages/language-server/src/server.ts
+++ b/typescript/vscode-ext/packages/language-server/src/server.ts
@@ -140,7 +140,7 @@ export function startServer(options?: LSOptions): void {
       capabilities: {
         textDocumentSync: TextDocumentSyncKind.Full,
         definitionProvider: true,
-        documentFormattingProvider: false,
+        documentFormattingProvider: true,
         completionProvider: {
           resolveProvider: false,
           triggerCharacters: ['@', '"', '.'],
@@ -527,6 +527,21 @@ export function startServer(options?: LSOptions): void {
     }
   })
 
+  connection.onDocumentFormatting((params: DocumentFormattingParams) => {
+    try {
+      const doc = getDocument(params.textDocument.uri)
+      if (doc) {
+        const formatted = BamlWasm.format_document(doc.uri, doc.getText())
+        if (formatted) {
+          return [TextEdit.replace(Range.create(doc.positionAt(0), doc.positionAt(doc.getText().length)), formatted)]
+        }
+      }
+      return []
+    } catch (e) {
+      console.error(`Error occurred while formatting document:\n${e}`)
+    }
+  })
+
   connection.onCodeLens((params: CodeLensParams) => {
     try {
       const document = getDocument(params.textDocument.uri)
diff --git a/typescript/vscode-ext/packages/package.json b/typescript/vscode-ext/packages/package.json
index 676e5f684..4da434aa2 100644
--- a/typescript/vscode-ext/packages/package.json
+++ b/typescript/vscode-ext/packages/package.json
@@ -154,6 +154,11 @@
         "command": "baml.selectTestCase",
         "title": "Select Test Case",
         "category": "Baml"
+      },
+      {
+        "command": "baml.setDefaultFormatter",
+        "title": "Set Default Formatter",
+        "category": "Baml"
       }
     ]
   },
diff --git a/typescript/vscode-ext/packages/vscode/src/extension.ts b/typescript/vscode-ext/packages/vscode/src/extension.ts
index 7809e20bf..345b01d16 100644
--- a/typescript/vscode-ext/packages/vscode/src/extension.ts
+++ b/typescript/vscode-ext/packages/vscode/src/extension.ts
@@ -354,6 +354,12 @@ export function activate(context: vscode.ExtensionContext) {
     }
   })
 
+  const config = vscode.workspace.getConfiguration('editor', { languageId: 'baml' })
+  if (!config.get('defaultFormatter')) {
+    // TODO: once the BAML formatter is stable, we should auto-prompt people to set it as the default formatter.
+    // void vscode.commands.executeCommand('baml.setDefaultFormatter')
+  }
+
   // Listen for messages from the webview
 
   plugins.map(async (plugin) => {
@@ -394,7 +400,6 @@ export function deactivate(): void {
   }
   server?.close()
 }
-
 class DiagnosticCodeActionProvider implements vscode.CodeActionProvider {
   public provideCodeActions(
     document: vscode.TextDocument,
diff --git a/typescript/vscode-ext/packages/vscode/src/plugins/language-server/index.ts b/typescript/vscode-ext/packages/vscode/src/plugins/language-server/index.ts
index 5ab3a973b..88e40bb58 100644
--- a/typescript/vscode-ext/packages/vscode/src/plugins/language-server/index.ts
+++ b/typescript/vscode-ext/packages/vscode/src/plugins/language-server/index.ts
@@ -382,6 +382,49 @@ const plugin: BamlVSCodePlugin = {
           }
         },
       ),
+
+      commands.registerCommand('baml.setDefaultFormatter', async () => {
+        enum AutoFormatChoice {
+          Yes = 'Yes (always)',
+          OnlyInWorkspace = 'Yes (in workspace)',
+          No = 'No',
+        }
+        const selection = await vscode.window.showInformationMessage(
+          'Would you like to auto-format BAML files on save?',
+          AutoFormatChoice.Yes,
+          AutoFormatChoice.OnlyInWorkspace,
+          AutoFormatChoice.No,
+        )
+        if (selection === AutoFormatChoice.No) {
+          return
+        }
+
+        const config = vscode.workspace.getConfiguration('editor', { languageId: 'baml' })
+
+        const configTarget =
+          selection === AutoFormatChoice.Yes ? vscode.ConfigurationTarget.Global : vscode.ConfigurationTarget.Workspace
+        const overrideInLanguage = true
+
+        for (const [key, value] of Object.entries({
+          defaultFormatter: 'Boundary.baml-extension',
+          formatOnSave: true,
+        })) {
+          await config.update(key, value, configTarget, overrideInLanguage)
+        }
+
+        switch (selection) {
+          case AutoFormatChoice.Yes:
+            vscode.window.showInformationMessage(
+              'BAML files will now be auto-formatted on save (updated user settings).',
+            )
+            break
+          case AutoFormatChoice.OnlyInWorkspace:
+            vscode.window.showInformationMessage(
+              'BAML files will now be auto-formatted on save (updated workspace settings).',
+            )
+            break
+        }
+      }),
     )
 
     activateClient(context, serverOptions, clientOptions)

From cdc1838c114fd4d13e032da9cf7312aa55a8a889 Mon Sep 17 00:00:00 2001
From: aaronvg 
Date: Sun, 15 Dec 2024 19:47:20 -0800
Subject: [PATCH 09/11] Fix windows generation through vscode always outputting
 to the root workspace directory if the path was ../ (#1247)

The issue for windows is that `g.output_dir` is always /baml_client when
the user set it to `../`. Rather than have rust try to do fancy things
like resolve the output directory (which doesn't seem to work in wasm in
windows), give VSCode the relative path to baml_src, since vscode can
build it from the project.path




> [!IMPORTANT]
> Fixes file generation path issue in `baml_project_manager.ts` and
updates `dunce` package version in `Cargo.lock`.
>
>   - **Behavior**:
> - Fixes file generation path issue in `baml_project_manager.ts` by
using `output_dir_relative_to_baml_src` for output directory.
>     - Logs output directory paths for debugging.
>   - **Dependencies**:
> - Updates `dunce` package version from `1.0.4` to `1.0.5` in
`Cargo.lock`.
>
> This description was created by [Ellipsis](https://www.ellipsis.dev?ref=BoundaryML%2Fbaml&utm_source=github&utm_medium=referral)
for 594a4cd45d95f3a32f7abeb12278fd09a7be7774. It will automatically
update as commits are pushed.



---
 engine/Cargo.lock                                |  4 ++--
 .../src/runtime_wasm/generator.rs                |  6 ++++++
 engine/language_client_codegen/Cargo.toml        |  2 +-
 .../src/lib/baml_project_manager.ts              | 16 +++++++++++-----
 4 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/engine/Cargo.lock b/engine/Cargo.lock
index 5006542f1..61c17467d 100644
--- a/engine/Cargo.lock
+++ b/engine/Cargo.lock
@@ -1680,9 +1680,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
 
 [[package]]
 name = "dunce"
-version = "1.0.4"
+version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
+checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
 
 [[package]]
 name = "either"
diff --git a/engine/baml-schema-wasm/src/runtime_wasm/generator.rs b/engine/baml-schema-wasm/src/runtime_wasm/generator.rs
index 8a2b6cfd4..666c9f10e 100644
--- a/engine/baml-schema-wasm/src/runtime_wasm/generator.rs
+++ b/engine/baml-schema-wasm/src/runtime_wasm/generator.rs
@@ -6,6 +6,8 @@ pub struct WasmGeneratorOutput {
     #[wasm_bindgen(readonly)]
     pub output_dir: String,
     #[wasm_bindgen(readonly)]
+    pub output_dir_relative_to_baml_src: String,
+    #[wasm_bindgen(readonly)]
     pub files: Vec,
 }
 
@@ -22,6 +24,10 @@ impl Into for GenerateOutput {
     fn into(self) -> WasmGeneratorOutput {
         WasmGeneratorOutput {
             output_dir: self.output_dir_full.to_string_lossy().to_string(),
+            output_dir_relative_to_baml_src: self
+                .output_dir_shorthand
+                .to_string_lossy()
+                .to_string(),
             files: self
                 .files
                 .into_iter()
diff --git a/engine/language_client_codegen/Cargo.toml b/engine/language_client_codegen/Cargo.toml
index 981b0a899..28ad655d8 100644
--- a/engine/language_client_codegen/Cargo.toml
+++ b/engine/language_client_codegen/Cargo.toml
@@ -30,4 +30,4 @@ sugar_path = "1.2.0"
 walkdir.workspace = true
 semver = "1.0.23"
 colored = "2.1.0"
-itertools = "0.13.0"
+itertools = "0.13.0"
\ No newline at end of file
diff --git a/typescript/vscode-ext/packages/language-server/src/lib/baml_project_manager.ts b/typescript/vscode-ext/packages/language-server/src/lib/baml_project_manager.ts
index 5ccae611c..43f943257 100644
--- a/typescript/vscode-ext/packages/language-server/src/lib/baml_project_manager.ts
+++ b/typescript/vscode-ext/packages/language-server/src/lib/baml_project_manager.ts
@@ -371,6 +371,11 @@ class Project {
           // Creating the tmpdir next to the output dir can cause some weird issues with vscode, if we recover
           // from an error and delete the tmpdir - vscode's explorer UI will still show baml_client.tmp even
           // though it doesn't exist anymore, and vscode has no good way of letting the user purge it from the UI
+          console.log(`outputdir ${g.output_dir}`)
+          console.log(`relative output dir ${g.output_dir_relative_to_baml_src}`)
+
+          const out_dir = path.join(this.rootPath(), g.output_dir_relative_to_baml_src)
+
           const tmpDir = path.join(path.dirname(g.output_dir), path.basename(g.output_dir) + '.tmp')
           const backupDir = path.join(path.dirname(g.output_dir), path.basename(g.output_dir) + '.bak')
 
@@ -386,8 +391,8 @@ class Project {
           if (existsSync(backupDir)) {
             await rm(backupDir, { recursive: true, force: true })
           }
-          if (existsSync(g.output_dir)) {
-            const contents = await readdir(g.output_dir, { withFileTypes: true })
+          if (existsSync(out_dir)) {
+            const contents = await readdir(out_dir, { withFileTypes: true })
             const contentsWithSafeToRemove = await Promise.all(
               contents.map(async (c) => {
                 if (c.isDirectory()) {
@@ -414,15 +419,16 @@ class Project {
                 `Output dir ${g.output_dir} contains this file(s) not generated by BAML: ${notSafeToRemove.join(', ')}`,
               )
             }
-            await rename(g.output_dir, backupDir)
+            await rename(out_dir, backupDir)
           }
-          await rename(tmpDir, g.output_dir)
+          await rename(tmpDir, out_dir)
 
           try {
             // some filewatchers don't trigger unless the file is touched. Creating the new dir alone doesn't work.
             // if we remove this, TS will still have the old types, and nextjs will not hot-reload.
             g.files.map((f) => {
-              const fpath = path.join(g.output_dir, f.path_in_output_dir)
+              const fpath = path.join(out_dir, f.path_in_output_dir)
+              console.log(`fpath ${fpath}`)
               const currentTime = new Date()
               const newTime = new Date(currentTime.getTime() + 100)
               utimes(fpath, newTime, newTime, (err) => {

From c62cef4949e1326c8da88dc46df762165c8f7b87 Mon Sep 17 00:00:00 2001
From: Ethan <36282608+etbyrd@users.noreply.github.com>
Date: Sun, 15 Dec 2024 20:09:25 -0800
Subject: [PATCH 10/11] "Switching LLMs" Docs Fixes (#1244)

Two updates on
https://docs.boundaryml.com/guide/baml-basics/switching-llms :

1. The link in the final paragraph for `provider documentation` points
to https://docs.boundaryml.com/guide/baml-basics/switching-llms#fields.
This seems like an error because in the first paragraph, `LLM Providers
Reference` points to
https://docs.boundaryml.com/ref/llm-client-providers/open-ai.

2. The `retry policies` is a deadlink. This updates it
https://docs.boundaryml.com/ref/llm-client-strategies/retry-policy

I would test it to be 100% but it looks like I need a Fern account?


----

> [!IMPORTANT]
> Fixes incorrect links in `switching-llms.mdx` for provider
documentation and retry policies.
>
>   - **Documentation Fixes**:
> - Corrects `provider documentation` link in `switching-llms.mdx` to
point to `/ref/llm-client-providers/open-ai`.
> - Updates `retry policies` link in `switching-llms.mdx` to
`/ref/llm-client-strategies/retry-policy`.
>
> This description was created by [Ellipsis](https://www.ellipsis.dev?ref=BoundaryML%2Fbaml&utm_source=github&utm_medium=referral)
for 2bba72389e7104d2463cd91e50e2875d46c5f8e7. It will automatically
update as commits are pushed.



---------

Co-authored-by: aaronvg 
---
 fern/01-guide/04-baml-basics/switching-llms.mdx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fern/01-guide/04-baml-basics/switching-llms.mdx b/fern/01-guide/04-baml-basics/switching-llms.mdx
index ccb950ac3..92ffc2049 100644
--- a/fern/01-guide/04-baml-basics/switching-llms.mdx
+++ b/fern/01-guide/04-baml-basics/switching-llms.mdx
@@ -50,8 +50,8 @@ function MakeHaiku(topic: string) -> string {
 }
 ```
 
-Consult the [provider documentation](#fields) for a list of supported providers
-and models, the default options, and setting [retry policies](/docs/reference/retry-policy).
+Consult the [provider documentation](/ref/llm-client-providers/open-ai) for a list of supported providers
+and models, the default options, and setting [retry policies](/ref/llm-client-strategies/retry-policy).
 
 
 If you want to specify which client to use at runtime, in your Python/TS/Ruby code,

From 20ec1345d3b8e26cddea9eccacc1420bdb3be804 Mon Sep 17 00:00:00 2001
From: aaronvg 
Date: Mon, 16 Dec 2024 17:12:54 -0800
Subject: [PATCH 11/11] Add tests for azure and failure scenarios (#1250)




> [!IMPORTANT]
> Add tests for Azure functionality and failure scenarios in
`integ-tests.test.ts`, including streaming and non-streaming cases.
>
>   - **Tests**:
> - Add `should support azure` and `should support azure streaming`
tests in `integ-tests.test.ts`.
> - Add `should fail if azure is not configured` test in
`integ-tests.test.ts`.
> - Comment out `should fail if azure is not configured streaming` test
in `integ-tests.test.ts`.
>   - **Behavior**:
>     - `should support azure` tests Azure functionality.
> - `should support azure streaming` tests Azure streaming
functionality.
> - `should fail if azure is not configured` tests Azure failure
scenario.
> - `should fail if azure is not configured streaming` is commented out,
indicating incomplete or failing test.
>   - **Misc**:
>     - Update `test-report.html` to reflect new test results.
>
> This description was created by [Ellipsis](https://www.ellipsis.dev?ref=BoundaryML%2Fbaml&utm_source=github&utm_medium=referral)
for 504d853590ec823b953f0fd1800e7babfd341ef3. It will automatically
update as commits are pushed.



---
 .../test-files/providers/providers.baml       |  15 +
 .../python/baml_client/async_client.py        |  53 ++
 integ-tests/python/baml_client/inlinedbaml.py |   2 +-
 integ-tests/python/baml_client/sync_client.py |  53 ++
 integ-tests/ruby/baml_client/client.rb        |  67 ++
 integ-tests/ruby/baml_client/inlined.rb       |   2 +-
 .../typescript/baml_client/async_client.ts    |  58 ++
 .../typescript/baml_client/inlinedbaml.ts     |   2 +-
 .../typescript/baml_client/sync_client.ts     |  25 +
 integ-tests/typescript/test-report.html       | 663 +-----------------
 .../typescript/tests/integ-tests.test.ts      |  35 +
 11 files changed, 326 insertions(+), 649 deletions(-)

diff --git a/integ-tests/baml_src/test-files/providers/providers.baml b/integ-tests/baml_src/test-files/providers/providers.baml
index d8225b21d..897f35bee 100644
--- a/integ-tests/baml_src/test-files/providers/providers.baml
+++ b/integ-tests/baml_src/test-files/providers/providers.baml
@@ -26,6 +26,21 @@ function TestAzure(input: string) -> string {
   "#
 }
 
+client GPT35AzureFailed {
+  provider azure-openai
+  options {
+    resource_name "west-us-azure-baml-incorrect-suffix"
+    deployment_id "gpt-35-turbo-default"
+    api_key env.AZURE_OPENAI_API_KEY
+  }
+}
+function TestAzureFailure(input: string) -> string {
+  client GPT35AzureFailed
+  prompt #"
+    Write a nice haiku about {{ input }}
+  "#
+}
+
 function TestOllama(input: string) -> string {
   client Ollama
   prompt #"
diff --git a/integ-tests/python/baml_client/async_client.py b/integ-tests/python/baml_client/async_client.py
index ae4f20aa7..cdb5c8f63 100644
--- a/integ-tests/python/baml_client/async_client.py
+++ b/integ-tests/python/baml_client/async_client.py
@@ -2005,6 +2005,29 @@ async def TestAzure(
       )
       return cast(str, raw.cast_to(types, types))
     
+    async def TestAzureFailure(
+        self,
+        input: str,
+        baml_options: BamlCallOptions = {},
+    ) -> str:
+      __tb__ = baml_options.get("tb", None)
+      if __tb__ is not None:
+        tb = __tb__._tb # type: ignore (we know how to use this private attribute)
+      else:
+        tb = None
+      __cr__ = baml_options.get("client_registry", None)
+
+      raw = await self.__runtime.call_function(
+        "TestAzureFailure",
+        {
+          "input": input,
+        },
+        self.__ctx_manager.get(),
+        tb,
+        __cr__,
+      )
+      return cast(str, raw.cast_to(types, types))
+    
     async def TestCaching(
         self,
         input: str,not_cached: str,
@@ -5332,6 +5355,36 @@ def TestAzure(
         self.__ctx_manager.get(),
       )
     
+    def TestAzureFailure(
+        self,
+        input: str,
+        baml_options: BamlCallOptions = {},
+    ) -> baml_py.BamlStream[Optional[str], str]:
+      __tb__ = baml_options.get("tb", None)
+      if __tb__ is not None:
+        tb = __tb__._tb # type: ignore (we know how to use this private attribute)
+      else:
+        tb = None
+      __cr__ = baml_options.get("client_registry", None)
+
+      raw = self.__runtime.stream_function(
+        "TestAzureFailure",
+        {
+          "input": input,
+        },
+        None,
+        self.__ctx_manager.get(),
+        tb,
+        __cr__,
+      )
+
+      return baml_py.BamlStream[Optional[str], str](
+        raw,
+        lambda x: cast(Optional[str], x.cast_to(types, partial_types)),
+        lambda x: cast(str, x.cast_to(types, types)),
+        self.__ctx_manager.get(),
+      )
+    
     def TestCaching(
         self,
         input: str,not_cached: str,
diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py
index 7af9855cb..c905a9c99 100644
--- a/integ-tests/python/baml_client/inlinedbaml.py
+++ b/integ-tests/python/baml_client/inlinedbaml.py
@@ -86,7 +86,7 @@
     "test-files/functions/prompts/no-chat-messages.baml": "\n\nfunction PromptTestClaude(input: string) -> string {\n  client Sonnet\n  prompt #\"\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\n\nfunction PromptTestStreaming(input: string) -> string {\n  client GPT35\n  prompt #\"\n    Tell me a short story about {{ input }}\n  \"#\n}\n\ntest TestName {\n  functions [PromptTestStreaming]\n  args {\n    input #\"\n      hello world\n    \"#\n  }\n}\n",
     "test-files/functions/prompts/with-chat-messages.baml": "\nfunction PromptTestOpenAIChat(input: string) -> string {\n  client GPT35\n  prompt #\"\n    {{ _.role(\"system\") }}\n    You are an assistant that always responds in a very excited way with emojis and also outputs this word 4 times after giving a response: {{ input }}\n    \n    {{ _.role(\"user\") }}\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestOpenAIChatNoSystem(input: string) -> string {\n  client GPT35\n  prompt #\"\n    You are an assistant that always responds in a very excited way with emojis and also outputs this word 4 times after giving a response: {{ input }}\n    \n    {{ _.role(\"user\") }}\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestClaudeChat(input: string) -> string {\n  client Claude\n  prompt #\"\n    {{ _.role(\"system\") }}\n    You are an assistant that always responds in a very excited way with emojis and also outputs this word 4 times after giving a response: {{ input }}\n    \n    {{ _.role(\"user\") }}\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestClaudeChatNoSystem(input: string) -> string {\n  client Claude\n  prompt #\"\n    You are an assistant that always responds in a very excited way with emojis and also outputs this word 4 times after giving a response: {{ input }}\n    \n    {{ _.role(\"user\") }}\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\ntest TestSystemAndNonSystemChat1 {\n  functions [PromptTestClaude, PromptTestOpenAI, PromptTestOpenAIChat, PromptTestOpenAIChatNoSystem, PromptTestClaudeChat, PromptTestClaudeChatNoSystem]\n  args {\n    input \"cats\"\n  }\n}\n\ntest TestSystemAndNonSystemChat2 {\n  functions [PromptTestClaude, PromptTestOpenAI, PromptTestOpenAIChat, PromptTestOpenAIChatNoSystem, PromptTestClaudeChat, PromptTestClaudeChatNoSystem]\n  args {\n    input \"lion\"\n  }\n}",
     "test-files/functions/v2/basic.baml": "\n\nfunction ExtractResume2(resume: string) -> Resume {\n    client GPT4\n    prompt #\"\n        {{ _.role('system') }}\n\n        Extract the following information from the resume:\n\n        Resume:\n        <<<<\n        {{ resume }}\n        <<<<\n\n        Output JSON schema:\n        {{ ctx.output_format }}\n\n        JSON:\n    \"#\n}\n\n\nclass WithReasoning {\n    value string\n    reasoning string @description(#\"\n        Why the value is a good fit.\n    \"#)\n}\n\n\nclass SearchParams {\n    dateRange int? @description(#\"\n        In ISO duration format, e.g. P1Y2M10D.\n    \"#)\n    location string[]\n    jobTitle WithReasoning? @description(#\"\n        An exact job title, not a general category.\n    \"#)\n    company WithReasoning? @description(#\"\n        The exact name of the company, not a product or service.\n    \"#)\n    description WithReasoning[] @description(#\"\n        Any specific projects or features the user is looking for.\n    \"#)\n    tags (Tag | string)[]\n}\n\nenum Tag {\n    Security\n    AI\n    Blockchain\n}\n\nfunction GetQuery(query: string) -> SearchParams {\n    client GPT4\n    prompt #\"\n        Extract the following information from the query:\n\n        Query:\n        <<<<\n        {{ query }}\n        <<<<\n\n        OUTPUT_JSON_SCHEMA:\n        {{ ctx.output_format }}\n\n        Before OUTPUT_JSON_SCHEMA, list 5 intentions the user may have.\n        --- EXAMPLES ---\n        1. \n        2. \n        3. \n        4. \n        5. \n\n        {\n            ... // OUTPUT_JSON_SCHEMA\n        }\n    \"#\n}\n\nclass RaysData {\n    dataType DataType\n    value Resume | Event\n}\n\nenum DataType {\n    Resume\n    Event\n}\n\nclass Event {\n    title string\n    date string\n    location string\n    description string\n}\n\nfunction GetDataType(text: string) -> RaysData {\n    client GPT4\n    prompt #\"\n        Extract the relevant info.\n\n        Text:\n        <<<<\n        {{ text }}\n        <<<<\n\n        Output JSON schema:\n        {{ ctx.output_format }}\n\n        JSON:\n    \"#\n}",
-    "test-files/providers/providers.baml": "function TestAnthropic(input: string) -> string {\n  client Claude\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestOpenAI(input: string) -> string {\n  client GPT35\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestOpenAILegacyProvider(input: string) -> string {\n  client GPT35LegacyProvider\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestAzure(input: string) -> string {\n  client GPT35Azure\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestOllama(input: string) -> string {\n  client Ollama\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestGemini(input: string) -> string {\n  client Gemini\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestVertex(input: string) -> string {\n  client Vertex\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n\n}\n\nfunction TestAws(input: string) -> string {\n  client AwsBedrock\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestAwsInvalidRegion(input: string) -> string {\n  client AwsBedrockInvalidRegion\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestOpenAIShorthand(input: string) -> string {\n  client \"openai/gpt-4o-mini\"\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestAnthropicShorthand(input: string) -> string {\n  client \"anthropic/claude-3-haiku-20240307\"\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\ntest TestProvider {\n  functions [\n    TestAnthropic, TestVertex, PromptTestOpenAI, TestAzure, TestOllama, TestGemini, TestAws,\n    TestAwsInvalidRegion,\n    TestOpenAIShorthand,\n    TestAnthropicShorthand\n  ]\n  args {\n    input \"Donkey kong and peanut butter\"\n  }\n}\n\n\nfunction TestCaching(input: string, not_cached: string) -> string {\n  client ClaudeWithCaching\n  prompt #\"\n    {{ _.role('system', cache_control={\"type\": \"ephemeral\"}) }}\n    Generate the following story\n    {{ input }}\n\n    {# Haiku require 2048 tokens to cache -#}\n    {{ input }}\n\n    {{ _.role('user') }}\n    {{ not_cached }}\n  \"#\n}\n\ntest TestName {\n  functions [TestCaching]\n  args {\n    input #\"\nIn a near-future society where dreams have become a tradable commodity and shared experience, a lonely and socially awkward teenager named Alex discovers they possess a rare and powerful ability to not only view but also manipulate the dreams of others. Initially thrilled by this newfound power, Alex begins subtly altering the dreams of classmates and family members, helping them overcome fears, boost confidence, or experience fantastical adventures. As Alex's skills grow, so does their influence. They start selling premium dream experiences on the black market, crafting intricate and addictive dreamscapes for wealthy clients. However, the line between dream and reality begins to blur for those exposed to Alex's creations. Some clients struggle to differentiate between their true memories and the artificial ones implanted by Alex's dream manipulation.\n\nComplications arise when a mysterious government agency takes notice of Alex's unique abilities. They offer Alex a chance to use their gift for \"the greater good,\" hinting at applications in therapy, criminal rehabilitation, and even national security. Simultaneously, an underground resistance movement reaches out, warning Alex about the dangers of dream manipulation and the potential for mass control and exploitation. Caught between these opposing forces, Alex must navigate a complex web of ethical dilemmas. They grapple with questions of free will, the nature of consciousness, and the responsibility that comes with having power over people's minds. As the consequences of their actions spiral outward, affecting the lives of loved ones and strangers alike, Alex is forced to confront the true nature of their ability and decide how—or if—it should be used.\n\nThe story explores themes of identity, the subconscious mind, the ethics of technology, and the power of imagination. It delves into the potential consequences of a world where our most private thoughts and experiences are no longer truly our own, and examines the fine line between helping others and manipulating them for personal gain or a perceived greater good. The narrative further expands on the societal implications of such abilities, questioning the moral boundaries of altering consciousness and the potential for abuse in a world where dreams can be commodified. It challenges the reader to consider the impact of technology on personal autonomy and the ethical responsibilities of those who wield such power.\n\nAs Alex's journey unfolds, they encounter various individuals whose lives have been touched by their dream manipulations, each presenting a unique perspective on the ethical quandaries at hand. From a classmate who gains newfound confidence to a wealthy client who becomes addicted to the dreamscapes, the ripple effects of Alex's actions are profound and far-reaching. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement highlights the dangers of unchecked power and the importance of safeguarding individual freedoms.\n\nUltimately, Alex's story is one of self-discovery and moral reckoning, as they must decide whether to embrace their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their fight for freedom and autonomy. The narrative invites readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also explores the psychological impact on Alex, who must deal with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.\n\nThe story further examines the technological advancements that have made dream manipulation possible, questioning the role of innovation in society and the potential for both progress and peril. It considers the societal divide between those who can afford to buy enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more entangled in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.\n\nIn 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.\n\nIn 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.\n    \"#\n    not_cached #\"\n      hello world\n    \"#\n  }\n}\n",
+    "test-files/providers/providers.baml": "function TestAnthropic(input: string) -> string {\n  client Claude\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestOpenAI(input: string) -> string {\n  client GPT35\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestOpenAILegacyProvider(input: string) -> string {\n  client GPT35LegacyProvider\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestAzure(input: string) -> string {\n  client GPT35Azure\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nclient GPT35AzureFailed {\n  provider azure-openai\n  options {\n    resource_name \"west-us-azure-baml-incorrect-suffix\"\n    deployment_id \"gpt-35-turbo-default\"\n    api_key env.AZURE_OPENAI_API_KEY\n  }\n}\nfunction TestAzureFailure(input: string) -> string {\n  client GPT35AzureFailed\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestOllama(input: string) -> string {\n  client Ollama\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestGemini(input: string) -> string {\n  client Gemini\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestVertex(input: string) -> string {\n  client Vertex\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n\n}\n\nfunction TestAws(input: string) -> string {\n  client AwsBedrock\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestAwsInvalidRegion(input: string) -> string {\n  client AwsBedrockInvalidRegion\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestOpenAIShorthand(input: string) -> string {\n  client \"openai/gpt-4o-mini\"\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestAnthropicShorthand(input: string) -> string {\n  client \"anthropic/claude-3-haiku-20240307\"\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\ntest TestProvider {\n  functions [\n    TestAnthropic, TestVertex, PromptTestOpenAI, TestAzure, TestOllama, TestGemini, TestAws,\n    TestAwsInvalidRegion,\n    TestOpenAIShorthand,\n    TestAnthropicShorthand\n  ]\n  args {\n    input \"Donkey kong and peanut butter\"\n  }\n}\n\n\nfunction TestCaching(input: string, not_cached: string) -> string {\n  client ClaudeWithCaching\n  prompt #\"\n    {{ _.role('system', cache_control={\"type\": \"ephemeral\"}) }}\n    Generate the following story\n    {{ input }}\n\n    {# Haiku require 2048 tokens to cache -#}\n    {{ input }}\n\n    {{ _.role('user') }}\n    {{ not_cached }}\n  \"#\n}\n\ntest TestName {\n  functions [TestCaching]\n  args {\n    input #\"\nIn a near-future society where dreams have become a tradable commodity and shared experience, a lonely and socially awkward teenager named Alex discovers they possess a rare and powerful ability to not only view but also manipulate the dreams of others. Initially thrilled by this newfound power, Alex begins subtly altering the dreams of classmates and family members, helping them overcome fears, boost confidence, or experience fantastical adventures. As Alex's skills grow, so does their influence. They start selling premium dream experiences on the black market, crafting intricate and addictive dreamscapes for wealthy clients. However, the line between dream and reality begins to blur for those exposed to Alex's creations. Some clients struggle to differentiate between their true memories and the artificial ones implanted by Alex's dream manipulation.\n\nComplications arise when a mysterious government agency takes notice of Alex's unique abilities. They offer Alex a chance to use their gift for \"the greater good,\" hinting at applications in therapy, criminal rehabilitation, and even national security. Simultaneously, an underground resistance movement reaches out, warning Alex about the dangers of dream manipulation and the potential for mass control and exploitation. Caught between these opposing forces, Alex must navigate a complex web of ethical dilemmas. They grapple with questions of free will, the nature of consciousness, and the responsibility that comes with having power over people's minds. As the consequences of their actions spiral outward, affecting the lives of loved ones and strangers alike, Alex is forced to confront the true nature of their ability and decide how—or if—it should be used.\n\nThe story explores themes of identity, the subconscious mind, the ethics of technology, and the power of imagination. It delves into the potential consequences of a world where our most private thoughts and experiences are no longer truly our own, and examines the fine line between helping others and manipulating them for personal gain or a perceived greater good. The narrative further expands on the societal implications of such abilities, questioning the moral boundaries of altering consciousness and the potential for abuse in a world where dreams can be commodified. It challenges the reader to consider the impact of technology on personal autonomy and the ethical responsibilities of those who wield such power.\n\nAs Alex's journey unfolds, they encounter various individuals whose lives have been touched by their dream manipulations, each presenting a unique perspective on the ethical quandaries at hand. From a classmate who gains newfound confidence to a wealthy client who becomes addicted to the dreamscapes, the ripple effects of Alex's actions are profound and far-reaching. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement highlights the dangers of unchecked power and the importance of safeguarding individual freedoms.\n\nUltimately, Alex's story is one of self-discovery and moral reckoning, as they must decide whether to embrace their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their fight for freedom and autonomy. The narrative invites readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also explores the psychological impact on Alex, who must deal with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.\n\nThe story further examines the technological advancements that have made dream manipulation possible, questioning the role of innovation in society and the potential for both progress and peril. It considers the societal divide between those who can afford to buy enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more entangled in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.\n\nIn 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.\n\nIn 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.\n    \"#\n    not_cached #\"\n      hello world\n    \"#\n  }\n}\n",
     "test-files/strategies/fallback-shorthand.baml": "\nclient FallbackToShorthand {\n  provider fallback\n  options {\n    strategy [\n      \"openai/does-not-exist\",\n      \"openai/gpt-4o-mini\"\n    ]\n  }\n}\n\n\nfunction TestFallbackToShorthand(input: string) -> string {\n  client FallbackToShorthand\n  // TODO make it return the client name instead\n  prompt #\"\n    Say a haiku about {{input}}.\n  \"#\n}\n\ntest TestProvider_FallbackToShorthand {\n  functions [\n    TestFallbackToShorthand\n  ]\n  args {\n    input \"Donkey kong and peanut butter\"\n  }\n}\n",
     "test-files/strategies/fallback.baml": "// Happy path fallbacks.\nclient FaultyClient {\n  provider openai\n  options {\n    model unknown-model\n    api_key env.OPENAI_API_KEY\n  }\n}\n\n\nclient FallbackClient {\n  provider fallback\n  options {\n    // first 2 clients are expected to fail.\n    strategy [\n      FaultyClient,\n      RetryClientConstant,\n      GPT35\n      Gemini\n\n    ]\n  }\n}\n\nfunction TestFallbackClient() -> string {\n  client FallbackClient\n  // TODO make it return the client name instead\n  prompt #\"\n    Say a haiku about mexico.\n  \"#\n}\n\n// Fallbacks should fail gracefully.\nclient FaultyAzureClient {\n  provider azure-openai\n  options {\n    model unknown-model\n    resource_name \"unknown-resource-id\"\n    deployment_id \"unknown-deployment-id\"\n  }\n}\n\nclient SingleFallbackClient {\n  provider fallback\n  options {\n    // first 2 clients are expected to fail.\n    strategy [\n      FaultyAzureClient\n    ]\n  }\n}\n\nfunction TestSingleFallbackClient() -> string {\n  client SingleFallbackClient\n  // TODO make it return the client name instead\n  prompt #\"\n    Say a haiku about mexico.\n  \"#\n}\n",
     "test-files/strategies/retry.baml": "\nretry_policy Exponential {\n  max_retries 3\n  strategy {\n    type exponential_backoff\n  }\n}\n\nretry_policy Constant {\n  max_retries 3\n  strategy {\n    type constant_delay\n    delay_ms 100\n  }\n}\n\nclient RetryClientConstant {\n  provider openai\n  retry_policy Constant\n  options {\n    model \"gpt-3.5-turbo\"\n    api_key \"blah\"\n  }\n}\n\nclient RetryClientExponential {\n  provider openai\n  retry_policy Exponential\n  options {\n    model \"gpt-3.5-turbo\"\n    api_key \"blahh\"\n  }\n}\n\nfunction TestRetryConstant() -> string {\n  client RetryClientConstant\n  prompt #\"\n    Say a haiku\n  \"#\n}\n\nfunction TestRetryExponential() -> string {\n  client RetryClientExponential\n  prompt #\"\n    Say a haiku\n  \"#\n}\n",
diff --git a/integ-tests/python/baml_client/sync_client.py b/integ-tests/python/baml_client/sync_client.py
index d1f667c70..9746f9d6c 100644
--- a/integ-tests/python/baml_client/sync_client.py
+++ b/integ-tests/python/baml_client/sync_client.py
@@ -2002,6 +2002,29 @@ def TestAzure(
       )
       return cast(str, raw.cast_to(types, types))
     
+    def TestAzureFailure(
+        self,
+        input: str,
+        baml_options: BamlCallOptions = {},
+    ) -> str:
+      __tb__ = baml_options.get("tb", None)
+      if __tb__ is not None:
+        tb = __tb__._tb # type: ignore (we know how to use this private attribute)
+      else:
+        tb = None
+      __cr__ = baml_options.get("client_registry", None)
+
+      raw = self.__runtime.call_function_sync(
+        "TestAzureFailure",
+        {
+          "input": input,
+        },
+        self.__ctx_manager.get(),
+        tb,
+        __cr__,
+      )
+      return cast(str, raw.cast_to(types, types))
+    
     def TestCaching(
         self,
         input: str,not_cached: str,
@@ -5330,6 +5353,36 @@ def TestAzure(
         self.__ctx_manager.get(),
       )
     
+    def TestAzureFailure(
+        self,
+        input: str,
+        baml_options: BamlCallOptions = {},
+    ) -> baml_py.BamlSyncStream[Optional[str], str]:
+      __tb__ = baml_options.get("tb", None)
+      if __tb__ is not None:
+        tb = __tb__._tb # type: ignore (we know how to use this private attribute)
+      else:
+        tb = None
+      __cr__ = baml_options.get("client_registry", None)
+
+      raw = self.__runtime.stream_function_sync(
+        "TestAzureFailure",
+        {
+          "input": input,
+        },
+        None,
+        self.__ctx_manager.get(),
+        tb,
+        __cr__,
+      )
+
+      return baml_py.BamlSyncStream[Optional[str], str](
+        raw,
+        lambda x: cast(Optional[str], x.cast_to(types, partial_types)),
+        lambda x: cast(str, x.cast_to(types, types)),
+        self.__ctx_manager.get(),
+      )
+    
     def TestCaching(
         self,
         input: str,not_cached: str,
diff --git a/integ-tests/ruby/baml_client/client.rb b/integ-tests/ruby/baml_client/client.rb
index 0bf846671..4690e91e3 100644
--- a/integ-tests/ruby/baml_client/client.rb
+++ b/integ-tests/ruby/baml_client/client.rb
@@ -2770,6 +2770,38 @@ def TestAzure(
       (raw.parsed_using_types(Baml::Types))
     end
 
+    sig {
+      params(
+        varargs: T.untyped,
+        input: String,
+        baml_options: T::Hash[Symbol, T.any(Baml::TypeBuilder, Baml::ClientRegistry)]
+      ).returns(String)
+    }
+    def TestAzureFailure(
+        *varargs,
+        input:,
+        baml_options: {}
+    )
+      if varargs.any?
+        
+        raise ArgumentError.new("TestAzureFailure may only be called with keyword arguments")
+      end
+      if (baml_options.keys - [:client_registry, :tb]).any?
+        raise ArgumentError.new("Received unknown keys in baml_options (valid keys: :client_registry, :tb): #{baml_options.keys - [:client_registry, :tb]}")
+      end
+
+      raw = @runtime.call_function(
+        "TestAzureFailure",
+        {
+          input: input,
+        },
+        @ctx_manager,
+        baml_options[:tb]&.instance_variable_get(:@registry),
+        baml_options[:client_registry],
+      )
+      (raw.parsed_using_types(Baml::Types))
+    end
+
     sig {
       params(
         varargs: T.untyped,
@@ -6814,6 +6846,41 @@ def TestAzure(
       )
     end
 
+    sig {
+      params(
+        varargs: T.untyped,
+        input: String,
+        baml_options: T::Hash[Symbol, T.any(Baml::TypeBuilder, Baml::ClientRegistry)]
+      ).returns(Baml::BamlStream[String])
+    }
+    def TestAzureFailure(
+        *varargs,
+        input:,
+        baml_options: {}
+    )
+      if varargs.any?
+        
+        raise ArgumentError.new("TestAzureFailure may only be called with keyword arguments")
+      end
+      if (baml_options.keys - [:client_registry, :tb]).any?
+        raise ArgumentError.new("Received unknown keys in baml_options (valid keys: :client_registry, :tb): #{baml_options.keys - [:client_registry, :tb]}")
+      end
+
+      raw = @runtime.stream_function(
+        "TestAzureFailure",
+        {
+          input: input,
+        },
+        @ctx_manager,
+        baml_options[:tb]&.instance_variable_get(:@registry),
+        baml_options[:client_registry],
+      )
+      Baml::BamlStream[T.nilable(String), String].new(
+        ffi_stream: raw,
+        ctx_manager: @ctx_manager
+      )
+    end
+
     sig {
       params(
         varargs: T.untyped,
diff --git a/integ-tests/ruby/baml_client/inlined.rb b/integ-tests/ruby/baml_client/inlined.rb
index a24270955..158464cf2 100644
--- a/integ-tests/ruby/baml_client/inlined.rb
+++ b/integ-tests/ruby/baml_client/inlined.rb
@@ -86,7 +86,7 @@ module Inlined
         "test-files/functions/prompts/no-chat-messages.baml" => "\n\nfunction PromptTestClaude(input: string) -> string {\n  client Sonnet\n  prompt #\"\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\n\nfunction PromptTestStreaming(input: string) -> string {\n  client GPT35\n  prompt #\"\n    Tell me a short story about {{ input }}\n  \"#\n}\n\ntest TestName {\n  functions [PromptTestStreaming]\n  args {\n    input #\"\n      hello world\n    \"#\n  }\n}\n",
         "test-files/functions/prompts/with-chat-messages.baml" => "\nfunction PromptTestOpenAIChat(input: string) -> string {\n  client GPT35\n  prompt #\"\n    {{ _.role(\"system\") }}\n    You are an assistant that always responds in a very excited way with emojis and also outputs this word 4 times after giving a response: {{ input }}\n    \n    {{ _.role(\"user\") }}\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestOpenAIChatNoSystem(input: string) -> string {\n  client GPT35\n  prompt #\"\n    You are an assistant that always responds in a very excited way with emojis and also outputs this word 4 times after giving a response: {{ input }}\n    \n    {{ _.role(\"user\") }}\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestClaudeChat(input: string) -> string {\n  client Claude\n  prompt #\"\n    {{ _.role(\"system\") }}\n    You are an assistant that always responds in a very excited way with emojis and also outputs this word 4 times after giving a response: {{ input }}\n    \n    {{ _.role(\"user\") }}\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestClaudeChatNoSystem(input: string) -> string {\n  client Claude\n  prompt #\"\n    You are an assistant that always responds in a very excited way with emojis and also outputs this word 4 times after giving a response: {{ input }}\n    \n    {{ _.role(\"user\") }}\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\ntest TestSystemAndNonSystemChat1 {\n  functions [PromptTestClaude, PromptTestOpenAI, PromptTestOpenAIChat, PromptTestOpenAIChatNoSystem, PromptTestClaudeChat, PromptTestClaudeChatNoSystem]\n  args {\n    input \"cats\"\n  }\n}\n\ntest TestSystemAndNonSystemChat2 {\n  functions [PromptTestClaude, PromptTestOpenAI, PromptTestOpenAIChat, PromptTestOpenAIChatNoSystem, PromptTestClaudeChat, PromptTestClaudeChatNoSystem]\n  args {\n    input \"lion\"\n  }\n}",
         "test-files/functions/v2/basic.baml" => "\n\nfunction ExtractResume2(resume: string) -> Resume {\n    client GPT4\n    prompt #\"\n        {{ _.role('system') }}\n\n        Extract the following information from the resume:\n\n        Resume:\n        <<<<\n        {{ resume }}\n        <<<<\n\n        Output JSON schema:\n        {{ ctx.output_format }}\n\n        JSON:\n    \"#\n}\n\n\nclass WithReasoning {\n    value string\n    reasoning string @description(#\"\n        Why the value is a good fit.\n    \"#)\n}\n\n\nclass SearchParams {\n    dateRange int? @description(#\"\n        In ISO duration format, e.g. P1Y2M10D.\n    \"#)\n    location string[]\n    jobTitle WithReasoning? @description(#\"\n        An exact job title, not a general category.\n    \"#)\n    company WithReasoning? @description(#\"\n        The exact name of the company, not a product or service.\n    \"#)\n    description WithReasoning[] @description(#\"\n        Any specific projects or features the user is looking for.\n    \"#)\n    tags (Tag | string)[]\n}\n\nenum Tag {\n    Security\n    AI\n    Blockchain\n}\n\nfunction GetQuery(query: string) -> SearchParams {\n    client GPT4\n    prompt #\"\n        Extract the following information from the query:\n\n        Query:\n        <<<<\n        {{ query }}\n        <<<<\n\n        OUTPUT_JSON_SCHEMA:\n        {{ ctx.output_format }}\n\n        Before OUTPUT_JSON_SCHEMA, list 5 intentions the user may have.\n        --- EXAMPLES ---\n        1. \n        2. \n        3. \n        4. \n        5. \n\n        {\n            ... // OUTPUT_JSON_SCHEMA\n        }\n    \"#\n}\n\nclass RaysData {\n    dataType DataType\n    value Resume | Event\n}\n\nenum DataType {\n    Resume\n    Event\n}\n\nclass Event {\n    title string\n    date string\n    location string\n    description string\n}\n\nfunction GetDataType(text: string) -> RaysData {\n    client GPT4\n    prompt #\"\n        Extract the relevant info.\n\n        Text:\n        <<<<\n        {{ text }}\n        <<<<\n\n        Output JSON schema:\n        {{ ctx.output_format }}\n\n        JSON:\n    \"#\n}",
-        "test-files/providers/providers.baml" => "function TestAnthropic(input: string) -> string {\n  client Claude\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestOpenAI(input: string) -> string {\n  client GPT35\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestOpenAILegacyProvider(input: string) -> string {\n  client GPT35LegacyProvider\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestAzure(input: string) -> string {\n  client GPT35Azure\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestOllama(input: string) -> string {\n  client Ollama\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestGemini(input: string) -> string {\n  client Gemini\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestVertex(input: string) -> string {\n  client Vertex\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n\n}\n\nfunction TestAws(input: string) -> string {\n  client AwsBedrock\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestAwsInvalidRegion(input: string) -> string {\n  client AwsBedrockInvalidRegion\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestOpenAIShorthand(input: string) -> string {\n  client \"openai/gpt-4o-mini\"\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestAnthropicShorthand(input: string) -> string {\n  client \"anthropic/claude-3-haiku-20240307\"\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\ntest TestProvider {\n  functions [\n    TestAnthropic, TestVertex, PromptTestOpenAI, TestAzure, TestOllama, TestGemini, TestAws,\n    TestAwsInvalidRegion,\n    TestOpenAIShorthand,\n    TestAnthropicShorthand\n  ]\n  args {\n    input \"Donkey kong and peanut butter\"\n  }\n}\n\n\nfunction TestCaching(input: string, not_cached: string) -> string {\n  client ClaudeWithCaching\n  prompt #\"\n    {{ _.role('system', cache_control={\"type\": \"ephemeral\"}) }}\n    Generate the following story\n    {{ input }}\n\n    {# Haiku require 2048 tokens to cache -#}\n    {{ input }}\n\n    {{ _.role('user') }}\n    {{ not_cached }}\n  \"#\n}\n\ntest TestName {\n  functions [TestCaching]\n  args {\n    input #\"\nIn a near-future society where dreams have become a tradable commodity and shared experience, a lonely and socially awkward teenager named Alex discovers they possess a rare and powerful ability to not only view but also manipulate the dreams of others. Initially thrilled by this newfound power, Alex begins subtly altering the dreams of classmates and family members, helping them overcome fears, boost confidence, or experience fantastical adventures. As Alex's skills grow, so does their influence. They start selling premium dream experiences on the black market, crafting intricate and addictive dreamscapes for wealthy clients. However, the line between dream and reality begins to blur for those exposed to Alex's creations. Some clients struggle to differentiate between their true memories and the artificial ones implanted by Alex's dream manipulation.\n\nComplications arise when a mysterious government agency takes notice of Alex's unique abilities. They offer Alex a chance to use their gift for \"the greater good,\" hinting at applications in therapy, criminal rehabilitation, and even national security. Simultaneously, an underground resistance movement reaches out, warning Alex about the dangers of dream manipulation and the potential for mass control and exploitation. Caught between these opposing forces, Alex must navigate a complex web of ethical dilemmas. They grapple with questions of free will, the nature of consciousness, and the responsibility that comes with having power over people's minds. As the consequences of their actions spiral outward, affecting the lives of loved ones and strangers alike, Alex is forced to confront the true nature of their ability and decide how—or if—it should be used.\n\nThe story explores themes of identity, the subconscious mind, the ethics of technology, and the power of imagination. It delves into the potential consequences of a world where our most private thoughts and experiences are no longer truly our own, and examines the fine line between helping others and manipulating them for personal gain or a perceived greater good. The narrative further expands on the societal implications of such abilities, questioning the moral boundaries of altering consciousness and the potential for abuse in a world where dreams can be commodified. It challenges the reader to consider the impact of technology on personal autonomy and the ethical responsibilities of those who wield such power.\n\nAs Alex's journey unfolds, they encounter various individuals whose lives have been touched by their dream manipulations, each presenting a unique perspective on the ethical quandaries at hand. From a classmate who gains newfound confidence to a wealthy client who becomes addicted to the dreamscapes, the ripple effects of Alex's actions are profound and far-reaching. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement highlights the dangers of unchecked power and the importance of safeguarding individual freedoms.\n\nUltimately, Alex's story is one of self-discovery and moral reckoning, as they must decide whether to embrace their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their fight for freedom and autonomy. The narrative invites readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also explores the psychological impact on Alex, who must deal with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.\n\nThe story further examines the technological advancements that have made dream manipulation possible, questioning the role of innovation in society and the potential for both progress and peril. It considers the societal divide between those who can afford to buy enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more entangled in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.\n\nIn 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.\n\nIn 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.\n    \"#\n    not_cached #\"\n      hello world\n    \"#\n  }\n}\n",
+        "test-files/providers/providers.baml" => "function TestAnthropic(input: string) -> string {\n  client Claude\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestOpenAI(input: string) -> string {\n  client GPT35\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestOpenAILegacyProvider(input: string) -> string {\n  client GPT35LegacyProvider\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestAzure(input: string) -> string {\n  client GPT35Azure\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nclient GPT35AzureFailed {\n  provider azure-openai\n  options {\n    resource_name \"west-us-azure-baml-incorrect-suffix\"\n    deployment_id \"gpt-35-turbo-default\"\n    api_key env.AZURE_OPENAI_API_KEY\n  }\n}\nfunction TestAzureFailure(input: string) -> string {\n  client GPT35AzureFailed\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestOllama(input: string) -> string {\n  client Ollama\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestGemini(input: string) -> string {\n  client Gemini\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestVertex(input: string) -> string {\n  client Vertex\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n\n}\n\nfunction TestAws(input: string) -> string {\n  client AwsBedrock\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestAwsInvalidRegion(input: string) -> string {\n  client AwsBedrockInvalidRegion\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestOpenAIShorthand(input: string) -> string {\n  client \"openai/gpt-4o-mini\"\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestAnthropicShorthand(input: string) -> string {\n  client \"anthropic/claude-3-haiku-20240307\"\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\ntest TestProvider {\n  functions [\n    TestAnthropic, TestVertex, PromptTestOpenAI, TestAzure, TestOllama, TestGemini, TestAws,\n    TestAwsInvalidRegion,\n    TestOpenAIShorthand,\n    TestAnthropicShorthand\n  ]\n  args {\n    input \"Donkey kong and peanut butter\"\n  }\n}\n\n\nfunction TestCaching(input: string, not_cached: string) -> string {\n  client ClaudeWithCaching\n  prompt #\"\n    {{ _.role('system', cache_control={\"type\": \"ephemeral\"}) }}\n    Generate the following story\n    {{ input }}\n\n    {# Haiku require 2048 tokens to cache -#}\n    {{ input }}\n\n    {{ _.role('user') }}\n    {{ not_cached }}\n  \"#\n}\n\ntest TestName {\n  functions [TestCaching]\n  args {\n    input #\"\nIn a near-future society where dreams have become a tradable commodity and shared experience, a lonely and socially awkward teenager named Alex discovers they possess a rare and powerful ability to not only view but also manipulate the dreams of others. Initially thrilled by this newfound power, Alex begins subtly altering the dreams of classmates and family members, helping them overcome fears, boost confidence, or experience fantastical adventures. As Alex's skills grow, so does their influence. They start selling premium dream experiences on the black market, crafting intricate and addictive dreamscapes for wealthy clients. However, the line between dream and reality begins to blur for those exposed to Alex's creations. Some clients struggle to differentiate between their true memories and the artificial ones implanted by Alex's dream manipulation.\n\nComplications arise when a mysterious government agency takes notice of Alex's unique abilities. They offer Alex a chance to use their gift for \"the greater good,\" hinting at applications in therapy, criminal rehabilitation, and even national security. Simultaneously, an underground resistance movement reaches out, warning Alex about the dangers of dream manipulation and the potential for mass control and exploitation. Caught between these opposing forces, Alex must navigate a complex web of ethical dilemmas. They grapple with questions of free will, the nature of consciousness, and the responsibility that comes with having power over people's minds. As the consequences of their actions spiral outward, affecting the lives of loved ones and strangers alike, Alex is forced to confront the true nature of their ability and decide how—or if—it should be used.\n\nThe story explores themes of identity, the subconscious mind, the ethics of technology, and the power of imagination. It delves into the potential consequences of a world where our most private thoughts and experiences are no longer truly our own, and examines the fine line between helping others and manipulating them for personal gain or a perceived greater good. The narrative further expands on the societal implications of such abilities, questioning the moral boundaries of altering consciousness and the potential for abuse in a world where dreams can be commodified. It challenges the reader to consider the impact of technology on personal autonomy and the ethical responsibilities of those who wield such power.\n\nAs Alex's journey unfolds, they encounter various individuals whose lives have been touched by their dream manipulations, each presenting a unique perspective on the ethical quandaries at hand. From a classmate who gains newfound confidence to a wealthy client who becomes addicted to the dreamscapes, the ripple effects of Alex's actions are profound and far-reaching. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement highlights the dangers of unchecked power and the importance of safeguarding individual freedoms.\n\nUltimately, Alex's story is one of self-discovery and moral reckoning, as they must decide whether to embrace their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their fight for freedom and autonomy. The narrative invites readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also explores the psychological impact on Alex, who must deal with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.\n\nThe story further examines the technological advancements that have made dream manipulation possible, questioning the role of innovation in society and the potential for both progress and peril. It considers the societal divide between those who can afford to buy enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more entangled in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.\n\nIn 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.\n\nIn 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.\n    \"#\n    not_cached #\"\n      hello world\n    \"#\n  }\n}\n",
         "test-files/strategies/fallback-shorthand.baml" => "\nclient FallbackToShorthand {\n  provider fallback\n  options {\n    strategy [\n      \"openai/does-not-exist\",\n      \"openai/gpt-4o-mini\"\n    ]\n  }\n}\n\n\nfunction TestFallbackToShorthand(input: string) -> string {\n  client FallbackToShorthand\n  // TODO make it return the client name instead\n  prompt #\"\n    Say a haiku about {{input}}.\n  \"#\n}\n\ntest TestProvider_FallbackToShorthand {\n  functions [\n    TestFallbackToShorthand\n  ]\n  args {\n    input \"Donkey kong and peanut butter\"\n  }\n}\n",
         "test-files/strategies/fallback.baml" => "// Happy path fallbacks.\nclient FaultyClient {\n  provider openai\n  options {\n    model unknown-model\n    api_key env.OPENAI_API_KEY\n  }\n}\n\n\nclient FallbackClient {\n  provider fallback\n  options {\n    // first 2 clients are expected to fail.\n    strategy [\n      FaultyClient,\n      RetryClientConstant,\n      GPT35\n      Gemini\n\n    ]\n  }\n}\n\nfunction TestFallbackClient() -> string {\n  client FallbackClient\n  // TODO make it return the client name instead\n  prompt #\"\n    Say a haiku about mexico.\n  \"#\n}\n\n// Fallbacks should fail gracefully.\nclient FaultyAzureClient {\n  provider azure-openai\n  options {\n    model unknown-model\n    resource_name \"unknown-resource-id\"\n    deployment_id \"unknown-deployment-id\"\n  }\n}\n\nclient SingleFallbackClient {\n  provider fallback\n  options {\n    // first 2 clients are expected to fail.\n    strategy [\n      FaultyAzureClient\n    ]\n  }\n}\n\nfunction TestSingleFallbackClient() -> string {\n  client SingleFallbackClient\n  // TODO make it return the client name instead\n  prompt #\"\n    Say a haiku about mexico.\n  \"#\n}\n",
         "test-files/strategies/retry.baml" => "\nretry_policy Exponential {\n  max_retries 3\n  strategy {\n    type exponential_backoff\n  }\n}\n\nretry_policy Constant {\n  max_retries 3\n  strategy {\n    type constant_delay\n    delay_ms 100\n  }\n}\n\nclient RetryClientConstant {\n  provider openai\n  retry_policy Constant\n  options {\n    model \"gpt-3.5-turbo\"\n    api_key \"blah\"\n  }\n}\n\nclient RetryClientExponential {\n  provider openai\n  retry_policy Exponential\n  options {\n    model \"gpt-3.5-turbo\"\n    api_key \"blahh\"\n  }\n}\n\nfunction TestRetryConstant() -> string {\n  client RetryClientConstant\n  prompt #\"\n    Say a haiku\n  \"#\n}\n\nfunction TestRetryExponential() -> string {\n  client RetryClientExponential\n  prompt #\"\n    Say a haiku\n  \"#\n}\n",
diff --git a/integ-tests/typescript/baml_client/async_client.ts b/integ-tests/typescript/baml_client/async_client.ts
index 7c910ffae..7d8cdd238 100644
--- a/integ-tests/typescript/baml_client/async_client.ts
+++ b/integ-tests/typescript/baml_client/async_client.ts
@@ -2168,6 +2168,31 @@ export class BamlAsyncClient {
     }
   }
   
+  async TestAzureFailure(
+      input: string,
+      __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry }
+  ): Promise {
+    try {
+      const raw = await this.runtime.callFunction(
+        "TestAzureFailure",
+        {
+          "input": input
+        },
+        this.ctx_manager.cloneContext(),
+        __baml_options__?.tb?.__tb(),
+        __baml_options__?.clientRegistry,
+      )
+      return raw.parsed() as string
+    } catch (error: any) {
+      const bamlError = createBamlValidationError(error);
+      if (bamlError instanceof BamlValidationError) {
+        throw bamlError;
+      } else {
+        throw error;
+      }
+    }
+  }
+  
   async TestCaching(
       input: string,not_cached: string,
       __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry }
@@ -5804,6 +5829,39 @@ class BamlStreamClient {
     }
   }
   
+  TestAzureFailure(
+      input: string,
+      __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry }
+  ): BamlStream, string> {
+    try {
+      const raw = this.runtime.streamFunction(
+        "TestAzureFailure",
+        {
+          "input": input
+        },
+        undefined,
+        this.ctx_manager.cloneContext(),
+        __baml_options__?.tb?.__tb(),
+        __baml_options__?.clientRegistry,
+      )
+      return new BamlStream, string>(
+        raw,
+        (a): a is RecursivePartialNull => a,
+        (a): a is string => a,
+        this.ctx_manager.cloneContext(),
+        __baml_options__?.tb?.__tb(),
+      )
+    } catch (error) {
+      if (error instanceof Error) {
+        const bamlError = createBamlValidationError(error);
+        if (bamlError instanceof BamlValidationError) {
+          throw bamlError;
+        }
+      }
+      throw error;
+    }
+  }
+  
   TestCaching(
       input: string,not_cached: string,
       __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry }
diff --git a/integ-tests/typescript/baml_client/inlinedbaml.ts b/integ-tests/typescript/baml_client/inlinedbaml.ts
index 58c92e590..d77e90def 100644
--- a/integ-tests/typescript/baml_client/inlinedbaml.ts
+++ b/integ-tests/typescript/baml_client/inlinedbaml.ts
@@ -87,7 +87,7 @@ const fileMap = {
   "test-files/functions/prompts/no-chat-messages.baml": "\n\nfunction PromptTestClaude(input: string) -> string {\n  client Sonnet\n  prompt #\"\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\n\nfunction PromptTestStreaming(input: string) -> string {\n  client GPT35\n  prompt #\"\n    Tell me a short story about {{ input }}\n  \"#\n}\n\ntest TestName {\n  functions [PromptTestStreaming]\n  args {\n    input #\"\n      hello world\n    \"#\n  }\n}\n",
   "test-files/functions/prompts/with-chat-messages.baml": "\nfunction PromptTestOpenAIChat(input: string) -> string {\n  client GPT35\n  prompt #\"\n    {{ _.role(\"system\") }}\n    You are an assistant that always responds in a very excited way with emojis and also outputs this word 4 times after giving a response: {{ input }}\n    \n    {{ _.role(\"user\") }}\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestOpenAIChatNoSystem(input: string) -> string {\n  client GPT35\n  prompt #\"\n    You are an assistant that always responds in a very excited way with emojis and also outputs this word 4 times after giving a response: {{ input }}\n    \n    {{ _.role(\"user\") }}\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestClaudeChat(input: string) -> string {\n  client Claude\n  prompt #\"\n    {{ _.role(\"system\") }}\n    You are an assistant that always responds in a very excited way with emojis and also outputs this word 4 times after giving a response: {{ input }}\n    \n    {{ _.role(\"user\") }}\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestClaudeChatNoSystem(input: string) -> string {\n  client Claude\n  prompt #\"\n    You are an assistant that always responds in a very excited way with emojis and also outputs this word 4 times after giving a response: {{ input }}\n    \n    {{ _.role(\"user\") }}\n    Tell me a haiku about {{ input }}\n  \"#\n}\n\ntest TestSystemAndNonSystemChat1 {\n  functions [PromptTestClaude, PromptTestOpenAI, PromptTestOpenAIChat, PromptTestOpenAIChatNoSystem, PromptTestClaudeChat, PromptTestClaudeChatNoSystem]\n  args {\n    input \"cats\"\n  }\n}\n\ntest TestSystemAndNonSystemChat2 {\n  functions [PromptTestClaude, PromptTestOpenAI, PromptTestOpenAIChat, PromptTestOpenAIChatNoSystem, PromptTestClaudeChat, PromptTestClaudeChatNoSystem]\n  args {\n    input \"lion\"\n  }\n}",
   "test-files/functions/v2/basic.baml": "\n\nfunction ExtractResume2(resume: string) -> Resume {\n    client GPT4\n    prompt #\"\n        {{ _.role('system') }}\n\n        Extract the following information from the resume:\n\n        Resume:\n        <<<<\n        {{ resume }}\n        <<<<\n\n        Output JSON schema:\n        {{ ctx.output_format }}\n\n        JSON:\n    \"#\n}\n\n\nclass WithReasoning {\n    value string\n    reasoning string @description(#\"\n        Why the value is a good fit.\n    \"#)\n}\n\n\nclass SearchParams {\n    dateRange int? @description(#\"\n        In ISO duration format, e.g. P1Y2M10D.\n    \"#)\n    location string[]\n    jobTitle WithReasoning? @description(#\"\n        An exact job title, not a general category.\n    \"#)\n    company WithReasoning? @description(#\"\n        The exact name of the company, not a product or service.\n    \"#)\n    description WithReasoning[] @description(#\"\n        Any specific projects or features the user is looking for.\n    \"#)\n    tags (Tag | string)[]\n}\n\nenum Tag {\n    Security\n    AI\n    Blockchain\n}\n\nfunction GetQuery(query: string) -> SearchParams {\n    client GPT4\n    prompt #\"\n        Extract the following information from the query:\n\n        Query:\n        <<<<\n        {{ query }}\n        <<<<\n\n        OUTPUT_JSON_SCHEMA:\n        {{ ctx.output_format }}\n\n        Before OUTPUT_JSON_SCHEMA, list 5 intentions the user may have.\n        --- EXAMPLES ---\n        1. \n        2. \n        3. \n        4. \n        5. \n\n        {\n            ... // OUTPUT_JSON_SCHEMA\n        }\n    \"#\n}\n\nclass RaysData {\n    dataType DataType\n    value Resume | Event\n}\n\nenum DataType {\n    Resume\n    Event\n}\n\nclass Event {\n    title string\n    date string\n    location string\n    description string\n}\n\nfunction GetDataType(text: string) -> RaysData {\n    client GPT4\n    prompt #\"\n        Extract the relevant info.\n\n        Text:\n        <<<<\n        {{ text }}\n        <<<<\n\n        Output JSON schema:\n        {{ ctx.output_format }}\n\n        JSON:\n    \"#\n}",
-  "test-files/providers/providers.baml": "function TestAnthropic(input: string) -> string {\n  client Claude\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestOpenAI(input: string) -> string {\n  client GPT35\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestOpenAILegacyProvider(input: string) -> string {\n  client GPT35LegacyProvider\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestAzure(input: string) -> string {\n  client GPT35Azure\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestOllama(input: string) -> string {\n  client Ollama\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestGemini(input: string) -> string {\n  client Gemini\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestVertex(input: string) -> string {\n  client Vertex\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n\n}\n\nfunction TestAws(input: string) -> string {\n  client AwsBedrock\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestAwsInvalidRegion(input: string) -> string {\n  client AwsBedrockInvalidRegion\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestOpenAIShorthand(input: string) -> string {\n  client \"openai/gpt-4o-mini\"\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestAnthropicShorthand(input: string) -> string {\n  client \"anthropic/claude-3-haiku-20240307\"\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\ntest TestProvider {\n  functions [\n    TestAnthropic, TestVertex, PromptTestOpenAI, TestAzure, TestOllama, TestGemini, TestAws,\n    TestAwsInvalidRegion,\n    TestOpenAIShorthand,\n    TestAnthropicShorthand\n  ]\n  args {\n    input \"Donkey kong and peanut butter\"\n  }\n}\n\n\nfunction TestCaching(input: string, not_cached: string) -> string {\n  client ClaudeWithCaching\n  prompt #\"\n    {{ _.role('system', cache_control={\"type\": \"ephemeral\"}) }}\n    Generate the following story\n    {{ input }}\n\n    {# Haiku require 2048 tokens to cache -#}\n    {{ input }}\n\n    {{ _.role('user') }}\n    {{ not_cached }}\n  \"#\n}\n\ntest TestName {\n  functions [TestCaching]\n  args {\n    input #\"\nIn a near-future society where dreams have become a tradable commodity and shared experience, a lonely and socially awkward teenager named Alex discovers they possess a rare and powerful ability to not only view but also manipulate the dreams of others. Initially thrilled by this newfound power, Alex begins subtly altering the dreams of classmates and family members, helping them overcome fears, boost confidence, or experience fantastical adventures. As Alex's skills grow, so does their influence. They start selling premium dream experiences on the black market, crafting intricate and addictive dreamscapes for wealthy clients. However, the line between dream and reality begins to blur for those exposed to Alex's creations. Some clients struggle to differentiate between their true memories and the artificial ones implanted by Alex's dream manipulation.\n\nComplications arise when a mysterious government agency takes notice of Alex's unique abilities. They offer Alex a chance to use their gift for \"the greater good,\" hinting at applications in therapy, criminal rehabilitation, and even national security. Simultaneously, an underground resistance movement reaches out, warning Alex about the dangers of dream manipulation and the potential for mass control and exploitation. Caught between these opposing forces, Alex must navigate a complex web of ethical dilemmas. They grapple with questions of free will, the nature of consciousness, and the responsibility that comes with having power over people's minds. As the consequences of their actions spiral outward, affecting the lives of loved ones and strangers alike, Alex is forced to confront the true nature of their ability and decide how—or if—it should be used.\n\nThe story explores themes of identity, the subconscious mind, the ethics of technology, and the power of imagination. It delves into the potential consequences of a world where our most private thoughts and experiences are no longer truly our own, and examines the fine line between helping others and manipulating them for personal gain or a perceived greater good. The narrative further expands on the societal implications of such abilities, questioning the moral boundaries of altering consciousness and the potential for abuse in a world where dreams can be commodified. It challenges the reader to consider the impact of technology on personal autonomy and the ethical responsibilities of those who wield such power.\n\nAs Alex's journey unfolds, they encounter various individuals whose lives have been touched by their dream manipulations, each presenting a unique perspective on the ethical quandaries at hand. From a classmate who gains newfound confidence to a wealthy client who becomes addicted to the dreamscapes, the ripple effects of Alex's actions are profound and far-reaching. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement highlights the dangers of unchecked power and the importance of safeguarding individual freedoms.\n\nUltimately, Alex's story is one of self-discovery and moral reckoning, as they must decide whether to embrace their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their fight for freedom and autonomy. The narrative invites readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also explores the psychological impact on Alex, who must deal with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.\n\nThe story further examines the technological advancements that have made dream manipulation possible, questioning the role of innovation in society and the potential for both progress and peril. It considers the societal divide between those who can afford to buy enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more entangled in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.\n\nIn 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.\n\nIn 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.\n    \"#\n    not_cached #\"\n      hello world\n    \"#\n  }\n}\n",
+  "test-files/providers/providers.baml": "function TestAnthropic(input: string) -> string {\n  client Claude\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction PromptTestOpenAI(input: string) -> string {\n  client GPT35\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestOpenAILegacyProvider(input: string) -> string {\n  client GPT35LegacyProvider\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestAzure(input: string) -> string {\n  client GPT35Azure\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nclient GPT35AzureFailed {\n  provider azure-openai\n  options {\n    resource_name \"west-us-azure-baml-incorrect-suffix\"\n    deployment_id \"gpt-35-turbo-default\"\n    api_key env.AZURE_OPENAI_API_KEY\n  }\n}\nfunction TestAzureFailure(input: string) -> string {\n  client GPT35AzureFailed\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestOllama(input: string) -> string {\n  client Ollama\n  prompt #\"\n    Write a nice haiku about {{ input }}\n  \"#\n}\n\nfunction TestGemini(input: string) -> string {\n  client Gemini\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestVertex(input: string) -> string {\n  client Vertex\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n\n}\n\nfunction TestAws(input: string) -> string {\n  client AwsBedrock\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestAwsInvalidRegion(input: string) -> string {\n  client AwsBedrockInvalidRegion\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestOpenAIShorthand(input: string) -> string {\n  client \"openai/gpt-4o-mini\"\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\nfunction TestAnthropicShorthand(input: string) -> string {\n  client \"anthropic/claude-3-haiku-20240307\"\n  prompt #\"\n    Write a nice short story about {{ input }}\n  \"#\n}\n\ntest TestProvider {\n  functions [\n    TestAnthropic, TestVertex, PromptTestOpenAI, TestAzure, TestOllama, TestGemini, TestAws,\n    TestAwsInvalidRegion,\n    TestOpenAIShorthand,\n    TestAnthropicShorthand\n  ]\n  args {\n    input \"Donkey kong and peanut butter\"\n  }\n}\n\n\nfunction TestCaching(input: string, not_cached: string) -> string {\n  client ClaudeWithCaching\n  prompt #\"\n    {{ _.role('system', cache_control={\"type\": \"ephemeral\"}) }}\n    Generate the following story\n    {{ input }}\n\n    {# Haiku require 2048 tokens to cache -#}\n    {{ input }}\n\n    {{ _.role('user') }}\n    {{ not_cached }}\n  \"#\n}\n\ntest TestName {\n  functions [TestCaching]\n  args {\n    input #\"\nIn a near-future society where dreams have become a tradable commodity and shared experience, a lonely and socially awkward teenager named Alex discovers they possess a rare and powerful ability to not only view but also manipulate the dreams of others. Initially thrilled by this newfound power, Alex begins subtly altering the dreams of classmates and family members, helping them overcome fears, boost confidence, or experience fantastical adventures. As Alex's skills grow, so does their influence. They start selling premium dream experiences on the black market, crafting intricate and addictive dreamscapes for wealthy clients. However, the line between dream and reality begins to blur for those exposed to Alex's creations. Some clients struggle to differentiate between their true memories and the artificial ones implanted by Alex's dream manipulation.\n\nComplications arise when a mysterious government agency takes notice of Alex's unique abilities. They offer Alex a chance to use their gift for \"the greater good,\" hinting at applications in therapy, criminal rehabilitation, and even national security. Simultaneously, an underground resistance movement reaches out, warning Alex about the dangers of dream manipulation and the potential for mass control and exploitation. Caught between these opposing forces, Alex must navigate a complex web of ethical dilemmas. They grapple with questions of free will, the nature of consciousness, and the responsibility that comes with having power over people's minds. As the consequences of their actions spiral outward, affecting the lives of loved ones and strangers alike, Alex is forced to confront the true nature of their ability and decide how—or if—it should be used.\n\nThe story explores themes of identity, the subconscious mind, the ethics of technology, and the power of imagination. It delves into the potential consequences of a world where our most private thoughts and experiences are no longer truly our own, and examines the fine line between helping others and manipulating them for personal gain or a perceived greater good. The narrative further expands on the societal implications of such abilities, questioning the moral boundaries of altering consciousness and the potential for abuse in a world where dreams can be commodified. It challenges the reader to consider the impact of technology on personal autonomy and the ethical responsibilities of those who wield such power.\n\nAs Alex's journey unfolds, they encounter various individuals whose lives have been touched by their dream manipulations, each presenting a unique perspective on the ethical quandaries at hand. From a classmate who gains newfound confidence to a wealthy client who becomes addicted to the dreamscapes, the ripple effects of Alex's actions are profound and far-reaching. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement highlights the dangers of unchecked power and the importance of safeguarding individual freedoms.\n\nUltimately, Alex's story is one of self-discovery and moral reckoning, as they must decide whether to embrace their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their fight for freedom and autonomy. The narrative invites readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also explores the psychological impact on Alex, who must deal with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.\n\nThe story further examines the technological advancements that have made dream manipulation possible, questioning the role of innovation in society and the potential for both progress and peril. It considers the societal divide between those who can afford to buy enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more entangled in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.\n\nIn 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.\n\nIn 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.\n    \"#\n    not_cached #\"\n      hello world\n    \"#\n  }\n}\n",
   "test-files/strategies/fallback-shorthand.baml": "\nclient FallbackToShorthand {\n  provider fallback\n  options {\n    strategy [\n      \"openai/does-not-exist\",\n      \"openai/gpt-4o-mini\"\n    ]\n  }\n}\n\n\nfunction TestFallbackToShorthand(input: string) -> string {\n  client FallbackToShorthand\n  // TODO make it return the client name instead\n  prompt #\"\n    Say a haiku about {{input}}.\n  \"#\n}\n\ntest TestProvider_FallbackToShorthand {\n  functions [\n    TestFallbackToShorthand\n  ]\n  args {\n    input \"Donkey kong and peanut butter\"\n  }\n}\n",
   "test-files/strategies/fallback.baml": "// Happy path fallbacks.\nclient FaultyClient {\n  provider openai\n  options {\n    model unknown-model\n    api_key env.OPENAI_API_KEY\n  }\n}\n\n\nclient FallbackClient {\n  provider fallback\n  options {\n    // first 2 clients are expected to fail.\n    strategy [\n      FaultyClient,\n      RetryClientConstant,\n      GPT35\n      Gemini\n\n    ]\n  }\n}\n\nfunction TestFallbackClient() -> string {\n  client FallbackClient\n  // TODO make it return the client name instead\n  prompt #\"\n    Say a haiku about mexico.\n  \"#\n}\n\n// Fallbacks should fail gracefully.\nclient FaultyAzureClient {\n  provider azure-openai\n  options {\n    model unknown-model\n    resource_name \"unknown-resource-id\"\n    deployment_id \"unknown-deployment-id\"\n  }\n}\n\nclient SingleFallbackClient {\n  provider fallback\n  options {\n    // first 2 clients are expected to fail.\n    strategy [\n      FaultyAzureClient\n    ]\n  }\n}\n\nfunction TestSingleFallbackClient() -> string {\n  client SingleFallbackClient\n  // TODO make it return the client name instead\n  prompt #\"\n    Say a haiku about mexico.\n  \"#\n}\n",
   "test-files/strategies/retry.baml": "\nretry_policy Exponential {\n  max_retries 3\n  strategy {\n    type exponential_backoff\n  }\n}\n\nretry_policy Constant {\n  max_retries 3\n  strategy {\n    type constant_delay\n    delay_ms 100\n  }\n}\n\nclient RetryClientConstant {\n  provider openai\n  retry_policy Constant\n  options {\n    model \"gpt-3.5-turbo\"\n    api_key \"blah\"\n  }\n}\n\nclient RetryClientExponential {\n  provider openai\n  retry_policy Exponential\n  options {\n    model \"gpt-3.5-turbo\"\n    api_key \"blahh\"\n  }\n}\n\nfunction TestRetryConstant() -> string {\n  client RetryClientConstant\n  prompt #\"\n    Say a haiku\n  \"#\n}\n\nfunction TestRetryExponential() -> string {\n  client RetryClientExponential\n  prompt #\"\n    Say a haiku\n  \"#\n}\n",
diff --git a/integ-tests/typescript/baml_client/sync_client.ts b/integ-tests/typescript/baml_client/sync_client.ts
index f57137669..88d06ad76 100644
--- a/integ-tests/typescript/baml_client/sync_client.ts
+++ b/integ-tests/typescript/baml_client/sync_client.ts
@@ -2168,6 +2168,31 @@ export class BamlSyncClient {
     }
   }
   
+  TestAzureFailure(
+      input: string,
+      __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry }
+  ): string {
+    try {
+    const raw = this.runtime.callFunctionSync(
+      "TestAzureFailure",
+      {
+        "input": input
+      },
+      this.ctx_manager.cloneContext(),
+      __baml_options__?.tb?.__tb(),
+      __baml_options__?.clientRegistry,
+    )
+    return raw.parsed() as string
+    } catch (error: any) {
+      const bamlError = createBamlValidationError(error);
+      if (bamlError instanceof BamlValidationError) {
+        throw bamlError;
+      } else {
+        throw error;
+      }
+    }
+  }
+  
   TestCaching(
       input: string,not_cached: string,
       __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry }
diff --git a/integ-tests/typescript/test-report.html b/integ-tests/typescript/test-report.html
index 7576857d3..e0153bdc9 100644
--- a/integ-tests/typescript/test-report.html
+++ b/integ-tests/typescript/test-report.html
@@ -257,650 +257,21 @@
   font-size: 1rem;
   padding: 0 0.5rem;
 }
-

Test Report

Started: 2024-12-13 07:35:13
Suites (1)
1 passed
0 failed
0 pending
Tests (67)
67 passed
0 failed
0 pending
Integ tests > should work for all inputs
single bool
passed
0.941s
Integ tests > should work for all inputs
single string list
passed
0.384s
Integ tests > should work for all inputs
return literal union
passed
0.401s
Integ tests > should work for all inputs
single class
passed
0.636s
Integ tests > should work for all inputs
multiple classes
passed
0.469s
Integ tests > should work for all inputs
single enum list
passed
0.466s
Integ tests > should work for all inputs
single float
passed
0.365s
Integ tests > should work for all inputs
single int
passed
0.313s
Integ tests > should work for all inputs
single literal int
passed
0.4s
Integ tests > should work for all inputs
single literal bool
passed
0.363s
Integ tests > should work for all inputs
single literal string
passed
0.425s
Integ tests > should work for all inputs
single class with literal prop
passed
0.466s
Integ tests > should work for all inputs
single class with literal union prop
passed
0.661s
Integ tests > should work for all inputs
single optional string
passed
0.466s
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.65s
Integ tests > should work for all inputs
single map string to map
passed
0.786s
Integ tests > should work for all inputs
enum key in map
passed
0.909s
Integ tests > should work for all inputs
literal string union key in map
passed
0.922s
Integ tests > should work for all inputs
single literal string key in map
passed
0.549s
Integ tests
should work for all outputs
passed
5.774s
Integ tests
works with retries1
passed
1.159s
Integ tests
works with retries2
passed
2.221s
Integ tests
works with fallbacks
passed
1.988s
Integ tests
should work with image from url
passed
1.413s
Integ tests
should work with image from base 64
passed
1.698s
Integ tests
should work with audio base 64
passed
1.085s
Integ tests
should work with audio from url
passed
1.332s
Integ tests
should support streaming in OpenAI
passed
1.927s
Integ tests
should support streaming in Gemini
passed
7.571s
Integ tests
should support AWS
passed
1.722s
Integ tests
should support streaming in AWS
passed
1.618s
Integ tests
should allow overriding the region
passed
0.042s
Integ tests
should support OpenAI shorthand
passed
19.04s
Integ tests
should support OpenAI shorthand streaming
passed
9.894s
Integ tests
should support anthropic shorthand
passed
2.456s
Integ tests
should support anthropic shorthand streaming
passed
2.835s
Integ tests
should support streaming without iterating
passed
2.147s
Integ tests
should support streaming in Claude
passed
1.513s
Integ tests
should support vertex
passed
10.78s
Integ tests
supports tracing sync
passed
0.009s
Integ tests
supports tracing async
passed
3.32s
Integ tests
should work with dynamic types single
passed
3.489s
Integ tests
should work with dynamic types enum
passed
0.86s
Integ tests
should work with dynamic literals
passed
0.787s
Integ tests
should work with dynamic types class
passed
1.544s
Integ tests
should work with dynamic inputs class
passed
0.508s
Integ tests
should work with dynamic inputs list
passed
0.545s
Integ tests
should work with dynamic output map
passed
0.62s
Integ tests
should work with dynamic output union
passed
1.536s
Integ tests
should work with nested classes
passed
7.784s
Integ tests
should work with dynamic client
passed
0.494s
Integ tests
should work with 'onLogEvent'
passed
1.945s
Integ tests
should work with a sync client
passed
0.411s
Integ tests
should raise an error when appropriate
passed
0.893s
Integ tests
should raise a BAMLValidationError
passed
0.422s
Integ tests
should reset environment variables correctly
passed
1.046s
Integ tests
should use aliases when serializing input objects - classes
passed
0.802s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.769s
Integ tests
should use aliases when serializing input objects - enums
passed
0.368s
Integ tests
should use aliases when serializing input objects - lists
passed
0.421s
Integ tests
constraints: should handle checks in return types
passed
0.784s
Integ tests
constraints: should handle checks in returned unions
passed
0.797s
Integ tests
constraints: should handle block-level checks
passed
0.568s
Integ tests
constraints: should handle nested-block-level checks
passed
0.793s
Integ tests
simple recursive type
passed
3.139s
Integ tests
mutually recursive type
passed
2.043s
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:48:15)
-    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
-    at new Promise (<anonymous>)
-    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
-    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
-    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
-    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
-    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
-    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
-    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
-    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
calling with class
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:54:15)
got response key
-true
-52
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:194:15)
Expected error Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "RetryClientConstant", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1734104132, tv_nsec: 832000 }, latency: 148.325833ms, 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: 1734104134, tv_nsec: 158534000 }, latency: 230.130959ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
-    at BamlAsyncClient.parsed [as TestRetryExponential] (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:2835:18)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:200:7) {
-  code: 'GenericFailure'
-}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:362:15)
-    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:83:38)
-    at AsyncLocalStorage.run (node:async_hooks:338:14)
-    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:81:22)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:5)
-    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
-    at new Promise (<anonymous>)
-    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
-    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
-    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
-    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
-    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
-    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
-    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
-    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
hello world
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:15)
-    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:83:38)
-    at AsyncLocalStorage.run (node:async_hooks:338:14)
-    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:81:22)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:5)
-    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
-    at new Promise (<anonymous>)
-    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
-    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
-    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
-    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
-    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
-    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
-    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
-    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
dummyFunc returned
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:368:15)
-    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:83:38)
-    at AsyncLocalStorage.run (node:async_hooks:338:14)
-    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:81:22)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:371:5)
-    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
-    at new Promise (<anonymous>)
-    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
-    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
-    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
-    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
-    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
-    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
-    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
-    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
dummyFunc2 returned
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 0)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 0)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:401:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 1)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 0)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:401:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 2)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 0)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:401:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 0)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:401:5)
dummy hi1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 0)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 1)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:401:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 1)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 1)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:401:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 2)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 1)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:401:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 1)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:401:5)
dummy hi2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 0)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 2)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:401:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 1)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 2)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:401:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 2)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 2)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:401:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394:15)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 2)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:401:5)
dummy hi3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:408:15)
-    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:44)
-    at AsyncLocalStorage.run (node:async_hooks:338:14)
-    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:28)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:424:5)
hello world
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 0)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 1)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 2)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
dummy firstDummyFuncArg
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 0)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:413:20
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:407:17)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 1)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:413:20
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:407:17)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 2)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:413:20
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:407:17)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394:15)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:413:20
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:407:17)
dummy secondDummyFuncArg
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 0)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:421:20
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:407:17)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at runNextTicks (node:internal/process/task_queues:60:5)
-    at listOnTimeout (node:internal/timers:538:9)
-    at processTimers (node:internal/timers:512:7)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 1)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:421:20
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:407:17)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at async Promise.all (index 2)
-    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:389:22)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:421:20
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:407:17)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394:15)
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:421:20
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
-    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:407:17)
dummy thirdDummyFuncArg
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:427:15)
-    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:44)
-    at AsyncLocalStorage.run (node:async_hooks:338:14)
-    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:28)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:433:5)
hello world
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:437:13)
stats {"failed":0,"started":30,"finalized":30,"submitted":30,"sent":30,"done":30}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:461:13)
[
-  {
-    name: 'Harrison',
-    hair_color: 'BLACK',
-    last_name: null,
-    height: 1.83,
-    hobbies: [ 'SPORTS' ]
-  }
-]
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:530:13)
-    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
-    at new Promise (<anonymous>)
-    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
-    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
-    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
-    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
-    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
-    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
-    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
-    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
[
-  [
-    'hair_color',
-    ClassPropertyBuilder { bldr: ClassPropertyBuilder {} }
-  ],
-  [
-    'attributes',
-    ClassPropertyBuilder { bldr: ClassPropertyBuilder {} }
-  ]
-]
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:532:15)
-    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
-    at new Promise (<anonymous>)
-    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
-    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
-    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
-    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
-    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
-    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
-    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
-    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
Property: hair_color
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:532:15)
-    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
-    at new Promise (<anonymous>)
-    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
-    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
-    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
-    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
-    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
-    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
-    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
-    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
Property: attributes
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:540:13)
final  {
-  hair_color: 'black',
-  attributes: { height: '6 feet', eye_color: 'blue', facial_hair: 'beard' }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:564:13)
-    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
-    at new Promise (<anonymous>)
-    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
-    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
-    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
-    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
-    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
-    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
-    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
-    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
[
-  [
-    'hair_color',
-    ClassPropertyBuilder { bldr: ClassPropertyBuilder {} }
-  ],
-  [
-    'attributes',
-    ClassPropertyBuilder { bldr: ClassPropertyBuilder {} }
-  ],
-  [ 'height', ClassPropertyBuilder { bldr: ClassPropertyBuilder {} } ]
-]
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:566:15)
-    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
-    at new Promise (<anonymous>)
-    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
-    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
-    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
-    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
-    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
-    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
-    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
-    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
Property: hair_color
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:566:15)
-    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
-    at new Promise (<anonymous>)
-    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
-    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
-    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
-    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
-    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
-    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
-    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
-    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
Property: attributes
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:566:15)
-    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
+

Test Report

Started: 2024-12-16 17:09:18
Suites (1)
0 passed
1 failed
0 pending
Tests (71)
3 passed
1 failed
67 pending
Integ tests > should work for all inputs
single bool
pending
0s
Integ tests > should work for all inputs
single string list
pending
0s
Integ tests > should work for all inputs
return literal union
pending
0s
Integ tests > should work for all inputs
single class
pending
0s
Integ tests > should work for all inputs
multiple classes
pending
0s
Integ tests > should work for all inputs
single enum list
pending
0s
Integ tests > should work for all inputs
single float
pending
0s
Integ tests > should work for all inputs
single int
pending
0s
Integ tests > should work for all inputs
single literal int
pending
0s
Integ tests > should work for all inputs
single literal bool
pending
0s
Integ tests > should work for all inputs
single literal string
pending
0s
Integ tests > should work for all inputs
single class with literal prop
pending
0s
Integ tests > should work for all inputs
single class with literal union prop
pending
0s
Integ tests > should work for all inputs
single optional string
pending
0s
Integ tests > should work for all inputs
single map string to string
pending
0s
Integ tests > should work for all inputs
single map string to class
pending
0s
Integ tests > should work for all inputs
single map string to map
pending
0s
Integ tests > should work for all inputs
enum key in map
pending
0s
Integ tests > should work for all inputs
literal string union key in map
pending
0s
Integ tests > should work for all inputs
single literal string key in map
pending
0s
Integ tests
should work for all outputs
pending
0s
Integ tests
works with retries1
pending
0s
Integ tests
works with retries2
pending
0s
Integ tests
works with fallbacks
pending
0s
Integ tests
should work with image from url
pending
0s
Integ tests
should work with image from base 64
pending
0s
Integ tests
should work with audio base 64
pending
0s
Integ tests
should work with audio from url
pending
0s
Integ tests
should support streaming in OpenAI
pending
0s
Integ tests
should support streaming in Gemini
pending
0s
Integ tests
should support AWS
pending
0s
Integ tests
should support streaming in AWS
pending
0s
Integ tests
should allow overriding the region
pending
0s
Integ tests
should support OpenAI shorthand
pending
0s
Integ tests
should support OpenAI shorthand streaming
pending
0s
Integ tests
should support anthropic shorthand
pending
0s
Integ tests
should support anthropic shorthand streaming
pending
0s
Integ tests
should support streaming without iterating
pending
0s
Integ tests
should support streaming in Claude
pending
0s
Integ tests
should support azure
passed
0.392s
Integ tests
should support azure streaming
passed
0.408s
Integ tests
should fail if azure is not configured
passed
0.052s
Integ tests
should fail if azure is not configured streaming
failed
0.102s
Error: expect(received).rejects.toThrow()
+
+Received promise resolved instead of rejected
+Resolved to value: undefined
+    at expect (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/node_modules/.pnpm/expect@29.7.0/node_modules/expect/build/index.js:113:15)
+    at Object.expect (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/tests/integ-tests.test.ts:375:11)
+    at Promise.then.completed (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
     at new Promise (<anonymous>)
-    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
-    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
-    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
-    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
-    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
-    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
-    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
-    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
-    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
Property: height
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:574:13)
final  {
-  hair_color: 'black',
-  attributes: { eye_color: 'blue', facial_hair: 'beard' },
-  height: { feet: 6, inches: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:585:13)
final  {
-  hair_color: 'black',
-  attributes: { eye_color: 'blue', facial_hair: 'beard' },
-  height: { meters: 1.8 }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: '', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: '', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: '', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: 'ag', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: {
-    prop1: 'world',
-    prop2: 'again',
-    inner: { prop2: null, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: {
-    prop1: 'world',
-    prop2: 'again',
-    inner: { prop2: null, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: {
-    prop1: 'world',
-    prop2: 'again',
-    inner: { prop2: null, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: {
-    prop1: 'world',
-    prop2: 'again',
-    inner: { prop2: null, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: {
-    prop1: 'world',
-    prop2: 'again',
-    inner: { prop2: null, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: {
-    prop1: 'world',
-    prop2: 'again',
-    inner: { prop2: null, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: {
-    prop1: 'world',
-    prop2: 'again',
-    inner: { prop2: null, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: {
-    prop1: 'world',
-    prop2: 'again',
-    inner: { prop2: null, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: {
-    prop1: 'world',
-    prop2: 'again',
-    inner: { prop2: null, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: {
-    prop1: 'world',
-    prop2: 'again',
-    inner: { prop2: null, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: {
-    prop1: 'world',
-    prop2: 'again',
-    inner: { prop2: null, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
-}
    at 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: '9ad5196c-2fe4-428b-bf00-1191272356cf',
-    rootEventId: '9ad5196c-2fe4-428b-bf00-1191272356cf'
-  },
-  prompt: '[\n' +
-    '  {\n' +
-    '    "role": "system",\n' +
-    '    "content": [\n' +
-    '      {\n' +
-    '        "text": "Return this value back to me: [\\"a\\", \\"b\\", \\"c\\"]"\n' +
-    '      }\n' +
-    '    ]\n' +
-    '  }\n' +
-    ']',
-  rawOutput: '["a", "b", "c"]',
-  parsedOutput: '["a", "b", "c"]',
-  startTime: '2024-12-13T15:37:05.264Z'
-}
    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: '3ed3c62a-4348-46bf-924c-047cfa0f93a8',
-    rootEventId: '3ed3c62a-4348-46bf-924c-047cfa0f93a8'
-  },
-  prompt: '[\n' +
-    '  {\n' +
-    '    "role": "system",\n' +
-    '    "content": [\n' +
-    '      {\n' +
-    '        "text": "Return this value back to me: [\\"d\\", \\"e\\", \\"f\\"]"\n' +
-    '      }\n' +
-    '    ]\n' +
-    '  }\n' +
-    ']',
-  rawOutput: '["d", "e", "f"]',
-  parsedOutput: '["d", "e", "f"]',
-  startTime: '2024-12-13T15:37:05.907Z'
-}
    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: 1734104227, tv_nsec: 481679000 }, latency: 228.444916ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: INVALID_KEY. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
-    at BamlAsyncClient.parsed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:1585:18)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:654:7) {
-  code: 'GenericFailure'
-}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:665:17)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:661:5)
BamlValidationError: BamlValidationError: Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
-  - <root>: Missing required field: nonce
-  - <root>: Missing required field: nonce2
-    at Function.from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:79:28)
-    at from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:92:53)
-    at BamlAsyncClient.DummyOutputFunction (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:562:50)
-    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:663:9
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:661:5) {
-  prompt: '[\x1B[2mchat\x1B[0m] \x1B[43msystem: \x1B[0mSay "hello there".\n',
-  raw_output: 'Hello there! How can I help you today?'
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:677:17)
error BamlValidationError: BamlValidationError: Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
-  - <root>: Missing required field: nonce
-  - <root>: Missing required field: nonce2
-    at Function.from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:79:28)
-    at from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:92:53)
-    at BamlAsyncClient.DummyOutputFunction (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:562:50)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:673:7) {
-  prompt: '[\x1B[2mchat\x1B[0m] \x1B[43msystem: \x1B[0mSay "hello there".\n',
-  raw_output: 'Hello there! How can I assist you today?'
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:777:13)
{"nbc":{"value":{"foo":1,"bar":"hello"},"checks":{"cross_field":{"name":"cross_field","expression":"this.bar|length > this.foo","status":"succeeded"}}}}
\ No newline at end of file + at callAsyncCircusFn (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10) + at _callCircusTest (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40) + at _runTest (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3) + at _runTestsForDescribeBlock (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9) + at _runTestsForDescribeBlock (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9) + at run (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3) + at runAndTransformResultsToJestFormat (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21) + at jestAdapter (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19) + at runTestInternal (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16) + at runTest (/Users/aaronvillalpando/Projects/baml/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
Integ tests
should support vertex
pending
0s
Integ tests
supports tracing sync
pending
0s
Integ tests
supports tracing async
pending
0s
Integ tests
should work with dynamic types single
pending
0s
Integ tests
should work with dynamic types enum
pending
0s
Integ tests
should work with dynamic literals
pending
0s
Integ tests
should work with dynamic types class
pending
0s
Integ tests
should work with dynamic inputs class
pending
0s
Integ tests
should work with dynamic inputs list
pending
0s
Integ tests
should work with dynamic output map
pending
0s
Integ tests
should work with dynamic output union
pending
0s
Integ tests
should work with nested classes
pending
0s
Integ tests
should work with dynamic client
pending
0s
Integ tests
should work with 'onLogEvent'
pending
0s
Integ tests
should work with a sync client
pending
0s
Integ tests
should raise an error when appropriate
pending
0s
Integ tests
should raise a BAMLValidationError
pending
0s
Integ tests
should reset environment variables correctly
pending
0s
Integ tests
should use aliases when serializing input objects - classes
pending
0s
Integ tests
should use aliases when serializing, but still have original keys in jinja
pending
0s
Integ tests
should use aliases when serializing input objects - enums
pending
0s
Integ tests
should use aliases when serializing input objects - lists
pending
0s
Integ tests
constraints: should handle checks in return types
pending
0s
Integ tests
constraints: should handle checks in returned unions
pending
0s
Integ tests
constraints: should handle block-level checks
pending
0s
Integ tests
constraints: should handle nested-block-level checks
pending
0s
Integ tests
simple recursive type
pending
0s
Integ tests
mutually recursive type
pending
0s
\ No newline at end of file diff --git a/integ-tests/typescript/tests/integ-tests.test.ts b/integ-tests/typescript/tests/integ-tests.test.ts index 3ad7066d1..557af4fb9 100644 --- a/integ-tests/typescript/tests/integ-tests.test.ts +++ b/integ-tests/typescript/tests/integ-tests.test.ts @@ -26,6 +26,9 @@ import exp from 'constants' config() describe('Integ tests', () => { + + + describe('should work for all inputs', () => { it('single bool', async () => { const res = await b.TestFnNamedArgsSingleBool(true) @@ -346,6 +349,38 @@ describe('Integ tests', () => { expect(msgs.at(-1)).toEqual(final) }) + it('should support azure', async () => { + const res = await b.TestAzure('Donkey Kong') + expect(res.toLowerCase()).toContain('donkey') + }) + + it('should support azure streaming', async () => { + const stream = b.stream.TestAzure('Donkey Kong') + const msgs: string[] = [] + for await (const msg of stream) { + msgs.push(msg ?? '') + } + const final = await stream.getFinalResponse() + expect(final.length).toBeGreaterThan(0) + }) + + it('should fail if azure is not configured', async () => { + await expect(async () => { + await b.TestAzureFailure('Donkey Kong') + }).rejects.toThrow('BamlClientError') + }) + + // it('should fail if azure is not configured streaming', async () => { + // const stream = b.stream.TestAzureFailure('Donkey Kong') + // await expect(async () => { + // // this should throw an error, not only when we try to get the final response + // for await (const msg of stream) { + // console.log('msg', msg) + // } + // // await stream.getFinalResponse() + // }).rejects.toThrow('BamlClientError') + // }) + it('should support vertex', async () => { const res = await b.TestVertex('Donkey Kong') expect(res.toLowerCase()).toContain('donkey')