diff --git a/engine/baml-lib/llm-client/src/clients/helpers.rs b/engine/baml-lib/llm-client/src/clients/helpers.rs index da1aafe1d..c45c5ea51 100644 --- a/engine/baml-lib/llm-client/src/clients/helpers.rs +++ b/engine/baml-lib/llm-client/src/clients/helpers.rs @@ -238,7 +238,6 @@ impl PropertyHandler { .map(|(key_span, value, meta)| (key_span, UnresolvedUrl(value), meta)) } - pub fn ensure_supported_request_modes(&mut self) -> SupportedRequestModes { let result = self.ensure_bool("supports_streaming", false); match result { @@ -249,6 +248,10 @@ impl PropertyHandler { } } + pub fn ensure_any(&mut self, key: &str) -> Option<(Meta, UnresolvedValue)> { + self.options.shift_remove(key) + } + pub fn ensure_allowed_metadata(&mut self) -> UnresolvedAllowedRoleMetadata { if let Some((_, value)) = self.options.shift_remove("allowed_role_metadata") { if let Some(allowed_metadata) = value.as_array() { @@ -396,14 +399,7 @@ fn ensure_array( fn ensure_map( options: &mut IndexMap)>, key: &str, -) -> Result< - Option<( - Meta, - IndexMap)>, - Meta, - )>, - Error, -> { +) -> Result)>, Meta)>, Error> { if let Some((key_span, value)) = options.shift_remove(key) { match value.to_map() { Ok((m, meta)) => Ok(Some((key_span, m, meta))), diff --git a/engine/baml-lib/llm-client/src/clients/vertex.rs b/engine/baml-lib/llm-client/src/clients/vertex.rs index 0fc258886..a8eaf92c0 100644 --- a/engine/baml-lib/llm-client/src/clients/vertex.rs +++ b/engine/baml-lib/llm-client/src/clients/vertex.rs @@ -9,10 +9,11 @@ use serde::Deserialize; use super::helpers::{Error, PropertyHandler, UnresolvedUrl}; -#[derive(Debug, Clone)] -enum UnresolvedServiceAccountDetails { +#[derive(Debug)] +enum UnresolvedServiceAccountDetails { RawAuthorizationHeader(StringOr), - MaybeFilePath(StringOr), + MaybeFilePathOrContent(StringOr), + Object(IndexMap)>), Json(StringOr), } @@ -29,11 +30,35 @@ pub enum ResolvedServiceAccountDetails { Json(ServiceAccount), } -impl UnresolvedServiceAccountDetails { +impl UnresolvedServiceAccountDetails { + fn without_meta(&self) -> UnresolvedServiceAccountDetails<()> { + match self { + UnresolvedServiceAccountDetails::RawAuthorizationHeader(s) => { + UnresolvedServiceAccountDetails::RawAuthorizationHeader(s.clone()) + } + UnresolvedServiceAccountDetails::MaybeFilePathOrContent(s) => { + UnresolvedServiceAccountDetails::MaybeFilePathOrContent(s.clone()) + } + UnresolvedServiceAccountDetails::Object(s) => UnresolvedServiceAccountDetails::Object( + s.iter() + .map(|(k, v)| (k.clone(), ((), v.1.without_meta()))) + .collect(), + ), + UnresolvedServiceAccountDetails::Json(s) => { + UnresolvedServiceAccountDetails::Json(s.clone()) + } + } + } + fn required_env_vars(&self) -> HashSet { match self { UnresolvedServiceAccountDetails::RawAuthorizationHeader(s) => s.required_env_vars(), - UnresolvedServiceAccountDetails::MaybeFilePath(s) => s.required_env_vars(), + UnresolvedServiceAccountDetails::MaybeFilePathOrContent(s) => s.required_env_vars(), + UnresolvedServiceAccountDetails::Object(s) => s + .values() + .map(|(_, v)| v.required_env_vars()) + .flatten() + .collect(), UnresolvedServiceAccountDetails::Json(s) => s.required_env_vars(), } } @@ -43,7 +68,7 @@ impl UnresolvedServiceAccountDetails { UnresolvedServiceAccountDetails::RawAuthorizationHeader(s) => Ok( ResolvedServiceAccountDetails::RawAuthorizationHeader(s.resolve(ctx)?), ), - UnresolvedServiceAccountDetails::MaybeFilePath(s) => { + UnresolvedServiceAccountDetails::MaybeFilePathOrContent(s) => { let value = s.resolve(ctx)?; match serde_json::from_str(&value) { Ok(json) => Ok(ResolvedServiceAccountDetails::Json(json)), @@ -52,11 +77,12 @@ impl UnresolvedServiceAccountDetails { { // Not a valid JSON, so we assume it's a file path // Load the file and parse it as JSON - let file = std::fs::read_to_string(&value) - .context(format!("Failed to read service account file: {}", value))?; - let json = serde_json::from_str(&file).context(format!( - "Failed to parse service account file as JSON" + let file = std::fs::read_to_string(&value).context(format!( + "Failed to read service account file: {}", + value ))?; + let json = serde_json::from_str(&file) + .context(format!("Failed to parse service account file as JSON"))?; Ok(ResolvedServiceAccountDetails::Json(json)) } #[cfg(target_arch = "wasm32")] @@ -68,6 +94,16 @@ impl UnresolvedServiceAccountDetails { } } } + UnresolvedServiceAccountDetails::Object(s) => { + let raw = s + .iter() + .map(|(k, v)| Ok((k, v.1.resolve_serde::(ctx)?))) + .collect::>>()?; + Ok(ResolvedServiceAccountDetails::Json( + serde_json::from_value(serde_json::json!(raw)) + .context(format!("Failed to parse service account JSON"))?, + )) + } UnresolvedServiceAccountDetails::Json(s) => { let raw = s.resolve(ctx)?; Ok(ResolvedServiceAccountDetails::Json( @@ -84,7 +120,7 @@ pub struct UnresolvedVertex { // Either base_url or location base_url: either::Either, project_id: Option, - authorization: UnresolvedServiceAccountDetails, + authorization: UnresolvedServiceAccountDetails, model: StringOr, headers: IndexMap, allowed_roles: Vec, @@ -150,7 +186,7 @@ impl UnresolvedVertex { UnresolvedVertex { base_url: self.base_url.clone(), project_id: self.project_id.clone(), - authorization: self.authorization.clone(), + authorization: self.authorization.without_meta(), model: self.model.clone(), headers: self.headers.clone(), allowed_roles: self.allowed_roles.clone(), @@ -239,63 +275,59 @@ impl UnresolvedVertex { } pub fn create_from(mut properties: PropertyHandler) -> Result>> { - let credentials = properties - .ensure_string("credentials", false) - .map(|(_, v, _)| v); + let authorization = { + let credentials = properties + .ensure_any("credentials") + .map(|(_, v)| v) + .and_then(|v| match v { + UnresolvedValue::String(s, ..) => { + Some(UnresolvedServiceAccountDetails::MaybeFilePathOrContent(s)) + } + UnresolvedValue::Map(m, ..) => Some(UnresolvedServiceAccountDetails::Object(m)), + other => { + properties.push_error( + format!( + "credentials must be a string or an object. Got: {}", + other.r#type() + ), + other.meta().clone(), + ); + None + } + }); - let credentials_content = properties - .ensure_string("credentials_content", false) - .map(|(_, v, _)| v); + let credentials_content = properties + .ensure_string("credentials_content", false) + .map(|(_, v, _)| UnresolvedServiceAccountDetails::Json(v)); - let authz = properties - .ensure_string("authorization", false) - .map(|(_, v, _)| v); + let authz = properties + .ensure_string("authorization", false) + .map(|(_, v, _)| UnresolvedServiceAccountDetails::RawAuthorizationHeader(v)); - let credentials = match (credentials, credentials_content) { - (Some(credentials), Some(credentials_content)) => { - if cfg!(target_arch = "wasm32") { - Some(either::Either::Right(credentials_content)) - } else { - Some(either::Either::Left(credentials)) + match (authz, credentials, credentials_content) { + (Some(authz), _, _) => Some(authz), + (None, Some(credentials), Some(credentials_content)) => { + if cfg!(target_arch = "wasm32") { + Some(credentials_content) + } else { + Some(credentials) + } } - } - (Some(credentials), None) => Some(either::Either::Left(credentials)), - (None, Some(credentials_content)) => Some(either::Either::Right(credentials_content)), - (None, None) => { - if authz.is_some() { - None - } else { + (None, Some(credentials), None) => Some(credentials), + (None, None, Some(credentials_content)) => Some(credentials_content), + (None, None, None) => { if cfg!(target_arch = "wasm32") { - Some(either::Either::Right(StringOr::EnvVar( + Some(UnresolvedServiceAccountDetails::Json(StringOr::EnvVar( "GOOGLE_APPLICATION_CREDENTIALS_CONTENT".to_string(), ))) } else { - Some(either::Either::Left(StringOr::EnvVar( - "GOOGLE_APPLICATION_CREDENTIALS".to_string(), - ))) + Some(UnresolvedServiceAccountDetails::MaybeFilePathOrContent( + StringOr::EnvVar("GOOGLE_APPLICATION_CREDENTIALS".to_string()), + )) } } } }; - - let authorization = match (authz, credentials) { - (Some(authz), _) => Some(UnresolvedServiceAccountDetails::RawAuthorizationHeader( - authz, - )), - (None, Some(credentials)) => match credentials { - either::Either::Left(credentials) => { - Some(UnresolvedServiceAccountDetails::MaybeFilePath(credentials)) - } - either::Either::Right(credentials_content) => { - Some(UnresolvedServiceAccountDetails::Json(credentials_content)) - } - }, - (None, None) => { - properties.push_option_error("Missing either authorization or credentials"); - None - } - }; - let model = properties.ensure_string("model", true).map(|(_, v, _)| v); let base_url = { @@ -309,10 +341,8 @@ impl UnresolvedVertex { (None, Some(name)) => Some(either::Either::Right(name.1)), (Some((key_1_span, ..)), Some((key_2_span, _))) => { for key in [key_1_span, key_2_span] { - properties.push_error( - "Only one of base_url or location must be provided", - key, - ); + properties + .push_error("Only one of base_url or location must be provided", key); } None } diff --git a/integ-tests/baml_src/test-files/functions/output/map-enum-key.baml b/integ-tests/baml_src/test-files/functions/output/map-enum-key.baml index 041fd3654..3b9a1110f 100644 --- a/integ-tests/baml_src/test-files/functions/output/map-enum-key.baml +++ b/integ-tests/baml_src/test-files/functions/output/map-enum-key.baml @@ -4,11 +4,11 @@ enum MapKey { C } -// function InOutEnumMapKey(i1: map, i2: map) -> map { -// client "openai/gpt-4o" -// prompt #" -// Merge these: {{i1}} {{i2}} +function InOutEnumMapKey(i1: map, i2: map) -> map { + client "openai/gpt-4o" + prompt #" + Merge these: {{i1}} {{i2}} -// {{ ctx.output_format }} -// "# -// } + {{ ctx.output_format }} + "# +} diff --git a/integ-tests/baml_src/test-files/functions/output/map-literal-union-key.baml b/integ-tests/baml_src/test-files/functions/output/map-literal-union-key.baml index 337930531..c52f074a9 100644 --- a/integ-tests/baml_src/test-files/functions/output/map-literal-union-key.baml +++ b/integ-tests/baml_src/test-files/functions/output/map-literal-union-key.baml @@ -1,26 +1,26 @@ -// function InOutLiteralStringUnionMapKey( -// i1: map<"one" | "two" | ("three" | "four"), string>, -// i2: map<"one" | "two" | ("three" | "four"), string> -// ) -> map<"one" | "two" | ("three" | "four"), string> { -// client "openai/gpt-4o" -// prompt #" -// Merge these: +function InOutLiteralStringUnionMapKey( + i1: map<"one" | "two" | ("three" | "four"), string>, + i2: map<"one" | "two" | ("three" | "four"), string> +) -> map<"one" | "two" | ("three" | "four"), string> { + client "openai/gpt-4o" + prompt #" + Merge these: -// {{i1}} + {{i1}} -// {{i2}} + {{i2}} -// {{ ctx.output_format }} -// "# -// } + {{ ctx.output_format }} + "# +} -// function InOutSingleLiteralStringMapKey(m: map<"key", string>) -> map<"key", string> { -// client "openai/gpt-4o" -// prompt #" -// Return the same map you were given: +function InOutSingleLiteralStringMapKey(m: map<"key", string>) -> map<"key", string> { + client "openai/gpt-4o" + prompt #" + Return the same map you were given: -// {{m}} + {{m}} -// {{ ctx.output_format }} -// "# -// } + {{ ctx.output_format }} + "# +} diff --git a/integ-tests/python/baml_client/async_client.py b/integ-tests/python/baml_client/async_client.py index 3f46686af..ae4f20aa7 100644 --- a/integ-tests/python/baml_client/async_client.py +++ b/integ-tests/python/baml_client/async_client.py @@ -1315,6 +1315,75 @@ async def GetQuery( ) return cast(types.SearchParams, raw.cast_to(types, types)) + async def InOutEnumMapKey( + self, + i1: Dict[types.MapKey, str],i2: Dict[types.MapKey, str], + baml_options: BamlCallOptions = {}, + ) -> Dict[types.MapKey, 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( + "InOutEnumMapKey", + { + "i1": i1,"i2": i2, + }, + self.__ctx_manager.get(), + tb, + __cr__, + ) + return cast(Dict[types.MapKey, str], raw.cast_to(types, types)) + + async def InOutLiteralStringUnionMapKey( + self, + i1: Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str],i2: Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str], + baml_options: BamlCallOptions = {}, + ) -> Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], 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( + "InOutLiteralStringUnionMapKey", + { + "i1": i1,"i2": i2, + }, + self.__ctx_manager.get(), + tb, + __cr__, + ) + return cast(Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str], raw.cast_to(types, types)) + + async def InOutSingleLiteralStringMapKey( + self, + m: Dict[Literal["key"], str], + baml_options: BamlCallOptions = {}, + ) -> Dict[Literal["key"], 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( + "InOutSingleLiteralStringMapKey", + { + "m": m, + }, + self.__ctx_manager.get(), + tb, + __cr__, + ) + return cast(Dict[Literal["key"], str], raw.cast_to(types, types)) + async def LiteralUnionsTest( self, input: str, @@ -4361,6 +4430,98 @@ def GetQuery( self.__ctx_manager.get(), ) + def InOutEnumMapKey( + self, + i1: Dict[types.MapKey, str],i2: Dict[types.MapKey, str], + baml_options: BamlCallOptions = {}, + ) -> baml_py.BamlStream[Dict[types.MapKey, Optional[str]], Dict[types.MapKey, 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( + "InOutEnumMapKey", + { + "i1": i1, + "i2": i2, + }, + None, + self.__ctx_manager.get(), + tb, + __cr__, + ) + + return baml_py.BamlStream[Dict[types.MapKey, Optional[str]], Dict[types.MapKey, str]]( + raw, + lambda x: cast(Dict[types.MapKey, Optional[str]], x.cast_to(types, partial_types)), + lambda x: cast(Dict[types.MapKey, str], x.cast_to(types, types)), + self.__ctx_manager.get(), + ) + + def InOutLiteralStringUnionMapKey( + self, + i1: Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str],i2: Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str], + baml_options: BamlCallOptions = {}, + ) -> baml_py.BamlStream[Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], Optional[str]], Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], 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( + "InOutLiteralStringUnionMapKey", + { + "i1": i1, + "i2": i2, + }, + None, + self.__ctx_manager.get(), + tb, + __cr__, + ) + + return baml_py.BamlStream[Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], Optional[str]], Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str]]( + raw, + lambda x: cast(Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], Optional[str]], x.cast_to(types, partial_types)), + lambda x: cast(Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str], x.cast_to(types, types)), + self.__ctx_manager.get(), + ) + + def InOutSingleLiteralStringMapKey( + self, + m: Dict[Literal["key"], str], + baml_options: BamlCallOptions = {}, + ) -> baml_py.BamlStream[Dict[Literal["key"], Optional[str]], Dict[Literal["key"], 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( + "InOutSingleLiteralStringMapKey", + { + "m": m, + }, + None, + self.__ctx_manager.get(), + tb, + __cr__, + ) + + return baml_py.BamlStream[Dict[Literal["key"], Optional[str]], Dict[Literal["key"], str]]( + raw, + lambda x: cast(Dict[Literal["key"], Optional[str]], x.cast_to(types, partial_types)), + lambda x: cast(Dict[Literal["key"], str], x.cast_to(types, types)), + self.__ctx_manager.get(), + ) + def LiteralUnionsTest( self, input: str, diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py index 9067fd3d3..c0fb4f46e 100644 --- a/integ-tests/python/baml_client/inlinedbaml.py +++ b/integ-tests/python/baml_client/inlinedbaml.py @@ -74,8 +74,8 @@ "test-files/functions/output/literal-int.baml": "function FnOutputLiteralInt(input: string) -> 5 {\n client GPT35\n prompt #\"\n Return an integer: {{ ctx.output_format}}\n \"#\n}\n\ntest FnOutputLiteralInt {\n functions [FnOutputLiteralInt]\n args {\n input \"example input\"\n }\n}\n", "test-files/functions/output/literal-string.baml": "function FnOutputLiteralString(input: string) -> \"example output\" {\n client GPT35\n prompt #\"\n Return a string: {{ ctx.output_format}}\n \"#\n}\n\ntest FnOutputLiteralString {\n functions [FnOutputLiteralString]\n args {\n input \"example input\"\n }\n}\n", "test-files/functions/output/literal-unions.baml": "function LiteralUnionsTest(input: string) -> 1 | true | \"string output\" {\n client GPT35\n prompt #\"\n Return one of these values: \n {{ctx.output_format}}\n \"#\n}\n\ntest LiteralUnionsTest {\n functions [LiteralUnionsTest]\n args {\n input \"example input\"\n }\n}\n", - "test-files/functions/output/map-enum-key.baml": "enum MapKey {\n A\n B\n C\n}\n\n// function InOutEnumMapKey(i1: map, i2: map) -> map {\n// client \"openai/gpt-4o\"\n// prompt #\"\n// Merge these: {{i1}} {{i2}}\n\n// {{ ctx.output_format }}\n// \"#\n// }\n", - "test-files/functions/output/map-literal-union-key.baml": "// function InOutLiteralStringUnionMapKey(\n// i1: map<\"one\" | \"two\" | (\"three\" | \"four\"), string>, \n// i2: map<\"one\" | \"two\" | (\"three\" | \"four\"), string>\n// ) -> map<\"one\" | \"two\" | (\"three\" | \"four\"), string> {\n// client \"openai/gpt-4o\"\n// prompt #\"\n// Merge these:\n \n// {{i1}}\n \n// {{i2}}\n\n// {{ ctx.output_format }}\n// \"#\n// }\n\n// function InOutSingleLiteralStringMapKey(m: map<\"key\", string>) -> map<\"key\", string> {\n// client \"openai/gpt-4o\"\n// prompt #\"\n// Return the same map you were given:\n \n// {{m}}\n\n// {{ ctx.output_format }}\n// \"#\n// }\n", + "test-files/functions/output/map-enum-key.baml": "enum MapKey {\n A\n B\n C\n}\n\nfunction InOutEnumMapKey(i1: map, i2: map) -> map {\n client \"openai/gpt-4o\"\n prompt #\"\n Merge these: {{i1}} {{i2}}\n\n {{ ctx.output_format }}\n \"#\n}\n", + "test-files/functions/output/map-literal-union-key.baml": "function InOutLiteralStringUnionMapKey(\n i1: map<\"one\" | \"two\" | (\"three\" | \"four\"), string>, \n i2: map<\"one\" | \"two\" | (\"three\" | \"four\"), string>\n) -> map<\"one\" | \"two\" | (\"three\" | \"four\"), string> {\n client \"openai/gpt-4o\"\n prompt #\"\n Merge these:\n \n {{i1}}\n \n {{i2}}\n\n {{ ctx.output_format }}\n \"#\n}\n\nfunction InOutSingleLiteralStringMapKey(m: map<\"key\", string>) -> map<\"key\", string> {\n client \"openai/gpt-4o\"\n prompt #\"\n Return the same map you were given:\n \n {{m}}\n\n {{ ctx.output_format }}\n \"#\n}\n", "test-files/functions/output/mutually-recursive-classes.baml": "class Tree {\n data int\n children Forest\n}\n\nclass Forest {\n trees Tree[]\n}\n\nclass BinaryNode {\n data int\n left BinaryNode?\n right BinaryNode?\n}\n\nfunction BuildTree(input: BinaryNode) -> Tree {\n client GPT35\n prompt #\"\n Given the input binary tree, transform it into a generic tree using the given schema.\n\n INPUT:\n {{ input }}\n\n {{ ctx.output_format }} \n \"#\n}\n\ntest TestTree {\n functions [BuildTree]\n args {\n input {\n data 2\n left {\n data 1\n left null\n right null\n }\n right {\n data 3\n left null\n right null\n }\n }\n }\n}", "test-files/functions/output/optional-class.baml": "class ClassOptionalOutput {\n prop1 string\n prop2 string\n}\n\nfunction FnClassOptionalOutput(input: string) -> ClassOptionalOutput? {\n client GPT35\n prompt #\"\n Return a json blob for the following input:\n {{input}}\n\n {{ctx.output_format}}\n\n JSON:\n \"#\n}\n\n\nclass Blah {\n prop4 string?\n}\n\nclass ClassOptionalOutput2 {\n prop1 string?\n prop2 string?\n prop3 Blah?\n}\n\nfunction FnClassOptionalOutput2(input: string) -> ClassOptionalOutput2? {\n client GPT35\n prompt #\"\n Return a json blob for the following input:\n {{input}}\n\n {{ctx.output_format}}\n\n JSON:\n \"#\n}\n\ntest FnClassOptionalOutput2 {\n functions [FnClassOptionalOutput2, FnClassOptionalOutput]\n args {\n input \"example input\"\n }\n}\n", "test-files/functions/output/optional.baml": "class OptionalTest_Prop1 {\n omega_a string\n omega_b int\n}\n\nenum OptionalTest_CategoryType {\n Aleph\n Beta\n Gamma\n}\n \nclass OptionalTest_ReturnType {\n omega_1 OptionalTest_Prop1?\n omega_2 string?\n omega_3 (OptionalTest_CategoryType?)[]\n} \n \nfunction OptionalTest_Function(input: string) -> (OptionalTest_ReturnType?)[]\n{ \n client GPT35\n prompt #\"\n Return a JSON blob with this schema: \n {{ctx.output_format}}\n\n JSON:\n \"#\n}\n\ntest OptionalTest_Function {\n functions [OptionalTest_Function]\n args {\n input \"example input\"\n }\n}\n", diff --git a/integ-tests/python/baml_client/sync_client.py b/integ-tests/python/baml_client/sync_client.py index 4ffe803a1..d1f667c70 100644 --- a/integ-tests/python/baml_client/sync_client.py +++ b/integ-tests/python/baml_client/sync_client.py @@ -1312,6 +1312,75 @@ def GetQuery( ) return cast(types.SearchParams, raw.cast_to(types, types)) + def InOutEnumMapKey( + self, + i1: Dict[types.MapKey, str],i2: Dict[types.MapKey, str], + baml_options: BamlCallOptions = {}, + ) -> Dict[types.MapKey, 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( + "InOutEnumMapKey", + { + "i1": i1,"i2": i2, + }, + self.__ctx_manager.get(), + tb, + __cr__, + ) + return cast(Dict[types.MapKey, str], raw.cast_to(types, types)) + + def InOutLiteralStringUnionMapKey( + self, + i1: Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str],i2: Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str], + baml_options: BamlCallOptions = {}, + ) -> Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], 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( + "InOutLiteralStringUnionMapKey", + { + "i1": i1,"i2": i2, + }, + self.__ctx_manager.get(), + tb, + __cr__, + ) + return cast(Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str], raw.cast_to(types, types)) + + def InOutSingleLiteralStringMapKey( + self, + m: Dict[Literal["key"], str], + baml_options: BamlCallOptions = {}, + ) -> Dict[Literal["key"], 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( + "InOutSingleLiteralStringMapKey", + { + "m": m, + }, + self.__ctx_manager.get(), + tb, + __cr__, + ) + return cast(Dict[Literal["key"], str], raw.cast_to(types, types)) + def LiteralUnionsTest( self, input: str, @@ -4359,6 +4428,98 @@ def GetQuery( self.__ctx_manager.get(), ) + def InOutEnumMapKey( + self, + i1: Dict[types.MapKey, str],i2: Dict[types.MapKey, str], + baml_options: BamlCallOptions = {}, + ) -> baml_py.BamlSyncStream[Dict[types.MapKey, Optional[str]], Dict[types.MapKey, 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( + "InOutEnumMapKey", + { + "i1": i1, + "i2": i2, + }, + None, + self.__ctx_manager.get(), + tb, + __cr__, + ) + + return baml_py.BamlSyncStream[Dict[types.MapKey, Optional[str]], Dict[types.MapKey, str]]( + raw, + lambda x: cast(Dict[types.MapKey, Optional[str]], x.cast_to(types, partial_types)), + lambda x: cast(Dict[types.MapKey, str], x.cast_to(types, types)), + self.__ctx_manager.get(), + ) + + def InOutLiteralStringUnionMapKey( + self, + i1: Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str],i2: Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str], + baml_options: BamlCallOptions = {}, + ) -> baml_py.BamlSyncStream[Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], Optional[str]], Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], 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( + "InOutLiteralStringUnionMapKey", + { + "i1": i1, + "i2": i2, + }, + None, + self.__ctx_manager.get(), + tb, + __cr__, + ) + + return baml_py.BamlSyncStream[Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], Optional[str]], Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str]]( + raw, + lambda x: cast(Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], Optional[str]], x.cast_to(types, partial_types)), + lambda x: cast(Dict[Union[Literal["one"], Literal["two"], Union[Literal["three"], Literal["four"]]], str], x.cast_to(types, types)), + self.__ctx_manager.get(), + ) + + def InOutSingleLiteralStringMapKey( + self, + m: Dict[Literal["key"], str], + baml_options: BamlCallOptions = {}, + ) -> baml_py.BamlSyncStream[Dict[Literal["key"], Optional[str]], Dict[Literal["key"], 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( + "InOutSingleLiteralStringMapKey", + { + "m": m, + }, + None, + self.__ctx_manager.get(), + tb, + __cr__, + ) + + return baml_py.BamlSyncStream[Dict[Literal["key"], Optional[str]], Dict[Literal["key"], str]]( + raw, + lambda x: cast(Dict[Literal["key"], Optional[str]], x.cast_to(types, partial_types)), + lambda x: cast(Dict[Literal["key"], str], x.cast_to(types, types)), + self.__ctx_manager.get(), + ) + def LiteralUnionsTest( self, input: str, diff --git a/integ-tests/python/report.html b/integ-tests/python/report.html index ca3278f2d..61d9ab562 100644 --- a/integ-tests/python/report.html +++ b/integ-tests/python/report.html @@ -3,11 +3,11 @@
Test Report

Summary

100
5 failed 95 passed

Tests

tests/test_functions.py 592 0:03:08.415853

PASSED test_env_vars_reset 0:00:01.451820

Setup

Call

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

Summary

100
2 failed 98 passed

Tests

tests/test_functions.py 295 0:03:14.061376

PASSED test_env_vars_reset 0:00:01.749110

Setup

Call

Captured stdout call
Context depth is greater than 0!
 Except but ending trace!
 Context depth is greater than 0!
-
Captured stderr call
[2024-11-25T23:49:43Z WARN  baml_events] Function ExtractPeople:
-    Client: GPT4 (<unknown>) - 161ms
+
Captured stderr call
[2024-11-26T00:34:23Z WARN  baml_events] Function ExtractPeople:
+    Client: GPT4 (<unknown>) - 431ms
     ---PROMPT---
     [chat] system: You are an expert extraction algorithm. Only extract relevant information from the text. If you do not know the value of an attribute asked to extract, return null for the attribute's value.
     
@@ -33,8 +33,8 @@
         }
     }
     
-[2024-11-25T23:49:44Z INFO  baml_events] Function ExtractPeople:
-    Client: GPT4 (gpt-4o-2024-08-06) - 790ms. StopReason: stop. Tokens(in/out): 124/22
+[2024-11-26T00:34:24Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-08-06) - 783ms. StopReason: stop. Tokens(in/out): 124/22
     ---PROMPT---
     [chat] system: You are an expert extraction algorithm. Only extract relevant information from the text. If you do not know the value of an attribute asked to extract, return null for the attribute's value.
     
@@ -61,11 +61,11 @@
         "hair_color": "BLACK"
       }
     ]
-

Teardown

PASSED test_sync 0:00:01.175841

Setup

Call

Captured stdout call
got response key
+

Teardown

PASSED test_sync 0:00:00.366913

Setup

Call

Captured stdout call
got response key
 true
 52
-
Captured stderr call
[2024-11-25T23:49:45Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1172ms. StopReason: stop. Tokens(in/out): 19/5
+
Captured stderr call
[2024-11-26T00:34:25Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 363ms. StopReason: stop. Tokens(in/out): 19/5
     ---PROMPT---
     [chat] user: Print these values back to me:
     key
@@ -78,8 +78,8 @@
     52
     ---Parsed Response (string)---
     "key\ntrue\n52"
-

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.514384

Setup

Call

Captured stderr call
[2024-11-25T23:49:45Z INFO  baml_events] Function TestFnNamedArgsSingleBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 507ms. StopReason: stop. Tokens(in/out): 15/1
+

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.406893

Setup

Call

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

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.430171

Setup

Call

Captured stderr call
[2024-11-25T23:49:46Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 424ms. StopReason: stop. Tokens(in/out): 23/9
+

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.357174

Setup

Call

Captured stderr call
[2024-11-26T00:34:25Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 354ms. StopReason: stop. Tokens(in/out): 23/9
     ---PROMPT---
     [chat] user: Return this value back to me: ["a", "b", "c"]
     
@@ -96,19 +96,74 @@
     ["a", "b", "c"]
     ---Parsed Response (string)---
     "[\"a\", \"b\", \"c\"]"
-

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.411686

Setup

Call

Captured stderr call
[2024-11-25T23:49:46Z INFO  baml_events] Function LiteralUnionsTest:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 401ms. StopReason: stop. Tokens(in/out): 31/3
+

Teardown

FAILED TestAllInputs::test_return_literal_union 0:00:00.428855

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

Setup

Call

self = 
+
+>   ???
+
+tests/test_functions.py:115: 
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+self = , input = 'a'
+baml_options = {}
+
+    async def LiteralUnionsTest(
+        self,
+        input: str,
+        baml_options: BamlCallOptions = {},
+    ) -> Union[Literal[1], Literal[True], Literal["string output"]]:
+      __tb__ = baml_options.get("tb", None)
+      if __tb__ is not None:
+        tb = __tb__._tb # type: ignore (we know how to use this private attribute)
+      else:
+        tb = None
+      __cr__ = baml_options.get("client_registry", None)
+    
+      raw = await self.__runtime.call_function(
+        "LiteralUnionsTest",
+        {
+          "input": input,
+        },
+        self.__ctx_manager.get(),
+        tb,
+        __cr__,
+      )
+>     return cast(Union[Literal[1], Literal[True], Literal["string output"]], raw.cast_to(types, types))
+E     baml_py.internal_monkeypatch.BamlValidationError: BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: : Failed to find any (1 | true | "string output") in 3 items
+E       - : Expected 1, got Object([("Answer", Number(Number(1)))]).
+E       - : Expected true, got Object([("Answer", Number(Number(1)))]).
+E       - : Expected "string output", got Object([("Answer", Number(Number(1)))])., raw_output={
+E       "Answer": 1
+E     }, prompt=[chat] user: Return one of these values: 
+E     Answer in JSON using any of these schemas:
+E     1 or true or "string output"
+E     )
+
+baml_client/async_client.py:1408: BamlValidationError
Captured stderr call
[2024-11-26T00:34:26Z WARN  baml_events] Function LiteralUnionsTest:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 426ms. StopReason: stop. Tokens(in/out): 31/9
     ---PROMPT---
     [chat] user: Return one of these values: 
     Answer in JSON using any of these schemas:
     1 or true or "string output"
     
     ---LLM REPLY---
-    "true"
-    ---Parsed Response (bool)---
-    true
-

Teardown

PASSED TestAllInputs::test_constraints 0:00:01.418349

Setup

Call

Captured stderr call
[2024-11-25T23:49:48Z INFO  baml_events] Function PredictAge:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1410ms. StopReason: stop. Tokens(in/out): 116/36
+    {
+      "Answer": 1
+    }
+    ---Parsed Response (Error)---
+    Failed to coerce value: <root>: Failed to find any (1 | true | "string output") in 3 items
+      - <root>: Expected 1, got Object([("Answer", Number(Number(1)))]).
+      - <root>: Expected true, got Object([("Answer", Number(Number(1)))]).
+      - <root>: Expected "string output", got Object([("Answer", Number(Number(1)))]).
+

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.838754

Setup

Call

Captured stderr call
[2024-11-26T00:34:27Z INFO  baml_events] Function PredictAge:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 827ms. StopReason: stop. Tokens(in/out): 116/36
     ---PROMPT---
     [chat] user: Using your understanding of the historical popularity
     of names, predict the age of a person with the name
@@ -131,16 +186,16 @@
     ---LLM REPLY---
     {
       "planetary_age": {
-        "age": 56
+        "age": 41
       },
-      "certainty": 90,
+      "certainty": 100,
       "species": "Homo sapiens"
     }
     ---Parsed Response (class FooAny)---
     {
       "planetary_age": {
         "age": {
-          "value": 56,
+          "value": 41,
           "checks": {
             "young_enough": {
               "name": "young_enough",
@@ -151,7 +206,7 @@
         }
       },
       "certainty": {
-        "value": 90,
+        "value": 100,
         "checks": {
           "unreasonably_certain": {
             "name": "unreasonably_certain",
@@ -163,26 +218,26 @@
       "species": {
         "value": "Homo sapiens",
         "checks": {
-          "regex_bad": {
-            "name": "regex_bad",
-            "expression": "this|regex_match(\"neanderthalensis\")",
-            "status": "failed"
+          "trivial": {
+            "name": "trivial",
+            "expression": "this == \"Homo sapiens\"",
+            "status": "succeeded"
           },
           "regex_good": {
             "name": "regex_good",
             "expression": "this|regex_match(\"Homo\")",
             "status": "succeeded"
           },
-          "trivial": {
-            "name": "trivial",
-            "expression": "this == \"Homo sapiens\"",
-            "status": "succeeded"
+          "regex_bad": {
+            "name": "regex_bad",
+            "expression": "this|regex_match(\"neanderthalensis\")",
+            "status": "failed"
           }
         }
       }
     }
-

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.577678

Setup

Call

Captured stderr call
[2024-11-25T23:49:48Z INFO  baml_events] Function ExtractContactInfo:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 562ms. StopReason: stop. Tokens(in/out): 98/35
+

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.721323

Setup

Call

Captured stderr call
[2024-11-26T00:34:27Z INFO  baml_events] Function ExtractContactInfo:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 708ms. StopReason: stop. Tokens(in/out): 98/39
     ---PROMPT---
     [chat] user: Extract a primary contact info, and if possible a secondary contact
     info, from this document:
@@ -205,11 +260,11 @@
     
     ---LLM REPLY---
     {
-      primary: {
-        value: "help@boundaryml.com"
+      "primary": {
+        "value": "help@boundaryml.com"
       },
-      secondary: {
-        value: "111-222-3333"
+      "secondary": {
+        "value": "111-222-3333"
       }
     }
     ---Parsed Response (class ContactInfo)---
@@ -221,8 +276,8 @@
         "value": "111-222-3333"
       }
     }
-

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.365577

Setup

Call

Captured stderr call
[2024-11-25T23:49:49Z WARN  baml_events] Function ReturnMalformedConstraints:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 360ms. StopReason: stop. Tokens(in/out): 28/9
+

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.529349

Setup

Call

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

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001649

Setup

Call

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

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001317

Setup

Call

Captured stderr call
[2024-11-26T00:34:28Z 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.519636

Setup

Call

Captured stderr call
[2024-11-25T23:49:49Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 513ms. StopReason: stop. Tokens(in/out): 19/4
+

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.453934

Setup

Call

Captured stderr call
[2024-11-26T00:34:28Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 452ms. StopReason: stop. Tokens(in/out): 19/5
     ---PROMPT---
     [chat] user: Print these values back to me:
     key
@@ -250,11 +305,13 @@
     52
     
     ---LLM REPLY---
-    key true 52
+    key
+    true
+    52
     ---Parsed Response (string)---
-    "key true 52"
-

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.517362

Setup

Call

Captured stderr call
[2024-11-25T23:49:50Z INFO  baml_events] Function TestMulticlassNamedArgs:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 511ms. StopReason: stop. Tokens(in/out): 25/11
+    "key\ntrue\n52"
+

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.525176

Setup

Call

Captured stderr call
[2024-11-26T00:34:29Z INFO  baml_events] Function TestMulticlassNamedArgs:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 522ms. StopReason: stop. Tokens(in/out): 25/11
     ---PROMPT---
     [chat] user: Print these values back to me:
     key
@@ -273,8 +330,8 @@
     64
     ---Parsed Response (string)---
     "key\ntrue\n52\nkey\ntrue\n64"
-

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.430017

Setup

Call

Captured stderr call
[2024-11-25T23:49:50Z INFO  baml_events] Function TestFnNamedArgsSingleEnumList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 424ms. StopReason: stop. Tokens(in/out): 18/4
+

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.347136

Setup

Call

Captured stderr call
[2024-11-26T00:34:29Z INFO  baml_events] Function TestFnNamedArgsSingleEnumList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 344ms. StopReason: stop. Tokens(in/out): 18/4
     ---PROMPT---
     [chat] user: Print these values back to me:
     ["TWO"]
@@ -283,8 +340,8 @@
     ["TWO"]
     ---Parsed Response (string)---
     "[\"TWO\"]"
-

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.327677

Setup

Call

Captured stderr call
[2024-11-25T23:49:50Z INFO  baml_events] Function TestFnNamedArgsSingleFloat:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 321ms. StopReason: stop. Tokens(in/out): 18/3
+

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.369850

Setup

Call

Captured stderr call
[2024-11-26T00:34:30Z INFO  baml_events] Function TestFnNamedArgsSingleFloat:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 367ms. StopReason: stop. Tokens(in/out): 18/3
     ---PROMPT---
     [chat] user: Return this value back to me: 3.12
     
@@ -292,8 +349,8 @@
     3.12
     ---Parsed Response (string)---
     "3.12"
-

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.396532

Setup

Call

Captured stderr call
[2024-11-25T23:49:51Z INFO  baml_events] Function TestFnNamedArgsSingleInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 391ms. StopReason: stop. Tokens(in/out): 17/2
+

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.327321

Setup

Call

Captured stderr call
[2024-11-26T00:34:30Z INFO  baml_events] Function TestFnNamedArgsSingleInt:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 325ms. StopReason: stop. Tokens(in/out): 17/2
     ---PROMPT---
     [chat] user: Return this value back to me: 3566
     
@@ -301,8 +358,8 @@
     3566
     ---Parsed Response (string)---
     "3566"
-

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.429889

Setup

Call

Captured stderr call
[2024-11-25T23:49:51Z INFO  baml_events] Function TestNamedArgsLiteralInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 424ms. StopReason: stop. Tokens(in/out): 16/1
+

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.299279

Setup

Call

Captured stderr call
[2024-11-26T00:34:30Z INFO  baml_events] Function TestNamedArgsLiteralInt:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 297ms. StopReason: stop. Tokens(in/out): 16/1
     ---PROMPT---
     [chat] user: Return this value back to me: 1
     
@@ -310,8 +367,8 @@
     1
     ---Parsed Response (string)---
     "1"
-

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.438958

Setup

Call

Captured stderr call
[2024-11-25T23:49:52Z INFO  baml_events] Function TestNamedArgsLiteralBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 432ms. StopReason: stop. Tokens(in/out): 15/1
+

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.882065

Setup

Call

Captured stderr call
[2024-11-26T00:34:31Z INFO  baml_events] Function TestNamedArgsLiteralBool:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 880ms. StopReason: stop. Tokens(in/out): 15/1
     ---PROMPT---
     [chat] user: Return this value back to me: true
     
@@ -319,8 +376,8 @@
     true
     ---Parsed Response (string)---
     "true"
-

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.325339

Setup

Call

Captured stderr call
[2024-11-25T23:49:52Z INFO  baml_events] Function TestNamedArgsLiteralString:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 320ms. StopReason: stop. Tokens(in/out): 16/2
+

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.435087

Setup

Call

Captured stderr call
[2024-11-26T00:34:32Z INFO  baml_events] Function TestNamedArgsLiteralString:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 433ms. StopReason: stop. Tokens(in/out): 16/2
     ---PROMPT---
     [chat] user: Return this value back to me: My String
     
@@ -328,8 +385,8 @@
     My String
     ---Parsed Response (string)---
     "My String"
-

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:00.655286

Setup

Call

Captured stderr call
[2024-11-25T23:49:53Z INFO  baml_events] Function FnLiteralClassInputOutput:
-    Client: GPT4 (gpt-4o-2024-08-06) - 647ms. StopReason: stop. Tokens(in/out): 30/13
+

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:01.559398

Setup

Call

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

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.650376

Setup

Call

Captured stderr call
[2024-11-25T23:49:53Z INFO  baml_events] Function FnLiteralUnionClassInputOutput:
-    Client: GPT4 (gpt-4o-2024-08-06) - 641ms. StopReason: stop. Tokens(in/out): 49/13
+

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.642134

Setup

Call

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

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.639890

Setup

Call

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

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.504573

Setup

Call

Captured stderr call
[2024-11-26T00:34:34Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToString:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 502ms. StopReason: stop. Tokens(in/out): 29/15
     ---PROMPT---
     [chat] user: Return this value back to me: {"lorem": "ipsum", "dolor": "sit"}
     
@@ -382,8 +439,8 @@
       "lorem": "ipsum",
       "dolor": "sit"
     }
-

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.526257

Setup

Call

Captured stderr call
[2024-11-25T23:49:54Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 517ms. StopReason: stop. Tokens(in/out): 28/14
+

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.583404

Setup

Call

Captured stderr call
[2024-11-26T00:34:35Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 579ms. StopReason: stop. Tokens(in/out): 28/14
     ---PROMPT---
     [chat] user: Return this value back to me: {"lorem": {
         "word": "ipsum",
@@ -399,8 +456,8 @@
         "word": "ipsum"
       }
     }
-

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.373596

Setup

Call

Captured stderr call
[2024-11-25T23:49:55Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToMap:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 368ms. StopReason: stop. Tokens(in/out): 25/11
+

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.468936

Setup

Call

Captured stderr call
[2024-11-26T00:34:35Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToMap:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 466ms. StopReason: stop. Tokens(in/out): 25/11
     ---PROMPT---
     [chat] user: Return this value back to me: {"lorem": {"word": "ipsum"}}
     
@@ -412,36 +469,81 @@
         "word": "ipsum"
       }
     }
-

Teardown

FAILED TestAllInputs::test_enum_key_in_map 0:00:00.001133

AttributeError: 'BamlAsyncClient' object has no attribute 'InOutEnumMapKey'

Setup

Call

self = 
-
->   ???
-E   AttributeError: 'BamlAsyncClient' object has no attribute 'InOutEnumMapKey'
-
-tests/test_functions.py:237: AttributeError

Teardown

FAILED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.000550

AttributeError: 'BamlAsyncClient' object has no attribute 'InOutLiteralStringUnionMapKey'

Setup

Call

self = 
-
-    @pytest.mark.asyncio
-    async def test_literal_string_union_key_in_map(self):
->       res = await b.InOutLiteralStringUnionMapKey({"one": "1"}, {"two": "2"})
-E       AttributeError: 'BamlAsyncClient' object has no attribute 'InOutLiteralStringUnionMapKey'
-
-tests/test_functions.py:243: AttributeError

Teardown

FAILED TestAllInputs::test_single_literal_string_key_in_map 0:00:00.000515

AttributeError: 'BamlAsyncClient' object has no attribute 'InOutSingleLiteralStringMapKey'

Setup

Call

self = 
-
-    @pytest.mark.asyncio
-    async def test_single_literal_string_key_in_map(self):
->       res = await b.InOutSingleLiteralStringMapKey({"key": "1"})
-E       AttributeError: 'BamlAsyncClient' object has no attribute 'InOutSingleLiteralStringMapKey'
-
-tests/test_functions.py:249: AttributeError

Teardown

PASSED test_should_work_for_all_outputs 0:00:04.801430

Setup

Call

Captured stderr call
[2024-11-25T23:49:55Z INFO  baml_events] Function FnOutputBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 476ms. StopReason: stop. Tokens(in/out): 15/1
+

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:00.770730

Setup

Call

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

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.853689

Setup

Call

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

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:00.907595

Setup

Call

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

Teardown

PASSED test_should_work_for_all_outputs 0:00:04.834969

Setup

Call

Captured stderr call
[2024-11-26T00:34:38Z INFO  baml_events] Function FnOutputBool:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 332ms. StopReason: stop. Tokens(in/out): 15/1
     ---PROMPT---
     [chat] user: Return a true: Answer as a bool
     
     ---LLM REPLY---
-    True
+    true
     ---Parsed Response (bool)---
     true
-[2024-11-25T23:49:56Z INFO  baml_events] Function FnOutputInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 674ms. StopReason: stop. Tokens(in/out): 17/1
+[2024-11-26T00:34:39Z INFO  baml_events] Function FnOutputInt:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 365ms. StopReason: stop. Tokens(in/out): 17/1
     ---PROMPT---
     [chat] user: Return the integer 5 with no additional context.
     
@@ -449,18 +551,18 @@
     5
     ---Parsed Response (int)---
     5
-[2024-11-25T23:49:57Z INFO  baml_events] Function FnOutputLiteralInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 485ms. StopReason: stop. Tokens(in/out): 18/1
+[2024-11-26T00:34:39Z INFO  baml_events] Function FnOutputLiteralInt:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 398ms. StopReason: stop. Tokens(in/out): 18/7
     ---PROMPT---
     [chat] user: Return an integer: Answer using this specific value:
     5
     
     ---LLM REPLY---
-    5
+    The integer value is 5.
     ---Parsed Response (int)---
     5
-[2024-11-25T23:49:57Z INFO  baml_events] Function FnOutputLiteralBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 334ms. StopReason: stop. Tokens(in/out): 18/1
+[2024-11-26T00:34:39Z INFO  baml_events] Function FnOutputLiteralBool:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 308ms. StopReason: stop. Tokens(in/out): 18/1
     ---PROMPT---
     [chat] user: Return a false: Answer using this specific value:
     false
@@ -469,18 +571,18 @@
     false
     ---Parsed Response (bool)---
     false
-[2024-11-25T23:49:57Z INFO  baml_events] Function FnOutputLiteralString:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 366ms. StopReason: stop. Tokens(in/out): 21/4
+[2024-11-26T00:34:40Z INFO  baml_events] Function FnOutputLiteralString:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 716ms. StopReason: stop. Tokens(in/out): 21/8
     ---PROMPT---
     [chat] user: Return a string: Answer using this specific value:
     "example output"
     
     ---LLM REPLY---
-    "example output"
+    The answer is: "example output"
     ---Parsed Response (string)---
     "example output"
-[2024-11-25T23:49:58Z INFO  baml_events] Function FnOutputClassList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 609ms. StopReason: stop. Tokens(in/out): 46/22
+[2024-11-26T00:34:41Z INFO  baml_events] Function FnOutputClassList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 719ms. StopReason: stop. Tokens(in/out): 46/62
     ---PROMPT---
     [chat] user: Return a JSON array that follows this schema: 
     Answer with a JSON Array using this schema:
@@ -496,19 +598,35 @@
     ---LLM REPLY---
     [
       {
-        "prop1": "Hello",
-        "prop2": 42
+        "prop1": "apple",
+        "prop2": 10
+      },
+      {
+        "prop1": "banana",
+        "prop2": 20
+      },
+      {
+        "prop1": "orange",
+        "prop2": 15
       }
     ]
     ---Parsed Response (list<class TestOutputClass>)---
     [
       {
-        "prop1": "Hello",
-        "prop2": 42
+        "prop1": "apple",
+        "prop2": 10
+      },
+      {
+        "prop1": "banana",
+        "prop2": 20
+      },
+      {
+        "prop1": "orange",
+        "prop2": 15
       }
     ]
-[2024-11-25T23:49:58Z INFO  baml_events] Function FnOutputClassWithEnum:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 411ms. StopReason: stop. Tokens(in/out): 48/19
+[2024-11-26T00:34:41Z INFO  baml_events] Function FnOutputClassWithEnum:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 487ms. StopReason: stop. Tokens(in/out): 48/20
     ---PROMPT---
     [chat] user: Return a made up json blob that matches this schema:
     Answer in JSON using this schema:
@@ -522,16 +640,16 @@
     
     ---LLM REPLY---
     {
-      "prop1": "Hello",
+      "prop1": "Hello World",
       "prop2": "TWO"
     }
     ---Parsed Response (class TestClassWithEnum)---
     {
-      "prop1": "Hello",
+      "prop1": "Hello World",
       "prop2": "TWO"
     }
-[2024-11-25T23:49:59Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 411ms. StopReason: stop. Tokens(in/out): 50/18
+[2024-11-26T00:34:42Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 510ms. StopReason: stop. Tokens(in/out): 50/20
     ---PROMPT---
     [chat] user: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -546,16 +664,16 @@
     
     ---LLM REPLY---
     {
-      "prop1": "example",
+      "prop1": "Hello, World!",
       "prop2": 540
     }
     ---Parsed Response (class TestOutputClass)---
     {
-      "prop1": "example",
+      "prop1": "Hello, World!",
       "prop2": 540
     }
-[2024-11-25T23:49:59Z INFO  baml_events] Function FnEnumListOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 466ms. StopReason: stop. Tokens(in/out): 51/11
+[2024-11-26T00:34:42Z INFO  baml_events] Function FnEnumListOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 380ms. StopReason: stop. Tokens(in/out): 51/12
     ---PROMPT---
     [chat] user: Print out two of these values randomly selected from the list below in a json array.
     
@@ -568,16 +686,16 @@
     
     ---LLM REPLY---
     [
-      'ONE',
+      'TWO',
       'THREE'
     ]
     ---Parsed Response (list<enum EnumOutput>)---
     [
-      "ONE",
+      "TWO",
       "THREE"
     ]
-[2024-11-25T23:50:00Z INFO  baml_events] Function FnEnumOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 521ms. StopReason: stop. Tokens(in/out): 42/28
+[2024-11-26T00:34:43Z INFO  baml_events] Function FnEnumOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 593ms. StopReason: stop. Tokens(in/out): 42/26
     ---PROMPT---
     [chat] user: Choose one of these values randomly. Before you give the answer, write out an unrelated haiku about the ocean.
     
@@ -588,24 +706,24 @@
     - THREE
     
     ---LLM REPLY---
-    Waves crash upon rocks
-    Majestic tides ebb and flow
-    Ocean's vast beauty
+    Waves crash on the shore
+    Whispers of the deep blue sea
+    Nature's symphony
     
-    The randomly selected value is: TWO
+    Randomly selected value: TWO
     ---Parsed Response (enum EnumOutput)---
     "TWO"
-

Teardown

PASSED test_should_work_with_image_url 0:00:01.719258

Setup

Call

Captured stderr call
[2024-11-25T23:50:01Z INFO  baml_events] Function TestImageInput:
-    Client: GPT4o (gpt-4o-2024-08-06) - 1712ms. StopReason: stop. Tokens(in/out): 275/7
+

Teardown

PASSED test_should_work_with_image_url 0:00:01.997576

Setup

Call

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

Teardown

PASSED test_should_work_with_image_list 0:00:03.334326

Setup

Call

Captured stderr call
[2024-11-25T23:50:05Z INFO  baml_events] Function TestImageListInput:
-    Client: GPT4o (gpt-4o-2024-08-06) - 3330ms. StopReason: stop. Tokens(in/out): 528/9
+    "Green ogre, brown vest."
+

Teardown

PASSED test_should_work_with_image_list 0:00:03.173481

Setup

Call

Captured stderr call
[2024-11-26T00:34:48Z INFO  baml_events] Function TestImageListInput:
+    Client: GPT4o (gpt-4o-2024-08-06) - 3169ms. StopReason: stop. Tokens(in/out): 528/9
     ---PROMPT---
     [chat] user: What colors do these have in common? [<image_placeholder: https://upload.wikimedia.org/wikipedia/en/4/4d/Shrek_%28character%29.png>,<image_placeholder: https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png>]
     
@@ -613,43 +731,47 @@
     The images have the color green in common.
     ---Parsed Response (string)---
     "The images have the color green in common."
-

Teardown

PASSED test_should_work_with_vertex 0:00:08.598844

Setup

Call

Captured stderr call
[2024-11-25T23:50:13Z INFO  baml_events] Function TestVertex:
-    Client: Vertex () - 8593ms. StopReason: "STOP". Tokens(in/out): 8/427
+

Teardown

PASSED test_should_work_with_vertex 0:00:11.122248

Setup

Call

Captured stderr call
[2024-11-26T00:34:59Z INFO  baml_events] Function TestVertex:
+    Client: Vertex () - 11117ms. StopReason: "STOP". Tokens(in/out): 8/563
     ---PROMPT---
     [chat] user: Write a nice short story about donkey kong
     
     ---LLM REPLY---
-    The jungle was alive with the sound of birdsong and chattering monkeys.  Donkey Kong, however, was having a terrible morning. He'd awoken to find his favorite banana tree completely bare. Not a single, solitary banana remained. 
+    The morning sun, dappled and green through the jungle canopy, woke Donkey Kong with a yawn. He scratched his furry belly, remembering the dream he'd had – a mountain of perfectly ripe bananas, each one singing a merry tune. He glanced over at the pile of bananas beside him, already half gone from his midnight snack. 
+    
+    His stomach rumbled, reminding him of more important matters. Food. He grabbed a plump banana and peeled it with practiced ease. Just as he was about to take a bite, a tiny voice squeaked, "Daddy, I want banana!"
     
-    Grumbling, Donkey Kong scratched his head. He'd have to venture into the deeper parts of the jungle, a place he usually avoided. It was awfully quiet there, too quiet. And the shadows were long and mysterious.
+    Donkey Kong smiled. His little buddy, Diddy Kong, was awake. Diddy, full of energy even before breakfast, was already bouncing around like a furry pinball. Donkey Kong chuckled and broke the banana in half, offering one to Diddy. 
     
-    He lumbered down a path he vaguely remembered, the air growing thick and humid. Giant ferns swayed gently, and colorful orchids clung to the massive trees.  Just then, he heard a soft whimper. 
+    "Easy now, little buddy," he rumbled, his voice deep and booming. "We need to go find more bananas after breakfast."
     
-    Donkey Kong stopped, his fur bristling. He peered through the foliage and saw a small, shivering figure huddled at the base of a tree. It was a baby tiger, its orange and black stripes barely visible in the dim light. 
+    Diddy, mouth full of banana, nodded vigorously. After a quick breakfast, they set off into the jungle. Donkey Kong moved with surprising grace for his size, swinging from vines and leaping over streams. Diddy followed close behind, mimicking his every move with his own brand of chaotic energy.
     
-    The little creature looked up at Donkey Kong with wide, frightened eyes. It was clear the cub was lost and alone.  Donkey Kong's heart softened. He might be the "King of the Jungle," but even he couldn't resist helping a creature in need.
+    They searched high and low, but the banana trees seemed to be strangely empty.  Discouraged, they came to a stop by a rushing waterfall. Just as Donkey Kong was about to suggest they head back, Diddy let out a joyous whoop. 
     
-    He gently scooped up the baby tiger, its fur surprisingly soft against his calloused fingers. The cub snuggled into Donkey Kong's chest, letting out a small purr of contentment.
+    "Look, Daddy!" He pointed towards a small cave hidden behind the cascading water.  Donkey Kong squinted. He could just make out a faint golden glow emanating from within. Could it be…?
     
-    Donkey Kong spent the rest of the day searching for the cub's mother, his own hunger forgotten. Finally, as the sun began to set, they found her by a watering hole, pacing anxiously.
+    With a roar of determination, Donkey Kong plunged through the waterfall.  Diddy, a little worried, followed close behind. The cave was small, but what it lacked in size, it made up for in sheer, glorious abundance. 
     
-    The reunion was joyous, filled with happy growls and purrs. The mother tiger nuzzled her cub, then turned her grateful eyes to Donkey Kong.
+    Bananas.
     
-    As Donkey Kong made his way back, the setting sun painting the sky in hues of orange and purple, he realized he wasn't hungry anymore. He'd found something better than bananas that day; he'd found kindness and courage within himself, proving that even a "King" can have a heart of gold. 
+    Mountains of them, piled high to the ceiling.  Each one was perfectly ripe, glowing with an ethereal light. Donkey Kong and Diddy stared, speechless for a moment, before erupting in joyous yells.  Diddy jumped up and down, his signature red cap almost flying off his head. Donkey Kong let out a triumphant roar that echoed through the jungle.
+    
+    They feasted until they could eat no more, filling their tummies and their hearts with happiness. It was the best banana discovery ever, and as Donkey Kong settled down for a nap, his belly full and Diddy snuggled sleepily by his side, he knew that no matter what tomorrow brought, they would face it together, fueled by friendship and the memory of the secret cave of glowing bananas. 
     
     ---Parsed Response (string)---
-    "The jungle was alive with the sound of birdsong and chattering monkeys.  Donkey Kong, however, was having a terrible morning. He'd awoken to find his favorite banana tree completely bare. Not a single, solitary banana remained. \n\nGrumbling, Donkey Kong scratched his head. He'd have to venture into the deeper parts of the jungle, a place he usually avoided. It was awfully quiet there, too quiet. And the shadows were long and mysterious.\n\nHe lumbered down a path he vaguely remembered, the air growing thick and humid. Giant ferns swayed gently, and colorful orchids clung to the massive trees.  Just then, he heard a soft whimper. \n\nDonkey Kong stopped, his fur bristling. He peered through the foliage and saw a small, shivering figure huddled at the base of a tree. It was a baby tiger, its orange and black stripes barely visible in the dim light. \n\nThe little creature looked up at Donkey Kong with wide, frightened eyes. It was clear the cub was lost and alone.  Donkey Kong's heart softened. He might be the \"King of the Jungle,\" but even he couldn't resist helping a creature in need.\n\nHe gently scooped up the baby tiger, its fur surprisingly soft against his calloused fingers. The cub snuggled into Donkey Kong's chest, letting out a small purr of contentment.\n\nDonkey Kong spent the rest of the day searching for the cub's mother, his own hunger forgotten. Finally, as the sun began to set, they found her by a watering hole, pacing anxiously.\n\nThe reunion was joyous, filled with happy growls and purrs. The mother tiger nuzzled her cub, then turned her grateful eyes to Donkey Kong.\n\nAs Donkey Kong made his way back, the setting sun painting the sky in hues of orange and purple, he realized he wasn't hungry anymore. He'd found something better than bananas that day; he'd found kindness and courage within himself, proving that even a \"King\" can have a heart of gold. \n"
-

Teardown

PASSED test_should_work_with_image_base64 0:00:01.344848

Setup

Call

Captured stderr call
[2024-11-25T23:50:15Z INFO  baml_events] Function TestImageInput:
-    Client: GPT4o (gpt-4o-2024-08-06) - 1326ms. StopReason: stop. Tokens(in/out): 275/6
+    "The morning sun, dappled and green through the jungle canopy, woke Donkey Kong with a yawn. He scratched his furry belly, remembering the dream he'd had – a mountain of perfectly ripe bananas, each one singing a merry tune. He glanced over at the pile of bananas beside him, already half gone from his midnight snack. \n\nHis stomach rumbled, reminding him of more important matters. Food. He grabbed a plump banana and peeled it with practiced ease. Just as he was about to take a bite, a tiny voice squeaked, \"Daddy, I want banana!\"\n\nDonkey Kong smiled. His little buddy, Diddy Kong, was awake. Diddy, full of energy even before breakfast, was already bouncing around like a furry pinball. Donkey Kong chuckled and broke the banana in half, offering one to Diddy. \n\n\"Easy now, little buddy,\" he rumbled, his voice deep and booming. \"We need to go find more bananas after breakfast.\"\n\nDiddy, mouth full of banana, nodded vigorously. After a quick breakfast, they set off into the jungle. Donkey Kong moved with surprising grace for his size, swinging from vines and leaping over streams. Diddy followed close behind, mimicking his every move with his own brand of chaotic energy.\n\nThey searched high and low, but the banana trees seemed to be strangely empty.  Discouraged, they came to a stop by a rushing waterfall. Just as Donkey Kong was about to suggest they head back, Diddy let out a joyous whoop. \n\n\"Look, Daddy!\" He pointed towards a small cave hidden behind the cascading water.  Donkey Kong squinted. He could just make out a faint golden glow emanating from within. Could it be…?\n\nWith a roar of determination, Donkey Kong plunged through the waterfall.  Diddy, a little worried, followed close behind. The cave was small, but what it lacked in size, it made up for in sheer, glorious abundance. \n\nBananas.\n\nMountains of them, piled high to the ceiling.  Each one was perfectly ripe, glowing with an ethereal light. Donkey Kong and Diddy stared, speechless for a moment, before erupting in joyous yells.  Diddy jumped up and down, his signature red cap almost flying off his head. Donkey Kong let out a triumphant roar that echoed through the jungle.\n\nThey feasted until they could eat no more, filling their tummies and their hearts with happiness. It was the best banana discovery ever, and as Donkey Kong settled down for a nap, his belly full and Diddy snuggled sleepily by his side, he knew that no matter what tomorrow brought, they would face it together, fueled by friendship and the memory of the secret cave of glowing bananas. \n"
+

Teardown

PASSED test_should_work_with_image_base64 0:00:01.577244

Setup

Call

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

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.065438

Setup

Call

Captured stderr call
[2024-11-25T23:50:16Z INFO  baml_events] Function AudioInput:
-    Client: Gemini () - 1059ms. StopReason: "STOP". Tokens(in/out): 114/1
+    "Green, smiling, animated ogre."
+

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.141043

Setup

Call

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

Teardown

PASSED test_should_work_with_audio_url 0:00:01.306774

Setup

Call

Captured stderr call
[2024-11-25T23:50:17Z INFO  baml_events] Function AudioInput:
-    Client: Gemini () - 1051ms. StopReason: "STOP". Tokens(in/out): 178/1
+

Teardown

PASSED test_should_work_with_audio_url 0:00:01.322203

Setup

Call

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

Teardown

PASSED test_works_with_retries2 0:00:02.205006

Setup

Call

Captured stdout call
Expected error LLM call failed: LLMErrorResponse { client: "RetryClientExponential", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1732578619, tv_nsec: 541419000 }, latency: 213.158625ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
-
Captured stderr call
[2024-11-25T23:50:19Z WARN  baml_events] Function TestRetryExponential:
+

Teardown

PASSED test_works_with_retries2 0:00:02.572222

Setup

Call

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

Teardown

PASSED test_works_with_fallbacks 0:00:01.999788

Setup

Call

Captured stderr call
[2024-11-25T23:50:21Z INFO  baml_events] Function TestFallbackClient:
+

Teardown

PASSED test_works_with_fallbacks 0:00:02.786931

Setup

Call

Captured stderr call
[2024-11-26T00:35:08Z INFO  baml_events] Function TestFallbackClient:
     (5 other previous tries)
-    Client: GPT35 (gpt-3.5-turbo-0125) - 466ms. StopReason: stop. Tokens(in/out): 14/16
+    Client: GPT35 (gpt-3.5-turbo-0125) - 688ms. StopReason: stop. Tokens(in/out): 14/16
     ---PROMPT---
     [chat] user: Say a haiku about mexico.
     
     ---LLM REPLY---
-    Mexico's warm sun,
-    Ancient ruins tell stories,
-    Culture rich and bright.
+    Colorful fiestas
+    Mariachis playing tunes
+    Mexico's charm shines
     ---Parsed Response (string)---
-    "Mexico's warm sun,\nAncient ruins tell stories,\nCulture rich and bright."
-

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.034739

Setup

Call

Captured stderr call
[2024-11-25T23:50:21Z WARN  baml_events] Function TestSingleFallbackClient:
-    Client: FaultyAzureClient (<unknown>) - 31ms
+    "Colorful fiestas\nMariachis playing tunes\nMexico's charm shines"
+

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.028621

Setup

Call

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

Teardown

PASSED test_claude 0:00:01.062545

Setup

Call

Captured stderr call
[2024-11-25T23:50:22Z INFO  baml_events] Function PromptTestClaude:
-    Client: Sonnet (claude-3-5-sonnet-20241022) - 1057ms. StopReason: "end_turn". Tokens(in/out): 19/34
+

Teardown

PASSED test_claude 0:00:01.943309

Setup

Call

Captured stderr call
[2024-11-26T00:35:10Z INFO  baml_events] Function PromptTestClaude:
+    Client: Sonnet (claude-3-5-sonnet-20241022) - 1939ms. StopReason: "end_turn". Tokens(in/out): 19/35
     ---PROMPT---
     [chat] user: Tell me a haiku about Mt Rainier is tall
     
     ---LLM REPLY---
     Here's a haiku about Mt. Rainier:
     
-    Rainier stands proud, high
-    Ancient glacier-crowned giant
-    Pierce the summer sky
+    Rainier stands proud, bold
+    Fourteen thousand feet of snow
+    Pierce the summer clouds
     ---Parsed Response (string)---
-    "Here's a haiku about Mt. Rainier:\n\nRainier stands proud, high\nAncient glacier-crowned giant\nPierce the summer sky"
-

Teardown

PASSED test_gemini 0:00:09.092669

Setup

Call

Captured stdout call
LLM output from Gemini: Dottie Mae hummed along to the radio, a tuneless melody that matched the rhythm of her stirring. The scent of simmering peaches filled her tiny kitchen, sweet and tangy. It was Wednesday, which meant peach cobbler day at the Dew Drop Inn, and no one made a peach cobbler like Dottie Mae.
-
-Except maybe, she thought, dipping a spoon into the bubbling fruit, for the good doctor himself.
-
-Dr Pepper had been coming to the Dew Drop Inn every Wednesday for the past year, always ordering a slice of Dottie Mae's cobbler and a glass of milk. He never spoke much, a quiet, bespectacled man with kind eyes and a gentle smile. But his silence was a comfortable one, and Dottie Mae found herself looking forward to his visits.
-
-He always left a five-dollar tip, an extravagance in their small town. But it was the note he left on the napkin, under the money, that warmed her heart. "This," it always read in his neat, precise handwriting, "is a little taste of heaven."
+    "Here's a haiku about Mt. Rainier:\n\nRainier stands proud, bold\nFourteen thousand feet of snow\nPierce the summer clouds"
+

Teardown

PASSED test_gemini 0:00:07.602795

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pete Pepper wasn't a real doctor, but his name always elicited a chuckle. He owned a small, dusty bookstore tucked between a bakery and a vintage clothing shop. It was the kind of place where sunlight snuck through the cracks in the blinds, illuminating motes of dust dancing above stacks of forgotten stories. 
 
-Today, though, Dr Pepper looked troubled. He ate his cobbler slowly, his usual smile absent.  Finally, he looked up, a hesitant expression on his face.
+One rainy afternoon, a young girl named Lily shuffled in, her frown deeper than the puddles gathering on the sidewalk outside. "My dad says reading is boring," she mumbled, kicking at a loose floorboard. 
 
-"Dottie Mae," he began, his voice soft, "this cobbler… it reminds me of my mother's. She used to make it for me every Wednesday."
+Dr. Pete, perched on a rolling ladder behind the counter, raised an eyebrow. "Did he now?" He hopped down, his knees protesting with a loud creak. "And what does your dad find exciting?"
 
-Dottie Mae's heart ached for the sadness in his eyes.  She knew he had lost his parents a few years back.
+"He likes fixing cars," Lily admitted, her voice barely a whisper. "He says books don't go anywhere."
 
-"She… she used to say," Dr Pepper's voice cracked, "that it was the taste of home."
+Dr. Pete smiled, his eyes twinkling. "Ah, but that's where he's wrong," he said, leading Lily through a labyrinth of bookshelves. "Books take you everywhere! They can take you to the moon, to the bottom of the ocean, even inside a car engine!" 
 
-He cleared his throat, looking away. "I… I just wanted you to know."
+He pulled out a book with a shiny cover depicting a sleek red race car. Lily's eyes widened. Dr. Pete opened it, and they both leaned in, the scent of old paper and ink filling the air. 
 
-Dottie Mae reached across the counter and covered his hand with hers.  "Your mama raised a fine son, Doctor," she said softly. "And I'm right proud to share a little taste of home with you."
+From that day on, Lily became a regular, her initial frown replaced by a wide, gap-toothed grin. The bookstore, once silent, echoed with her laughter as she devoured tales of daring adventurers, fantastical creatures, and yes, even the intricate workings of car engines. 
 
-Dr Pepper looked up, his eyes shining. He squeezed her hand, a small, grateful smile lighting up his face.
+Dr. Pete, with a twinkle in his eye and a book in his hand, had proven that sometimes, the most exciting journeys start in the quiet corners of a dusty bookstore. 
 
-And in that moment, the Dew Drop Inn, filled with the aroma of peaches and kindness, felt a lot like home. 
-
-
Captured stderr call
[2024-11-25T23:50:31Z INFO  baml_events] Function TestGemini:
-    Client: Gemini () - 9088ms. StopReason: "STOP". Tokens(in/out): 10/467
+
Captured stderr call
[2024-11-26T00:35:18Z INFO  baml_events] Function TestGemini:
+    Client: Gemini () - 7596ms. StopReason: "STOP". Tokens(in/out): 10/387
     ---PROMPT---
     [chat] user: Write a nice short story about Dr. Pepper
     
     ---LLM REPLY---
-    Dottie Mae hummed along to the radio, a tuneless melody that matched the rhythm of her stirring. The scent of simmering peaches filled her tiny kitchen, sweet and tangy. It was Wednesday, which meant peach cobbler day at the Dew Drop Inn, and no one made a peach cobbler like Dottie Mae.
-    
-    Except maybe, she thought, dipping a spoon into the bubbling fruit, for the good doctor himself.
-    
-    Dr Pepper had been coming to the Dew Drop Inn every Wednesday for the past year, always ordering a slice of Dottie Mae's cobbler and a glass of milk. He never spoke much, a quiet, bespectacled man with kind eyes and a gentle smile. But his silence was a comfortable one, and Dottie Mae found herself looking forward to his visits.
-    
-    He always left a five-dollar tip, an extravagance in their small town. But it was the note he left on the napkin, under the money, that warmed her heart. "This," it always read in his neat, precise handwriting, "is a little taste of heaven."
+    Dr. Pete Pepper wasn't a real doctor, but his name always elicited a chuckle. He owned a small, dusty bookstore tucked between a bakery and a vintage clothing shop. It was the kind of place where sunlight snuck through the cracks in the blinds, illuminating motes of dust dancing above stacks of forgotten stories. 
     
-    Today, though, Dr Pepper looked troubled. He ate his cobbler slowly, his usual smile absent.  Finally, he looked up, a hesitant expression on his face.
+    One rainy afternoon, a young girl named Lily shuffled in, her frown deeper than the puddles gathering on the sidewalk outside. "My dad says reading is boring," she mumbled, kicking at a loose floorboard. 
     
-    "Dottie Mae," he began, his voice soft, "this cobbler… it reminds me of my mother's. She used to make it for me every Wednesday."
+    Dr. Pete, perched on a rolling ladder behind the counter, raised an eyebrow. "Did he now?" He hopped down, his knees protesting with a loud creak. "And what does your dad find exciting?"
     
-    Dottie Mae's heart ached for the sadness in his eyes.  She knew he had lost his parents a few years back.
+    "He likes fixing cars," Lily admitted, her voice barely a whisper. "He says books don't go anywhere."
     
-    "She… she used to say," Dr Pepper's voice cracked, "that it was the taste of home."
+    Dr. Pete smiled, his eyes twinkling. "Ah, but that's where he's wrong," he said, leading Lily through a labyrinth of bookshelves. "Books take you everywhere! They can take you to the moon, to the bottom of the ocean, even inside a car engine!" 
     
-    He cleared his throat, looking away. "I… I just wanted you to know."
+    He pulled out a book with a shiny cover depicting a sleek red race car. Lily's eyes widened. Dr. Pete opened it, and they both leaned in, the scent of old paper and ink filling the air. 
     
-    Dottie Mae reached across the counter and covered his hand with hers.  "Your mama raised a fine son, Doctor," she said softly. "And I'm right proud to share a little taste of home with you."
+    From that day on, Lily became a regular, her initial frown replaced by a wide, gap-toothed grin. The bookstore, once silent, echoed with her laughter as she devoured tales of daring adventurers, fantastical creatures, and yes, even the intricate workings of car engines. 
     
-    Dr Pepper looked up, his eyes shining. He squeezed her hand, a small, grateful smile lighting up his face.
-    
-    And in that moment, the Dew Drop Inn, filled with the aroma of peaches and kindness, felt a lot like home. 
+    Dr. Pete, with a twinkle in his eye and a book in his hand, had proven that sometimes, the most exciting journeys start in the quiet corners of a dusty bookstore. 
     
     ---Parsed Response (string)---
-    "Dottie Mae hummed along to the radio, a tuneless melody that matched the rhythm of her stirring. The scent of simmering peaches filled her tiny kitchen, sweet and tangy. It was Wednesday, which meant peach cobbler day at the Dew Drop Inn, and no one made a peach cobbler like Dottie Mae.\n\nExcept maybe, she thought, dipping a spoon into the bubbling fruit, for the good doctor himself.\n\nDr Pepper had been coming to the Dew Drop Inn every Wednesday for the past year, always ordering a slice of Dottie Mae's cobbler and a glass of milk. He never spoke much, a quiet, bespectacled man with kind eyes and a gentle smile. But his silence was a comfortable one, and Dottie Mae found herself looking forward to his visits.\n\nHe always left a five-dollar tip, an extravagance in their small town. But it was the note he left on the napkin, under the money, that warmed her heart. \"This,\" it always read in his neat, precise handwriting, \"is a little taste of heaven.\"\n\nToday, though, Dr Pepper looked troubled. He ate his cobbler slowly, his usual smile absent.  Finally, he looked up, a hesitant expression on his face.\n\n\"Dottie Mae,\" he began, his voice soft, \"this cobbler… it reminds me of my mother's. She used to make it for me every Wednesday.\"\n\nDottie Mae's heart ached for the sadness in his eyes.  She knew he had lost his parents a few years back.\n\n\"She… she used to say,\" Dr Pepper's voice cracked, \"that it was the taste of home.\"\n\nHe cleared his throat, looking away. \"I… I just wanted you to know.\"\n\nDottie Mae reached across the counter and covered his hand with hers.  \"Your mama raised a fine son, Doctor,\" she said softly. \"And I'm right proud to share a little taste of home with you.\"\n\nDr Pepper looked up, his eyes shining. He squeezed her hand, a small, grateful smile lighting up his face.\n\nAnd in that moment, the Dew Drop Inn, filled with the aroma of peaches and kindness, felt a lot like home. \n"
-

Teardown

PASSED test_gemini_streaming 0:00:08.066244

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pete Pepper wasn't a medical doctor, despite his name and the persistent rumor among the squirrels in the park.  He was a botanist, obsessed with the secret lives of plants.  His small apartment overflowed with greenery, vines creating a living tapestry on the walls, mushrooms sprouting happily in dimly lit corners.  He talked to his plants, sang them opera, and swore he saw their leaves tremble with delight.
+    "Dr. Pete Pepper wasn't a real doctor, but his name always elicited a chuckle. He owned a small, dusty bookstore tucked between a bakery and a vintage clothing shop. It was the kind of place where sunlight snuck through the cracks in the blinds, illuminating motes of dust dancing above stacks of forgotten stories. \n\nOne rainy afternoon, a young girl named Lily shuffled in, her frown deeper than the puddles gathering on the sidewalk outside. \"My dad says reading is boring,\" she mumbled, kicking at a loose floorboard. \n\nDr. Pete, perched on a rolling ladder behind the counter, raised an eyebrow. \"Did he now?\" He hopped down, his knees protesting with a loud creak. \"And what does your dad find exciting?\"\n\n\"He likes fixing cars,\" Lily admitted, her voice barely a whisper. \"He says books don't go anywhere.\"\n\nDr. Pete smiled, his eyes twinkling. \"Ah, but that's where he's wrong,\" he said, leading Lily through a labyrinth of bookshelves. \"Books take you everywhere! They can take you to the moon, to the bottom of the ocean, even inside a car engine!\" \n\nHe pulled out a book with a shiny cover depicting a sleek red race car. Lily's eyes widened. Dr. Pete opened it, and they both leaned in, the scent of old paper and ink filling the air. \n\nFrom that day on, Lily became a regular, her initial frown replaced by a wide, gap-toothed grin. The bookstore, once silent, echoed with her laughter as she devoured tales of daring adventurers, fantastical creatures, and yes, even the intricate workings of car engines. \n\nDr. Pete, with a twinkle in his eye and a book in his hand, had proven that sometimes, the most exciting journeys start in the quiet corners of a dusty bookstore. \n"
+

Teardown

PASSED test_gemini_streaming 0:00:08.970334

Setup

Call

Captured stdout call
LLM output from Gemini: The old diner was quiet, the silence broken only by the rhythmic whir of the ceiling fan and the sizzle of the grill. A lone figure sat at the counter, a Stetson pulled low over his eyes. He was nursing a glass of something dark and mysterious, the ice clinking softly against the rim. 
+
+Ellie, the diner owner, knew the drink well. "Another Dr. Pepper, Earl?" she asked, wiping down the counter with a practiced hand. 
+
+Earl chuckled, a low rumble in his chest. "Ain't nothin' else like it, Ellie. Not in this town, not in this world."
 
-One day, while rummaging through a box of his eccentric Aunt Millie's belongings, Dr. Pepper found a seed. It was unlike any he’d seen: smooth, obsidian black, pulsing faintly with an inner light.  Intrigued, he planted it, nurturing it with a fervor bordering on obsession.
+Ellie smiled, knowing the truth behind his words. Dr. Pepper wasn't just a drink in this town; it was a legend. They said it tasted like the West Texas wind after a storm, like freedom and possibility all bottled up.
 
-Weeks passed, then months.  Just when Dr. Pepper was about to concede defeat, a single, velvety black shoot emerged from the soil. It grew with astonishing speed, unfurling into a plant of otherworldly beauty.  Its leaves shimmered like dark amethysts, and at night, it bloomed with luminous, silver flowers that emitted a sweet, spicy fragrance.
+Earl had been coming to the diner for over fifty years, always ordering the same thing. He claimed he tasted something different in every glass, a new story unfolding with each sip. 
 
-One evening, while sketching the extraordinary plant, Dr. Pepper felt a strange pull towards its glistening petals.  He leaned closer, captivated by their ethereal glow.  Suddenly, the air shimmered.  Images flashed before his eyes:  ancient forests bathed in starlight, whispered secrets of the earth, the interconnectedness of all living things.  
+One day, a young man, all city swagger and designer sunglasses, sauntered in. He ordered a cola, scoffing at Earl's Dr. Pepper. "Seriously, old timer?" he laughed. "That stuff is older than you are."
 
-When the visions faded, Dr. Pepper was changed.  He felt a profound connection to the natural world, a deep understanding of its rhythms and wisdom. He continued to study the plant, documenting its every quirk and marvel. He never tried to replicate it, for he knew some wonders are not meant to be repeated, only cherished.  And so, Dr. Pete Pepper, the lonely botanist, found companionship and enlightenment in the most unexpected of places: within the heart of a mysterious, star-kissed flower. 
+Earl took a long, slow sip, his eyes twinkling. "Son," he drawled, "you're right. It is older. It’s older than time itself. Each sip is a journey through history, a taste of memories yet to be made." 
 
-
Captured stderr call
[2024-11-25T23:50:40Z INFO  baml_events] Function TestGemini:
-    Client: Gemini (gemini-1.5-pro-001) - 8054ms. StopReason: Stop. Tokens(in/out): unknown/unknown
+Intrigued, the young man hesitantly took a sip from Earl's glass. His eyes widened. He tasted the dusty roads, the scent of sagebrush, the thrill of a cattle drive at dawn. It was unlike anything he had ever experienced.
+
+From that day on, the young man became a regular, his love for Dr. Pepper rivaling even Earl's. The diner, once quiet, became a place where stories flowed as freely as the legendary drink. And Earl? He just smiled, knowing that the legend of Dr. Pepper, like a good story, would live on forever. 
+
+
Captured stderr call
[2024-11-26T00:35:27Z INFO  baml_events] Function TestGemini:
+    Client: Gemini (gemini-1.5-pro-001) - 8953ms. StopReason: Stop. Tokens(in/out): unknown/unknown
     ---PROMPT---
     [chat] user: Write a nice short story about Dr. Pepper
     
     ---LLM REPLY---
-    Dr. Pete Pepper wasn't a medical doctor, despite his name and the persistent rumor among the squirrels in the park.  He was a botanist, obsessed with the secret lives of plants.  His small apartment overflowed with greenery, vines creating a living tapestry on the walls, mushrooms sprouting happily in dimly lit corners.  He talked to his plants, sang them opera, and swore he saw their leaves tremble with delight.
+    The old diner was quiet, the silence broken only by the rhythmic whir of the ceiling fan and the sizzle of the grill. A lone figure sat at the counter, a Stetson pulled low over his eyes. He was nursing a glass of something dark and mysterious, the ice clinking softly against the rim. 
+    
+    Ellie, the diner owner, knew the drink well. "Another Dr. Pepper, Earl?" she asked, wiping down the counter with a practiced hand. 
+    
+    Earl chuckled, a low rumble in his chest. "Ain't nothin' else like it, Ellie. Not in this town, not in this world."
     
-    One day, while rummaging through a box of his eccentric Aunt Millie's belongings, Dr. Pepper found a seed. It was unlike any he’d seen: smooth, obsidian black, pulsing faintly with an inner light.  Intrigued, he planted it, nurturing it with a fervor bordering on obsession.
+    Ellie smiled, knowing the truth behind his words. Dr. Pepper wasn't just a drink in this town; it was a legend. They said it tasted like the West Texas wind after a storm, like freedom and possibility all bottled up.
     
-    Weeks passed, then months.  Just when Dr. Pepper was about to concede defeat, a single, velvety black shoot emerged from the soil. It grew with astonishing speed, unfurling into a plant of otherworldly beauty.  Its leaves shimmered like dark amethysts, and at night, it bloomed with luminous, silver flowers that emitted a sweet, spicy fragrance.
+    Earl had been coming to the diner for over fifty years, always ordering the same thing. He claimed he tasted something different in every glass, a new story unfolding with each sip. 
     
-    One evening, while sketching the extraordinary plant, Dr. Pepper felt a strange pull towards its glistening petals.  He leaned closer, captivated by their ethereal glow.  Suddenly, the air shimmered.  Images flashed before his eyes:  ancient forests bathed in starlight, whispered secrets of the earth, the interconnectedness of all living things.  
+    One day, a young man, all city swagger and designer sunglasses, sauntered in. He ordered a cola, scoffing at Earl's Dr. Pepper. "Seriously, old timer?" he laughed. "That stuff is older than you are."
     
-    When the visions faded, Dr. Pepper was changed.  He felt a profound connection to the natural world, a deep understanding of its rhythms and wisdom. He continued to study the plant, documenting its every quirk and marvel. He never tried to replicate it, for he knew some wonders are not meant to be repeated, only cherished.  And so, Dr. Pete Pepper, the lonely botanist, found companionship and enlightenment in the most unexpected of places: within the heart of a mysterious, star-kissed flower. 
+    Earl took a long, slow sip, his eyes twinkling. "Son," he drawled, "you're right. It is older. It’s older than time itself. Each sip is a journey through history, a taste of memories yet to be made." 
+    
+    Intrigued, the young man hesitantly took a sip from Earl's glass. His eyes widened. He tasted the dusty roads, the scent of sagebrush, the thrill of a cattle drive at dawn. It was unlike anything he had ever experienced.
+    
+    From that day on, the young man became a regular, his love for Dr. Pepper rivaling even Earl's. The diner, once quiet, became a place where stories flowed as freely as the legendary drink. And Earl? He just smiled, knowing that the legend of Dr. Pepper, like a good story, would live on forever. 
     
     ---Parsed Response (string)---
-    "Dr. Pete Pepper wasn't a medical doctor, despite his name and the persistent rumor among the squirrels in the park.  He was a botanist, obsessed with the secret lives of plants.  His small apartment overflowed with greenery, vines creating a living tapestry on the walls, mushrooms sprouting happily in dimly lit corners.  He talked to his plants, sang them opera, and swore he saw their leaves tremble with delight.\n\nOne day, while rummaging through a box of his eccentric Aunt Millie's belongings, Dr. Pepper found a seed. It was unlike any he’d seen: smooth, obsidian black, pulsing faintly with an inner light.  Intrigued, he planted it, nurturing it with a fervor bordering on obsession.\n\nWeeks passed, then months.  Just when Dr. Pepper was about to concede defeat, a single, velvety black shoot emerged from the soil. It grew with astonishing speed, unfurling into a plant of otherworldly beauty.  Its leaves shimmered like dark amethysts, and at night, it bloomed with luminous, silver flowers that emitted a sweet, spicy fragrance.\n\nOne evening, while sketching the extraordinary plant, Dr. Pepper felt a strange pull towards its glistening petals.  He leaned closer, captivated by their ethereal glow.  Suddenly, the air shimmered.  Images flashed before his eyes:  ancient forests bathed in starlight, whispered secrets of the earth, the interconnectedness of all living things.  \n\nWhen the visions faded, Dr. Pepper was changed.  He felt a profound connection to the natural world, a deep understanding of its rhythms and wisdom. He continued to study the plant, documenting its every quirk and marvel. He never tried to replicate it, for he knew some wonders are not meant to be repeated, only cherished.  And so, Dr. Pete Pepper, the lonely botanist, found companionship and enlightenment in the most unexpected of places: within the heart of a mysterious, star-kissed flower. \n"
-

Teardown

PASSED test_aws 0:00:01.843408

Setup

Call

Captured stderr call
[2024-11-25T23:50:40Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
-[2024-11-25T23:50:41Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (meta.llama3-8b-instruct-v1:0) - 1684ms. StopReason: max_tokens. Tokens(in/out): 25/100
+    "The old diner was quiet, the silence broken only by the rhythmic whir of the ceiling fan and the sizzle of the grill. A lone figure sat at the counter, a Stetson pulled low over his eyes. He was nursing a glass of something dark and mysterious, the ice clinking softly against the rim. \n\nEllie, the diner owner, knew the drink well. \"Another Dr. Pepper, Earl?\" she asked, wiping down the counter with a practiced hand. \n\nEarl chuckled, a low rumble in his chest. \"Ain't nothin' else like it, Ellie. Not in this town, not in this world.\"\n\nEllie smiled, knowing the truth behind his words. Dr. Pepper wasn't just a drink in this town; it was a legend. They said it tasted like the West Texas wind after a storm, like freedom and possibility all bottled up.\n\nEarl had been coming to the diner for over fifty years, always ordering the same thing. He claimed he tasted something different in every glass, a new story unfolding with each sip. \n\nOne day, a young man, all city swagger and designer sunglasses, sauntered in. He ordered a cola, scoffing at Earl's Dr. Pepper. \"Seriously, old timer?\" he laughed. \"That stuff is older than you are.\"\n\nEarl took a long, slow sip, his eyes twinkling. \"Son,\" he drawled, \"you're right. It is older. It’s older than time itself. Each sip is a journey through history, a taste of memories yet to be made.\" \n\nIntrigued, the young man hesitantly took a sip from Earl's glass. His eyes widened. He tasted the dusty roads, the scent of sagebrush, the thrill of a cattle drive at dawn. It was unlike anything he had ever experienced.\n\nFrom that day on, the young man became a regular, his love for Dr. Pepper rivaling even Earl's. The diner, once quiet, became a place where stories flowed as freely as the legendary drink. And Earl? He just smiled, knowing that the legend of Dr. Pepper, like a good story, would live on forever. \n"
+

Teardown

PASSED test_aws 0:00:01.731086

Setup

Call

Captured stderr call
[2024-11-26T00:35:27Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-11-26T00:35:29Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (meta.llama3-8b-instruct-v1:0) - 1559ms. StopReason: max_tokens. Tokens(in/out): 25/100
     ---PROMPT---
     [chat] user: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
     
     
-    As the sun rose over the Puget Sound, a group of friends gathered at the base of Mt. Rainier, eager to tackle the mountain's winding trails. Among them was Emma, a young hiker with a passion for adventure and a sense of awe for the towering peak before her.
+    As the sun rose over the small town of Ashford, Washington, a sense of awe washed over the residents. For on this day, they would be treated to a rare sight: a clear view of Mt. Rainier's towering peak.
+    
+    The mountain, a dormant volcano, stood sentinel over the surrounding landscape, its snow-capped summit reaching for the clouds at an astonishing 14,411 feet. It was a sight that never failed to inspire, and today was no exception.
     
-    As they set off, Emma couldn't help but feel a sense of reverence for the mountain's majesty. At 14,411 feet, Mt. Rainier was the tallest peak in the contiguous
+    Lena
     ---Parsed Response (string)---
-    "\n\nAs the sun rose over the Puget Sound, a group of friends gathered at the base of Mt. Rainier, eager to tackle the mountain's winding trails. Among them was Emma, a young hiker with a passion for adventure and a sense of awe for the towering peak before her.\n\nAs they set off, Emma couldn't help but feel a sense of reverence for the mountain's majesty. At 14,411 feet, Mt. Rainier was the tallest peak in the contiguous"
-

Teardown

PASSED test_openai_shorthand 0:00:13.555599

Setup

Call

Captured stderr call
[2024-11-25T23:50:55Z INFO  baml_events] Function TestOpenAIShorthand:
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 13552ms. StopReason: stop. Tokens(in/out): 18/758
+    "\n\nAs the sun rose over the small town of Ashford, Washington, a sense of awe washed over the residents. For on this day, they would be treated to a rare sight: a clear view of Mt. Rainier's towering peak.\n\nThe mountain, a dormant volcano, stood sentinel over the surrounding landscape, its snow-capped summit reaching for the clouds at an astonishing 14,411 feet. It was a sight that never failed to inspire, and today was no exception.\n\nLena"
+

Teardown

PASSED test_openai_shorthand 0:00:10.524816

Setup

Call

Captured stderr call
[2024-11-26T00:35:39Z INFO  baml_events] Function TestOpenAIShorthand:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 10516ms. StopReason: stop. Tokens(in/out): 18/695
     ---PROMPT---
     [chat] user: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
-    Once upon a time, in the Pacific Northwest, there was an ancient mountain named Rainier, whose peaks kissed the sky and wrapped themselves in a beautiful, shimmering cloak of snow and ice. Mt. Rainier stood tall and majestic, a sentinel watching over the lush valleys and vibrant forests that surrounded it. On clear days, its towering silhouette could be seen from miles away, often inspiring awe in those who beheld it.
+    Once upon a time, in a small town nestled at the foot of the majestic Mount Rainier, the people lived in the shadow of its towering presence. Each morning, as the sun rose, it painted the snow-capped peak with hues of gold and pink, bringing warmth to the chilly air. The mountain stood tall, a steadfast guardian watching over the town and its inhabitants.
     
-    In a nearby village nestled between rolling hills and meandering rivers, lived a young girl named Lila. From her window, she could see Mt. Rainier rising majestically above the trees, a constant source of inspiration and wonder. Lila often dreamed of climbing the mountain, to stand on its summit and feel the world spread out beneath her like a painted canvas.
+    In the heart of the town lived a young girl named Lila. With a spirit as vibrant as the wildflowers that dotted the meadows, Lila had always dreamt of climbing to the summit of Mount Rainier. She imagined herself standing at the top, feeling the clouds at her fingertips and the world sprawling out below her.
     
-    One bright summer morning, Lila awoke with determination. Today was the day she would embark on her adventure to the mountain. With a small backpack filled with snacks, a water bottle, and her favorite book of stories about the spirits of nature, she set off toward the towering giant.
+    One sunny day, filled with excitement, Lila shared her dream with her best friend, Sam. “We should climb it together!” she exclaimed, her eyes sparkling like the morning dew. Sam, though a bit more cautious, couldn't resist Lila's enthusiasm. They spent weeks preparing, gathering supplies, studying maps, and listening to the stories of seasoned climbers in the town.
     
-    As she approached the base of Mt. Rainier, Lila marveled at the wildflowers dancing in the breeze, their colors vibrant against the lush greenery. The air was crisp and fresh, filled with the scent of pine and earth. As she climbed higher, the terrain became more rugged, and the path wound through a dense forest of towering trees. 
+    Finally, the day of their adventure arrived. With backpacks packed and hearts pounding, they set off early in the morning. The path twisted and turned, winding through tall trees and over babbling brooks. As they climbed higher, the air grew cooler, and the view grew more breathtaking. Lila felt alive, her spirit soaring with the altitude.
     
-    While resting on a mossy rock, she noticed a wise old owl perched nearby. With a gentle hoot, the owl beckoned her closer. “Where are you off to, dear heart?” it asked, its golden eyes sparkling with curiosity.
+    As they neared the summit, the trail became steeper, and the snow deepened. On a particularly challenging stretch, Sam paused, his breath coming in quick bursts. “Lila, it’s so tall... What if we can’t make it?” he asked, doubt creeping into his voice.
     
-    “I’m going to climb Mt. Rainier!” Lila declared with enthusiasm. “I want to see the world from its peak.”
+    Lila looked up at the mountain, its peak piercing the sky. “But that’s what makes it beautiful, Sam,” she replied, her voice firm and filled with resolve. “It’s tall, and so are we! Let’s take it one step at a time.”
     
-    The owl nodded thoughtfully. "The mountain is indeed tall, and its height holds many secrets. But remember, the journey is just as important as reaching the summit. Listen to the whispers of the trees, the songs of the rivers, and the call of the wind. They will guide you."
+    With renewed determination, they pushed forward, each step fueled by their friendship and dreams. Finally, after hours of climbing, they reached a plateau that led to the summit. The moment they stepped onto the top of Mount Rainier, a feeling of pure joy washed over them. They stood together, arms raised in triumph, the world sprawling out in every direction beneath their feet.
     
-    Inspired by the owl’s wisdom, Lila continued her ascent, her heart light with excitement. As she climbed, she paused often to listen and absorb the beauty around her. She watched as squirrels danced through the branches and listened to the soft rustle of leaves. Each moment felt precious, a reminder that the journey held as much wonder as the destination.
+    The town looked like a miniature model, and the rivers sparkled like ribbons of light. The clouds danced around them, and Lila felt like she could touch the sky. In that moment of accomplishment, they understood that the mountain, as tall as it was, symbolized more than just a physical challenge. It represented hope, perseverance, and the strength found in friendship.
     
-    Finally, after hours of climbing, Lila reached a breathtaking vantage point. She stood on a rocky ledge, with Mt. Rainier’s majestic summit looming above, cloaked in clouds. Below, rolling hills stretched as far as her eyes could see, dotted with shimmering lakes that glimmered in the sunlight.
+    As the sun began to set, casting a warm glow over the summit, Lila and Sam sat side by side, taking it all in. They realized that it wasn’t just the height of the mountain that mattered, but the journey they had taken to get there. 
     
-    It was there, on that ledge, that Lila realized the mountain wasn’t just a towering giant; it was a friend—strong, silent, and full of stories. In that moment, she felt connected to the mountain’s spirit, grateful for the journey that had brought her here. 
+    With a smile, Lila turned to Sam and said, “We’re so much taller than we thought we could be.” And they both knew that together, they could conquer anything, even the biggest mountains in life.
     
-    As dusk began to settle, painting the sky in hues of orange and pink, Lila turned back, her heart full. She knew she would return to Mt. Rainier, once again to listen to its songs, share its stories, and cherish the adventure that awaited her every time she visited.
-    
-    From that day forward, whenever she caught a glimpse of Mt. Rainier from her window, she smiled, knowing the mountain was tall not just in stature but in spirit, a keeper of dreams and tales for all who chose to listen. And so, Lila continued to climb—not just the mountain, but the paths of life, cherishing the journey each step of the way.
+    And as they made their way back down, laughter echoed through the valleys, a sweet reminder that the tallest of peaks were meant to be climbed, and the greatest adventures were done side by side.
     ---Parsed Response (string)---
-    "Once upon a time, in the Pacific Northwest, there was an ancient mountain named Rainier, whose peaks kissed the sky and wrapped themselves in a beautiful, shimmering cloak of snow and ice. Mt. Rainier stood tall and majestic, a sentinel watching over the lush valleys and vibrant forests that surrounded it. On clear days, its towering silhouette could be seen from miles away, often inspiring awe in those who beheld it.\n\nIn a nearby village nestled between rolling hills and meandering rivers, lived a young girl named Lila. From her window, she could see Mt. Rainier rising majestically above the trees, a constant source of inspiration and wonder. Lila often dreamed of climbing the mountain, to stand on its summit and feel the world spread out beneath her like a painted canvas.\n\nOne bright summer morning, Lila awoke with determination. Today was the day she would embark on her adventure to the mountain. With a small backpack filled with snacks, a water bottle, and her favorite book of stories about the spirits of nature, she set off toward the towering giant.\n\nAs she approached the base of Mt. Rainier, Lila marveled at the wildflowers dancing in the breeze, their colors vibrant against the lush greenery. The air was crisp and fresh, filled with the scent of pine and earth. As she climbed higher, the terrain became more rugged, and the path wound through a dense forest of towering trees. \n\nWhile resting on a mossy rock, she noticed a wise old owl perched nearby. With a gentle hoot, the owl beckoned her closer. “Where are you off to, dear heart?” it asked, its golden eyes sparkling with curiosity.\n\n“I’m going to climb Mt. Rainier!” Lila declared with enthusiasm. “I want to see the world from its peak.”\n\nThe owl nodded thoughtfully. \"The mountain is indeed tall, and its height holds many secrets. But remember, the journey is just as important as reaching the summit. Listen to the whispers of the trees, the songs of the rivers, and the call of the wind. They will guide you.\"\n\nInspired by the owl’s wisdom, Lila continued her ascent, her heart light with excitement. As she climbed, she paused often to listen and absorb the beauty around her. She watched as squirrels danced through the branches and listened to the soft rustle of leaves. Each moment felt precious, a reminder that the journey held as much wonder as the destination.\n\nFinally, after hours of climbing, Lila reached a breathtaking vantage point. She stood on a rocky ledge, with Mt. Rainier’s majestic summit looming above, cloaked in clouds. Below, rolling hills stretched as far as her eyes could see, dotted with shimmering lakes that glimmered in the sunlight.\n\nIt was there, on that ledge, that Lila realized the mountain wasn’t just a towering giant; it was a friend—strong, silent, and full of stories. In that moment, she felt connected to the mountain’s spirit, grateful for the journey that had brought her here. \n\nAs dusk began to settle, painting the sky in hues of orange and pink, Lila turned back, her heart full. She knew she would return to Mt. Rainier, once again to listen to its songs, share its stories, and cherish the adventure that awaited her every time she visited.\n\nFrom that day forward, whenever she caught a glimpse of Mt. Rainier from her window, she smiled, knowing the mountain was tall not just in stature but in spirit, a keeper of dreams and tales for all who chose to listen. And so, Lila continued to climb—not just the mountain, but the paths of life, cherishing the journey each step of the way."
-

Teardown

PASSED test_openai_shorthand_streaming 0:00:05.049381

Setup

Call

Captured stderr call
[2024-11-25T23:51:00Z INFO  baml_events] Function TestOpenAIShorthand:
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 4729ms. StopReason: unknown. Tokens(in/out): unknown/unknown
+    "Once upon a time, in a small town nestled at the foot of the majestic Mount Rainier, the people lived in the shadow of its towering presence. Each morning, as the sun rose, it painted the snow-capped peak with hues of gold and pink, bringing warmth to the chilly air. The mountain stood tall, a steadfast guardian watching over the town and its inhabitants.\n\nIn the heart of the town lived a young girl named Lila. With a spirit as vibrant as the wildflowers that dotted the meadows, Lila had always dreamt of climbing to the summit of Mount Rainier. She imagined herself standing at the top, feeling the clouds at her fingertips and the world sprawling out below her.\n\nOne sunny day, filled with excitement, Lila shared her dream with her best friend, Sam. “We should climb it together!” she exclaimed, her eyes sparkling like the morning dew. Sam, though a bit more cautious, couldn't resist Lila's enthusiasm. They spent weeks preparing, gathering supplies, studying maps, and listening to the stories of seasoned climbers in the town.\n\nFinally, the day of their adventure arrived. With backpacks packed and hearts pounding, they set off early in the morning. The path twisted and turned, winding through tall trees and over babbling brooks. As they climbed higher, the air grew cooler, and the view grew more breathtaking. Lila felt alive, her spirit soaring with the altitude.\n\nAs they neared the summit, the trail became steeper, and the snow deepened. On a particularly challenging stretch, Sam paused, his breath coming in quick bursts. “Lila, it’s so tall... What if we can’t make it?” he asked, doubt creeping into his voice.\n\nLila looked up at the mountain, its peak piercing the sky. “But that’s what makes it beautiful, Sam,” she replied, her voice firm and filled with resolve. “It’s tall, and so are we! Let’s take it one step at a time.”\n\nWith renewed determination, they pushed forward, each step fueled by their friendship and dreams. Finally, after hours of climbing, they reached a plateau that led to the summit. The moment they stepped onto the top of Mount Rainier, a feeling of pure joy washed over them. They stood together, arms raised in triumph, the world sprawling out in every direction beneath their feet.\n\nThe town looked like a miniature model, and the rivers sparkled like ribbons of light. The clouds danced around them, and Lila felt like she could touch the sky. In that moment of accomplishment, they understood that the mountain, as tall as it was, symbolized more than just a physical challenge. It represented hope, perseverance, and the strength found in friendship.\n\nAs the sun began to set, casting a warm glow over the summit, Lila and Sam sat side by side, taking it all in. They realized that it wasn’t just the height of the mountain that mattered, but the journey they had taken to get there. \n\nWith a smile, Lila turned to Sam and said, “We’re so much taller than we thought we could be.” And they both knew that together, they could conquer anything, even the biggest mountains in life.\n\nAnd as they made their way back down, laughter echoed through the valleys, a sweet reminder that the tallest of peaks were meant to be climbed, and the greatest adventures were done side by side."
+

Teardown

PASSED test_openai_shorthand_streaming 0:00:09.234752

Setup

Call

Captured stderr call
[2024-11-26T00:35:48Z INFO  baml_events] Function TestOpenAIShorthand:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 9225ms. StopReason: stop. Tokens(in/out): 18/684
     ---PROMPT---
     [chat] user: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
-    Once upon a time, in the heart of the Pacific Northwest, stood the majestic Mount Rainier. Towering at over 14,000 feet, it was more than just a mountain; it was a guardian of the land, crowned with a glimmering white cap of snow that shone like diamonds in the sun. The mountain’s presence was felt far and wide, a beacon of beauty and strength that called to adventurers, artists, and dreamers alike.
+    Once upon a time, in the heart of the Pacific Northwest, stood the majestic Mt. Rainier, a towering giant cloaked in snow and mystery. The mountain was not just a geological wonder but also a guardian of tales, dreams, and adventures that surrounded its rocky slopes.
+    
+    In a small town nestled at its base lived a young girl named Lila. Her days were filled with dreams of exploring the great outdoors. She often gazed up at Mt. Rainier, where the clouds kissed the peak and the sun painted its face in hues of orange and pink at dusk. To Lila, the mountain was a symbol of adventure and a challenge waiting to be conquered.
+    
+    One summer morning, she gathered her courage and decided to climb Mt. Rainier. With her backpack filled with snacks, a water bottle, and a trusty old map, she set off toward the trailhead, her heart bubbling with excitement. The path wound through ancient forests where tall evergreens whispered secrets to the wind, and streams sang cheerful songs as they danced over pebbles.
+    
+    As she climbed higher, the air grew thinner, but Lila felt invigorated by the beauty surrounding her. Wildflowers blanketed the meadows, and the sweet scent of pine surrounded her like an embrace. With each step, she could feel Mt. Rainier’s spirit encouraging her.
     
-    In a nearby village, nestled among lush green forests and sparkling rivers, lived a young girl named Clara. Clara had always been fascinated by Mount Rainier. Every morning, she would wake up before dawn, wrap herself in her grandmother’s knitted scarf, and sit by the window to watch the sky bloom with colors as the sun rose behind the mountain. To Clara, Mount Rainier was a friend—strong yet gentle, intimidating yet inviting.
+    Hours passed, and Lila reached a large boulder that jutted out, forming a perfect perch to catch her breath. As she paused, she noticed a group of mountain goats grazing nearby. Their nimble feet danced over the rocky terrain, reminding her of how small and insignificant she felt compared to the mountain’s grandeur. Yet, she stood tall, inspired and filled with determination.
     
-    One day, Clara announced to her parents that she wanted to climb Mount Rainier. Her eyes sparkled with excitement at the thought of standing on top of the world, touching the clouds, and perhaps even whispering to the stars. Her parents exchanged concerned glances; the mountain was beautiful, but it was also challenging and unpredictable.
+    After a short rest, she continued her ascent. The trail became steeper, but Lila was undeterred. She recollected a saying her grandmother used to share: “The tallest mountains can be climbed one step at a time.” With renewed strength, she pressed on, focusing on the ground beneath her feet, counting each step as a small victory.
     
-    “Are you sure, Clara?” her mother asked gently. “It can be very dangerous.”
+    As the sun began to set, Lila finally reached the mountain’s summit. She stood at the top, breathless not just from the climb but from the view that sprawled before her. The world below was a tapestry of greens and blues, the valleys cradling shimmering lakes and winding rivers. She could see the horizon stretch endlessly, meeting the sky in a brilliant palette of oranges, purples, and golds.
     
-    “I want to see the world from the top,” Clara replied, determination shining in her eyes. “I want to feel what it’s like to stand where very few have.”
+    In that moment, Lila understood; Mt. Rainier was not just a mountain. It was a teacher. A reminder that the greatest heights are conquered not just by strength but by persistence, hope, and belief in oneself. She took a deep breath, feeling the crisp, cool air fill her lungs, and a smile spread across her face as she whispered, “I did it!”
     
-    After much discussion, Clara’s parents agreed to accompany her part way
+    As the stars began to twinkle above, Lila sat in serene silence, cradled by the universe and enveloped in the mountain’s ancient embrace. Mt. Rainier, tall and proud, stood watch over her – a friend who would always guide her back into the embrace of nature and adventure.
+    
+    And so, Lila made her way back down the mountain, the memory of her climb forever etched in her heart, knowing that she could achieve great things, one step at a time.
     ---Parsed Response (string)---
-    "Once upon a time, in the heart of the Pacific Northwest, stood the majestic Mount Rainier. Towering at over 14,000 feet, it was more than just a mountain; it was a guardian of the land, crowned with a glimmering white cap of snow that shone like diamonds in the sun. The mountain’s presence was felt far and wide, a beacon of beauty and strength that called to adventurers, artists, and dreamers alike.\n\nIn a nearby village, nestled among lush green forests and sparkling rivers, lived a young girl named Clara. Clara had always been fascinated by Mount Rainier. Every morning, she would wake up before dawn, wrap herself in her grandmother’s knitted scarf, and sit by the window to watch the sky bloom with colors as the sun rose behind the mountain. To Clara, Mount Rainier was a friend—strong yet gentle, intimidating yet inviting.\n\nOne day, Clara announced to her parents that she wanted to climb Mount Rainier. Her eyes sparkled with excitement at the thought of standing on top of the world, touching the clouds, and perhaps even whispering to the stars. Her parents exchanged concerned glances; the mountain was beautiful, but it was also challenging and unpredictable.\n\n“Are you sure, Clara?” her mother asked gently. “It can be very dangerous.”\n\n“I want to see the world from the top,” Clara replied, determination shining in her eyes. “I want to feel what it’s like to stand where very few have.”\n\nAfter much discussion, Clara’s parents agreed to accompany her part way"
-

Teardown

PASSED test_anthropic_shorthand 0:00:03.302312

Setup

Call

Captured stderr call
[2024-11-25T23:51:03Z INFO  baml_events] Function TestAnthropicShorthand:
-    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3299ms. StopReason: "end_turn". Tokens(in/out): 19/404
+    "Once upon a time, in the heart of the Pacific Northwest, stood the majestic Mt. Rainier, a towering giant cloaked in snow and mystery. The mountain was not just a geological wonder but also a guardian of tales, dreams, and adventures that surrounded its rocky slopes.\n\nIn a small town nestled at its base lived a young girl named Lila. Her days were filled with dreams of exploring the great outdoors. She often gazed up at Mt. Rainier, where the clouds kissed the peak and the sun painted its face in hues of orange and pink at dusk. To Lila, the mountain was a symbol of adventure and a challenge waiting to be conquered.\n\nOne summer morning, she gathered her courage and decided to climb Mt. Rainier. With her backpack filled with snacks, a water bottle, and a trusty old map, she set off toward the trailhead, her heart bubbling with excitement. The path wound through ancient forests where tall evergreens whispered secrets to the wind, and streams sang cheerful songs as they danced over pebbles.\n\nAs she climbed higher, the air grew thinner, but Lila felt invigorated by the beauty surrounding her. Wildflowers blanketed the meadows, and the sweet scent of pine surrounded her like an embrace. With each step, she could feel Mt. Rainier’s spirit encouraging her.\n\nHours passed, and Lila reached a large boulder that jutted out, forming a perfect perch to catch her breath. As she paused, she noticed a group of mountain goats grazing nearby. Their nimble feet danced over the rocky terrain, reminding her of how small and insignificant she felt compared to the mountain’s grandeur. Yet, she stood tall, inspired and filled with determination.\n\nAfter a short rest, she continued her ascent. The trail became steeper, but Lila was undeterred. She recollected a saying her grandmother used to share: “The tallest mountains can be climbed one step at a time.” With renewed strength, she pressed on, focusing on the ground beneath her feet, counting each step as a small victory.\n\nAs the sun began to set, Lila finally reached the mountain’s summit. She stood at the top, breathless not just from the climb but from the view that sprawled before her. The world below was a tapestry of greens and blues, the valleys cradling shimmering lakes and winding rivers. She could see the horizon stretch endlessly, meeting the sky in a brilliant palette of oranges, purples, and golds.\n\nIn that moment, Lila understood; Mt. Rainier was not just a mountain. It was a teacher. A reminder that the greatest heights are conquered not just by strength but by persistence, hope, and belief in oneself. She took a deep breath, feeling the crisp, cool air fill her lungs, and a smile spread across her face as she whispered, “I did it!”\n\nAs the stars began to twinkle above, Lila sat in serene silence, cradled by the universe and enveloped in the mountain’s ancient embrace. Mt. Rainier, tall and proud, stood watch over her – a friend who would always guide her back into the embrace of nature and adventure.\n\nAnd so, Lila made her way back down the mountain, the memory of her climb forever etched in her heart, knowing that she could achieve great things, one step at a time."
+

Teardown

PASSED test_anthropic_shorthand 0:00:02.926146

Setup

Call

Captured stderr call
[2024-11-26T00:35:51Z INFO  baml_events] Function TestAnthropicShorthand:
+    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 2920ms. StopReason: "end_turn". Tokens(in/out): 19/376
     ---PROMPT---
     [chat] user: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
-    Here is a short story about the majestic Mount Rainier:
-    
-    The Towering Titan
+    Here is a short story about Mount Rainier:
     
-    As the morning mist began to lift, the sun's golden rays slowly crept up the flanks of the colossal mountain. Standing tall and proud, Mount Rainier dominated the surrounding landscape, its snow-capped peak piercing the azure sky.
+    The Majestic Sentinel
     
-    For the hikers making their way up the mountain trail, the sight of this towering titan was both humbling and awe-inspiring. The massif seemed to radiate an ancient power, a testimony to the raw, unbridled forces that had shaped the Earth over eons.
+    As the morning sun peeked over the horizon, its golden rays illuminated the towering presence of Mount Rainier. Standing tall and proud at 14,411 feet, the dormant volcano seemed to watch over the surrounding landscape, a silent guardian keeping vigilant watch.
     
-    With each step, the hikers gained a new perspective on the mountain's sheer scale. Towering glaciers cascaded down its slopes, their pristine ice glittering like diamonds. Subalpine meadows blanketed in vibrant wildflowers gave way to rugged, wind-swept ridges, where the mountain's true magnitude became undeniable.
+    For generations, the mountain had stood as a beacon, a landmark that guided weary travelers and inspired awe in all who gazed upon its snow-capped peak. Its sheer size and scale were humbling, a testament to the raw power and grandeur of the natural world.
     
-    As they neared the summit, the hikers paused, their breath caught in their throats. The view from this lofty vantage point was nothing short of spellbinding. Miles of snowfields and crevasse-riddled glaciers stretched out before them, framed by the dramatic, jagged peaks of the Cascade Range.
+    To the indigenous peoples who had called this region home for centuries, Mount Rainier was more than just a mountain – it was a sacred place, a symbol of their connection to the land and the rhythms of the universe. They revered its strength and reveled in the way its presence seemed to imbue the entire region with a sense of timelessness and wonder.
     
-    In that moment, the hikers felt small and insignificant, humbled by the raw power and timeless grandeur of Mount Rainier. Yet, they also felt a profound sense of connection to the natural world, inspired by the mountain's unyielding presence and the knowledge that it had stood watch over this land for countless millennia.
+    As the years passed, and more and more people came to experience the splendor of Mount Rainier, its legend only grew. Hikers, climbers, and nature enthusiasts from around the world flocked to its slopes, seeking to conquer its challenges and bask in the glory of its majesty.
     
-    As they turned to begin their descent, the hikers knew that they would carry the memory of this encounter with the towering titan of Mount Rainier in their hearts forever.
+    Yet, no matter how many times the mountain was scaled or explored, it remained a force to be reckoned with, a constant reminder of the enduring power of the natural world. And as the sun continued to rise and set, casting its ever-shifting light upon the mountain's flanks, Mount Rainier stood tall and steadfast, a majestic sentinel watching over the land it had called home for countless millennia.
     ---Parsed Response (string)---
-    "Here is a short story about the majestic Mount Rainier:\n\nThe Towering Titan\n\nAs the morning mist began to lift, the sun's golden rays slowly crept up the flanks of the colossal mountain. Standing tall and proud, Mount Rainier dominated the surrounding landscape, its snow-capped peak piercing the azure sky.\n\nFor the hikers making their way up the mountain trail, the sight of this towering titan was both humbling and awe-inspiring. The massif seemed to radiate an ancient power, a testimony to the raw, unbridled forces that had shaped the Earth over eons.\n\nWith each step, the hikers gained a new perspective on the mountain's sheer scale. Towering glaciers cascaded down its slopes, their pristine ice glittering like diamonds. Subalpine meadows blanketed in vibrant wildflowers gave way to rugged, wind-swept ridges, where the mountain's true magnitude became undeniable.\n\nAs they neared the summit, the hikers paused, their breath caught in their throats. The view from this lofty vantage point was nothing short of spellbinding. Miles of snowfields and crevasse-riddled glaciers stretched out before them, framed by the dramatic, jagged peaks of the Cascade Range.\n\nIn that moment, the hikers felt small and insignificant, humbled by the raw power and timeless grandeur of Mount Rainier. Yet, they also felt a profound sense of connection to the natural world, inspired by the mountain's unyielding presence and the knowledge that it had stood watch over this land for countless millennia.\n\nAs they turned to begin their descent, the hikers knew that they would carry the memory of this encounter with the towering titan of Mount Rainier in their hearts forever."
-

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.225616

Setup

Call

Captured stderr call
[2024-11-25T23:51:06Z INFO  baml_events] Function TestAnthropicShorthand:
-    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3205ms. StopReason: "end_turn". Tokens(in/out): 19/433
+    "Here is a short story about Mount Rainier:\n\nThe Majestic Sentinel\n\nAs the morning sun peeked over the horizon, its golden rays illuminated the towering presence of Mount Rainier. Standing tall and proud at 14,411 feet, the dormant volcano seemed to watch over the surrounding landscape, a silent guardian keeping vigilant watch.\n\nFor generations, the mountain had stood as a beacon, a landmark that guided weary travelers and inspired awe in all who gazed upon its snow-capped peak. Its sheer size and scale were humbling, a testament to the raw power and grandeur of the natural world.\n\nTo the indigenous peoples who had called this region home for centuries, Mount Rainier was more than just a mountain – it was a sacred place, a symbol of their connection to the land and the rhythms of the universe. They revered its strength and reveled in the way its presence seemed to imbue the entire region with a sense of timelessness and wonder.\n\nAs the years passed, and more and more people came to experience the splendor of Mount Rainier, its legend only grew. Hikers, climbers, and nature enthusiasts from around the world flocked to its slopes, seeking to conquer its challenges and bask in the glory of its majesty.\n\nYet, no matter how many times the mountain was scaled or explored, it remained a force to be reckoned with, a constant reminder of the enduring power of the natural world. And as the sun continued to rise and set, casting its ever-shifting light upon the mountain's flanks, Mount Rainier stood tall and steadfast, a majestic sentinel watching over the land it had called home for countless millennia."
+

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:02.665601

Setup

Call

Captured stderr call
[2024-11-26T00:35:54Z INFO  baml_events] Function TestAnthropicShorthand:
+    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 2644ms. StopReason: "end_turn". Tokens(in/out): 19/379
     ---PROMPT---
     [chat] user: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
-    Here is a short story about Mount Rainier:
+    Here is a short story about Mt. Rainier:
     
-    The Towering Majesty of Mount Rainier
+    The Towering Titan
     
-    As the sun crept over the horizon, its golden rays slowly illuminated the magnificent sight before me - the towering, snow-capped peak of Mount Rainier. Standing at an awe-inspiring 14,411 feet, this dormant volcano commanded the attention of all who gazed upon it.
+    Gazing up at the majestic Mt. Rainier, its snowcapped peak piercing the azure sky, Sarah felt a sense of awe wash over her. Standing at 14,411 feet, the towering volcanic mountain reigned supreme over the surrounding landscape, a testament to the raw power and grandeur of nature.
     
-    I had come to this national park many times, but the sheer scale and grandeur of Rainier never ceased to take my breath away. It rose up with such power and grace, dominating the landscape for miles around. The way the light danced across its icy slopes filled me with a deep sense of wonder and reverence.
+    As she began her hike along the winding trails, Sarah couldn't help but be humbled by the sheer scale of the mountain before her. With each step, the summit seemed to loom ever higher, a challenge that beckoned to be conquered.
     
-    Tracing the mountain's history in my mind, I marveled at the forces of nature that had sculpted this natural wonder over millennia. Rainier's origins lay in the violent collisions of tectonic plates, the immense pressures of which had thrust this massive peak up from the earth's crust. 
+    The trail grew steeper, the air thinner, but Sarah's determination only strengthened. She pressed on, her eyes fixed on the distant crest, each glimpse spurring her forward. The view became more breathtaking with every stride, the world below shrinking away as she ascended.
     
-    Despite its formidable size, the mountain radiated a serene, almost mystical beauty. Wisps of cloud caressed its summit, as if nature herself were giving Rainier a gentle embrace. The rivers and glaciers that flowed from its base nourished the lush, verdant forests that surrounded it.
+    Finally, reaching the summit, Sarah stood in reverent silence, taking in the stunning panorama that stretched out before her. The Cascades, the forests, the glistening glaciers – all seemed diminished in the shadow of this towering titan, a natural wonder that commanded respect and awe.
     
-    As I stood there transfixed, I felt a profound connection to this towering sentinel - a tangible link to the raw, primal power of the natural world. In its majestic presence, all my troubles and worries seemed to fade away, replaced by a deep sense of humility and awe.
+    In that moment, Sarah felt a deep connection to the mountain, a sense of being part of something greater than herself. Mt. Rainier, with its majestic presence and timeless beauty, had left an indelible mark on her soul, a reminder of the power and magnificence of the natural world.
     
-    In that moment, I understood why Rainier had drawn so many to its slopes over the centuries - it was not just a mountain, but a testament to the grandeur and might of our living, breathing planet. And I felt privileged to bear witness to its timeless, enduring splendor.
+    As she began her descent, Sarah knew that she would carry the memory of this experience with her forever, a testament to the towering splendor of Mt. Rainier.
     ---Parsed Response (string)---
-    "Here is a short story about Mount Rainier:\n\nThe Towering Majesty of Mount Rainier\n\nAs the sun crept over the horizon, its golden rays slowly illuminated the magnificent sight before me - the towering, snow-capped peak of Mount Rainier. Standing at an awe-inspiring 14,411 feet, this dormant volcano commanded the attention of all who gazed upon it.\n\nI had come to this national park many times, but the sheer scale and grandeur of Rainier never ceased to take my breath away. It rose up with such power and grace, dominating the landscape for miles around. The way the light danced across its icy slopes filled me with a deep sense of wonder and reverence.\n\nTracing the mountain's history in my mind, I marveled at the forces of nature that had sculpted this natural wonder over millennia. Rainier's origins lay in the violent collisions of tectonic plates, the immense pressures of which had thrust this massive peak up from the earth's crust. \n\nDespite its formidable size, the mountain radiated a serene, almost mystical beauty. Wisps of cloud caressed its summit, as if nature herself were giving Rainier a gentle embrace. The rivers and glaciers that flowed from its base nourished the lush, verdant forests that surrounded it.\n\nAs I stood there transfixed, I felt a profound connection to this towering sentinel - a tangible link to the raw, primal power of the natural world. In its majestic presence, all my troubles and worries seemed to fade away, replaced by a deep sense of humility and awe.\n\nIn that moment, I understood why Rainier had drawn so many to its slopes over the centuries - it was not just a mountain, but a testament to the grandeur and might of our living, breathing planet. And I felt privileged to bear witness to its timeless, enduring splendor."
-

Teardown

PASSED test_fallback_to_shorthand 0:00:01.029984

Setup

Call

Captured stderr call
[2024-11-25T23:51:08Z INFO  baml_events] Function TestFallbackToShorthand:
+    "Here is a short story about Mt. Rainier:\n\nThe Towering Titan\n\nGazing up at the majestic Mt. Rainier, its snowcapped peak piercing the azure sky, Sarah felt a sense of awe wash over her. Standing at 14,411 feet, the towering volcanic mountain reigned supreme over the surrounding landscape, a testament to the raw power and grandeur of nature.\n\nAs she began her hike along the winding trails, Sarah couldn't help but be humbled by the sheer scale of the mountain before her. With each step, the summit seemed to loom ever higher, a challenge that beckoned to be conquered.\n\nThe trail grew steeper, the air thinner, but Sarah's determination only strengthened. She pressed on, her eyes fixed on the distant crest, each glimpse spurring her forward. The view became more breathtaking with every stride, the world below shrinking away as she ascended.\n\nFinally, reaching the summit, Sarah stood in reverent silence, taking in the stunning panorama that stretched out before her. The Cascades, the forests, the glistening glaciers – all seemed diminished in the shadow of this towering titan, a natural wonder that commanded respect and awe.\n\nIn that moment, Sarah felt a deep connection to the mountain, a sense of being part of something greater than herself. Mt. Rainier, with its majestic presence and timeless beauty, had left an indelible mark on her soul, a reminder of the power and magnificence of the natural world.\n\nAs she began her descent, Sarah knew that she would carry the memory of this experience with her forever, a testament to the towering splendor of Mt. Rainier."
+

Teardown

PASSED test_fallback_to_shorthand 0:00:01.082669

Setup

Call

Captured stderr call
[2024-11-26T00:35:55Z INFO  baml_events] Function TestFallbackToShorthand:
     (1 other previous tries)
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 752ms. StopReason: stop. Tokens(in/out): 18/21
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 741ms. StopReason: stop. Tokens(in/out): 18/22
     ---PROMPT---
     [chat] user: Say a haiku about Mt Rainier is tall.
     
     ---LLM REPLY---
-    Majestic and grand,  
-    Snow-capped peak in azure skies,  
-    Whispers of the clouds.
+    Mount Rainier stands proud,  
+    Cloaked in snow and whispered clouds,  
+    Nature's towering crown.
     ---Parsed Response (string)---
-    "Majestic and grand,  \nSnow-capped peak in azure skies,  \nWhispers of the clouds."
-

Teardown

PASSED test_aws_streaming 0:00:01.468122

Setup

Call

Captured stderr call
[2024-11-25T23:51:08Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
-[2024-11-25T23:51:09Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (meta.llama3-8b-instruct-v1:0) - 1465ms. StopReason: unknown. Tokens(in/out): 25/100
+    "Mount Rainier stands proud,  \nCloaked in snow and whispered clouds,  \nNature's towering crown."
+

Teardown

PASSED test_aws_streaming 0:00:01.716384

Setup

Call

Captured stderr call
[2024-11-26T00:35:55Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-11-26T00:35:57Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (meta.llama3-8b-instruct-v1:0) - 1706ms. StopReason: unknown. Tokens(in/out): 25/100
     ---PROMPT---
     [chat] user: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
+    .
     
-    
-    The sun was setting over the Pacific Northwest, casting a warm orange glow over the landscape. The air was crisp and clean, filled with the scent of wildflowers and the sound of birds chirping their evening songs. In the distance, the majestic peak of Mt. Rainier rose high into the sky, its snow-capped summit shining like a beacon of grandeur.
-    
-    As the sun dipped lower, the mountain seemed to grow even taller, its rugged contours illuminated by the golden light. The trees
+    Here a few joy of the beauty of the mountains that the world is to know the heart of the world, the littleness of the littleness of the moment, the world's second. "The world is a big and the world of the moment, the moment of the moment, the world of the mind, the world of the moment, the one that was a moment of the moment, the little of the world, the little of the book of the moment, the one of the moment
     ---Parsed Response (string)---
-    "\n\nThe sun was setting over the Pacific Northwest, casting a warm orange glow over the landscape. The air was crisp and clean, filled with the scent of wildflowers and the sound of birds chirping their evening songs. In the distance, the majestic peak of Mt. Rainier rose high into the sky, its snow-capped summit shining like a beacon of grandeur.\n\nAs the sun dipped lower, the mountain seemed to grow even taller, its rugged contours illuminated by the golden light. The trees"
-

Teardown

PASSED test_streaming 0:00:02.560970

Setup

Call

Captured stderr call
[2024-11-25T23:51:12Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 2557ms. StopReason: stop. Tokens(in/out): 19/328
+    ".\n\nHere a few joy of the beauty of the mountains that the world is to know the heart of the world, the littleness of the littleness of the moment, the world's second. \"The world is a big and the world of the moment, the moment of the moment, the world of the mind, the world of the moment, the one that was a moment of the moment, the little of the world, the little of the book of the moment, the one of the moment"
+

Teardown

PASSED test_streaming 0:00:02.264261

Setup

Call

Captured stderr call
[2024-11-26T00:35:59Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 2254ms. StopReason: stop. Tokens(in/out): 19/240
     ---PROMPT---
     [chat] user: Tell me a short story about Programming languages are fun to create
     
     ---LLM REPLY---
-    Once upon a time, in a world where imagination knows no bounds, a group of programmers gathered together to create their very own programming language. They were filled with excitement and enthusiasm as they brainstormed ideas and debated on the best features to include.
-    
-    They worked tirelessly, pouring their hearts and minds into crafting a language that would be both powerful and user-friendly. Hours turned into days, days into weeks, but the programmers did not tire. They were driven by their passion for coding and the thrill of creating something unique.
+    There once was a young programmer named Lily who had a passion for creating new things. She spent hours at her computer, coding and experimenting with different programming languages. One day, she had an idea to create her own programming language from scratch.
     
-    Finally, after much collaboration and iteration, their programming language was born. They named it "CodeCraft" and unveiled it to the world with pride. Programmers from far and wide marveled at the ingenuity of CodeCraft, with its elegant syntax and innovative functionalities.
+    Lily started by researching various programming languages and studying their syntax and features. She then began to brainstorm how she could combine the best aspects of each language to create something unique and innovative.
     
-    As more and more developers adopted CodeCraft, a vibrant community formed around it. People shared tips, collaborated on projects, and pushed the boundaries of what could be achieved with the language. It became a tool for creativity and innovation, sparking new ideas and pushing the limits of what was thought possible in the world of programming.
+    After weeks of hard work and late nights, Lily finally unveiled her new programming language, which she called "LilyScript." It was a versatile language that allowed for easy manipulation of data and seamless integration with other programming languages.
     
-    The programmers who had created CodeCraft felt a sense of fulfillment and joy, knowing that they had brought something valuable and meaningful into the world. They continued to enhance and refine their language, always striving to make it better and more accessible to all who wished to use it.
+    To her delight, LilyScript quickly gained popularity among other programmers who found it easy to learn and fun to use. Lily was overjoyed to see her creation being used by others to develop amazing new software and applications.
     
-    And so, the tale of CodeCraft spread far and wide, inspiring other programmers to embark on their own journeys of creation and discovery. For in the world of programming, there is always room for new ideas, new languages, and new adventures waiting to be explored.
+    Programming languages are often seen as tools for solving problems, but for Lily, creating her own language was a creative and exciting endeavor. She realized that programming languages are not just functional, but can also be a form of art, allowing for boundless imagination and creativity. And for Lily, that was the most fun part of all.
     ---Parsed Response (string)---
-    "Once upon a time, in a world where imagination knows no bounds, a group of programmers gathered together to create their very own programming language. They were filled with excitement and enthusiasm as they brainstormed ideas and debated on the best features to include.\n\nThey worked tirelessly, pouring their hearts and minds into crafting a language that would be both powerful and user-friendly. Hours turned into days, days into weeks, but the programmers did not tire. They were driven by their passion for coding and the thrill of creating something unique.\n\nFinally, after much collaboration and iteration, their programming language was born. They named it \"CodeCraft\" and unveiled it to the world with pride. Programmers from far and wide marveled at the ingenuity of CodeCraft, with its elegant syntax and innovative functionalities.\n\nAs more and more developers adopted CodeCraft, a vibrant community formed around it. People shared tips, collaborated on projects, and pushed the boundaries of what could be achieved with the language. It became a tool for creativity and innovation, sparking new ideas and pushing the limits of what was thought possible in the world of programming.\n\nThe programmers who had created CodeCraft felt a sense of fulfillment and joy, knowing that they had brought something valuable and meaningful into the world. They continued to enhance and refine their language, always striving to make it better and more accessible to all who wished to use it.\n\nAnd so, the tale of CodeCraft spread far and wide, inspiring other programmers to embark on their own journeys of creation and discovery. For in the world of programming, there is always room for new ideas, new languages, and new adventures waiting to be explored."
-

Teardown

PASSED test_streaming_uniterated 0:00:02.058802

Setup

Call

Captured stderr call
[2024-11-25T23:51:14Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 2054ms. StopReason: stop. Tokens(in/out): 19/250
+    "There once was a young programmer named Lily who had a passion for creating new things. She spent hours at her computer, coding and experimenting with different programming languages. One day, she had an idea to create her own programming language from scratch.\n\nLily started by researching various programming languages and studying their syntax and features. She then began to brainstorm how she could combine the best aspects of each language to create something unique and innovative.\n\nAfter weeks of hard work and late nights, Lily finally unveiled her new programming language, which she called \"LilyScript.\" It was a versatile language that allowed for easy manipulation of data and seamless integration with other programming languages.\n\nTo her delight, LilyScript quickly gained popularity among other programmers who found it easy to learn and fun to use. Lily was overjoyed to see her creation being used by others to develop amazing new software and applications.\n\nProgramming languages are often seen as tools for solving problems, but for Lily, creating her own language was a creative and exciting endeavor. She realized that programming languages are not just functional, but can also be a form of art, allowing for boundless imagination and creativity. And for Lily, that was the most fun part of all."
+

Teardown

PASSED test_streaming_uniterated 0:00:01.840321

Setup

Call

Captured stderr call
[2024-11-26T00:36:01Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1832ms. StopReason: stop. Tokens(in/out): 19/240
     ---PROMPT---
     [chat] user: Tell me a short story about The color blue makes me sad
     
     ---LLM REPLY---
-    Every time Emily saw the color blue, a wave of sadness washed over her. It reminded her of the ocean where she had lost her father in a tragic boating accident when she was just a child. The serene blue skies made her remember the day of his funeral, the clear blue water mirrored the tears that had stained her cheeks as she said goodbye.
+    Sarah loved the color blue. It reminded her of the clear skies of summer, the depths of the ocean, and the calming presence of a gentle breeze. But one day, everything changed.
+    
+    Sarah's best friend, Jenny, was involved in a car accident. The car that hit her was blue. Ever since then, the color blue made Sarah sad. Every time she saw it, memories of that fateful day flooded her mind.
     
-    No matter how hard she tried to shake off this feeling, the color blue always managed to find its way back into her life, triggering memories she would rather forget. She avoided wearing blue clothes, painting her walls in blue, or even talking about the color.
+    She tried to avoid anything blue, but it was everywhere. The blue sky, blue flowers, blue clothing – it was impossible to escape. Sarah would often find herself overcome with grief whenever she caught a glimpse of the color that once brought her so much joy.
     
-    But one day, as she was walking by a field of beautiful blue flowers, she felt a sense of peace washing over her. She realized that blue didn't have to be a symbol of sadness; it could also represent calmness, beauty, and hope. Slowly, she began to embrace the color again, finding comfort in its familiar hue.
+    But as time passed, Sarah realized that she couldn't let the color blue control her emotions forever. She started to associate the color with happier memories of her friend, remembering all the good times they shared together.
     
-    From that day on, whenever Emily looked at the color blue, she didn't just see pain and sorrow. She saw the possibility of healing and the strength to move forward, knowing that despite the sadness it may evoke, there was also a hint of beauty and resilience within its depths.
+    Slowly but surely, the color blue lost its power over Sarah. It no longer made her sad, but instead served as a reminder of the love and friendship she shared with Jenny. And in that way, the color blue became a source of comfort and healing for Sarah, rather than sadness.
     ---Parsed Response (string)---
-    "Every time Emily saw the color blue, a wave of sadness washed over her. It reminded her of the ocean where she had lost her father in a tragic boating accident when she was just a child. The serene blue skies made her remember the day of his funeral, the clear blue water mirrored the tears that had stained her cheeks as she said goodbye.\n\nNo matter how hard she tried to shake off this feeling, the color blue always managed to find its way back into her life, triggering memories she would rather forget. She avoided wearing blue clothes, painting her walls in blue, or even talking about the color.\n\nBut one day, as she was walking by a field of beautiful blue flowers, she felt a sense of peace washing over her. She realized that blue didn't have to be a symbol of sadness; it could also represent calmness, beauty, and hope. Slowly, she began to embrace the color again, finding comfort in its familiar hue.\n\nFrom that day on, whenever Emily looked at the color blue, she didn't just see pain and sorrow. She saw the possibility of healing and the strength to move forward, knowing that despite the sadness it may evoke, there was also a hint of beauty and resilience within its depths."
-

Teardown

PASSED test_streaming_sync 0:00:02.796710

Setup

Call

Captured stderr call
[2024-11-25T23:51:16Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 2794ms. StopReason: stop. Tokens(in/out): 19/344
+    "Sarah loved the color blue. It reminded her of the clear skies of summer, the depths of the ocean, and the calming presence of a gentle breeze. But one day, everything changed.\n\nSarah's best friend, Jenny, was involved in a car accident. The car that hit her was blue. Ever since then, the color blue made Sarah sad. Every time she saw it, memories of that fateful day flooded her mind.\n\nShe tried to avoid anything blue, but it was everywhere. The blue sky, blue flowers, blue clothing – it was impossible to escape. Sarah would often find herself overcome with grief whenever she caught a glimpse of the color that once brought her so much joy.\n\nBut as time passed, Sarah realized that she couldn't let the color blue control her emotions forever. She started to associate the color with happier memories of her friend, remembering all the good times they shared together.\n\nSlowly but surely, the color blue lost its power over Sarah. It no longer made her sad, but instead served as a reminder of the love and friendship she shared with Jenny. And in that way, the color blue became a source of comfort and healing for Sarah, rather than sadness."
+

Teardown

PASSED test_streaming_sync 0:00:02.413249

Setup

Call

Captured stderr call
[2024-11-26T00:36:03Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 2407ms. StopReason: stop. Tokens(in/out): 19/283
     ---PROMPT---
     [chat] user: Tell me a short story about Programming languages are fun to create
     
     ---LLM REPLY---
-    Once upon a time, in a world where technology reigned supreme, there lived a brilliant young programmer named Lily. Lily was known far and wide for her unmatched skills in creating programming languages.
+    Once upon a time, in a land where technology reigned supreme, a group of brilliant programmers set out to create their own programming languages. Each one had a unique vision and sought to bring their creations to life.
     
-    One day, Lily was struck with a brilliant idea to create a new, innovative programming language that would revolutionize the way people interacted with computers. She spent countless hours pouring over lines of code, carefully crafting each element of the language with precision and care.
+    The first programmer, a young and ambitious woman, crafted a language that was sleek, intuitive, and easy to learn. It was designed for beginners, making it accessible to anyone who wanted to delve into the world of coding.
     
-    As she worked, she found herself completely consumed by the creative process. She was fueled by the excitement of bringing something entirely new into the world, something that had never existed before. The thrill of seeing her ideas come to life on the screen was unlike anything she had ever experienced.
+    The second programmer, a seasoned veteran in the field, developed a language that was powerful, efficient, and perfect for handling complex tasks. It was a tool for advanced programmers, enabling them to tackle any challenge with ease.
     
-    As the days turned into weeks, Lily's creation began to take shape. She named her new programming language "Spark" because she believed it would ignite a fire in the world of technology. And indeed, Spark did just that.
+    And lastly, the third programmer, a quirky and creative individual, came up with a language that was quirky, unconventional, and full of surprises. It was meant to inspire creativity and innovation, allowing users to think outside the box and push the boundaries of what was possible.
     
-    Programmers from all corners of the globe marveled at the simplicity and power of Spark. They praised Lily for her ingenuity and vision, and soon, Spark became one of the most popular programming languages in existence.
+    As they shared their creations with the world, programmers everywhere rejoiced at the prospect of exploring these new languages. They found joy in experimenting, problem-solving, and creating new projects that were only limited by their imaginations.
     
-    Lily was overjoyed by the success of her creation. She had proven that programming languages were not just tools for coding, but also works of art that could inspire and empower others. And as she continued to create new languages, she knew that the possibilities were endless.
-    
-    From that day on, Lily's name was synonymous with innovation and creativity in the world of programming. And she continued to push the boundaries of what was possible, showing the world that programming languages were not just fun to create, but essential to shaping the future of technology.
+    And so, the world of programming was forever changed, as these languages brought a sense of fun, excitement, and endless possibilities to all who used them. And the programmers lived happily ever after, knowing that they had left their mark on the world of technology.
     ---Parsed Response (string)---
-    "Once upon a time, in a world where technology reigned supreme, there lived a brilliant young programmer named Lily. Lily was known far and wide for her unmatched skills in creating programming languages.\n\nOne day, Lily was struck with a brilliant idea to create a new, innovative programming language that would revolutionize the way people interacted with computers. She spent countless hours pouring over lines of code, carefully crafting each element of the language with precision and care.\n\nAs she worked, she found herself completely consumed by the creative process. She was fueled by the excitement of bringing something entirely new into the world, something that had never existed before. The thrill of seeing her ideas come to life on the screen was unlike anything she had ever experienced.\n\nAs the days turned into weeks, Lily's creation began to take shape. She named her new programming language \"Spark\" because she believed it would ignite a fire in the world of technology. And indeed, Spark did just that.\n\nProgrammers from all corners of the globe marveled at the simplicity and power of Spark. They praised Lily for her ingenuity and vision, and soon, Spark became one of the most popular programming languages in existence.\n\nLily was overjoyed by the success of her creation. She had proven that programming languages were not just tools for coding, but also works of art that could inspire and empower others. And as she continued to create new languages, she knew that the possibilities were endless.\n\nFrom that day on, Lily's name was synonymous with innovation and creativity in the world of programming. And she continued to push the boundaries of what was possible, showing the world that programming languages were not just fun to create, but essential to shaping the future of technology."
-

Teardown

PASSED test_streaming_uniterated_sync 0:00:03.368163

Setup

Call

Captured stderr call
[2024-11-25T23:51:20Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 3365ms. StopReason: stop. Tokens(in/out): 19/359
+    "Once upon a time, in a land where technology reigned supreme, a group of brilliant programmers set out to create their own programming languages. Each one had a unique vision and sought to bring their creations to life.\n\nThe first programmer, a young and ambitious woman, crafted a language that was sleek, intuitive, and easy to learn. It was designed for beginners, making it accessible to anyone who wanted to delve into the world of coding.\n\nThe second programmer, a seasoned veteran in the field, developed a language that was powerful, efficient, and perfect for handling complex tasks. It was a tool for advanced programmers, enabling them to tackle any challenge with ease.\n\nAnd lastly, the third programmer, a quirky and creative individual, came up with a language that was quirky, unconventional, and full of surprises. It was meant to inspire creativity and innovation, allowing users to think outside the box and push the boundaries of what was possible.\n\nAs they shared their creations with the world, programmers everywhere rejoiced at the prospect of exploring these new languages. They found joy in experimenting, problem-solving, and creating new projects that were only limited by their imaginations.\n\nAnd so, the world of programming was forever changed, as these languages brought a sense of fun, excitement, and endless possibilities to all who used them. And the programmers lived happily ever after, knowing that they had left their mark on the world of technology."
+

Teardown

PASSED test_streaming_uniterated_sync 0:00:02.961963

Setup

Call

Captured stderr call
[2024-11-26T00:36:06Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 2954ms. StopReason: stop. Tokens(in/out): 19/315
     ---PROMPT---
     [chat] user: Tell me a short story about The color blue makes me sad
     
     ---LLM REPLY---
-    Once there was a little girl named Sophie who always felt a wave of sadness every time she saw the color blue. She didn't know why, but whenever she looked at the sky or saw someone wearing blue clothing, a deep sense of melancholy washed over her.
-    
-    As she grew older, Sophie tried to avoid anything blue as much as possible. She refused to paint her bedroom walls blue, and she even asked her friends not to wear blue around her.
-    
-    One day, Sophie's best friend Lily asked her why she was so averse to the color blue. Sophie confided in Lily, telling her about the inexplicable sadness she felt whenever she saw it.
-    
-    Lily listened intently and then suggested that they go on a trip to the beach together. Sophie was hesitant at first, knowing that the ocean was a vast expanse of blue. But she trusted Lily and agreed to go.
+    Every time Lisa saw the color blue, it reminded her of the day her father passed away. He had been wearing a blue shirt, and since then, the color had taken on a heavy weight in her heart.
     
-    As they arrived at the beach, Sophie's eyes widened at the sight of the crystal clear sea and the vibrant blue sky above. She felt a lump in her throat as tears stung her eyes.
+    She found herself avoiding anything blue, from the sky to her favorite sweater. The mere sight of it would bring back memories of that fateful day, the sound of hospital machines beeping in the background, and the look of sorrow on her mother's face.
     
-    But as she stood there, feeling the warm sun on her face and the gentle breeze through her hair, something shifted inside her. She realized that the color blue was not always a sad thing. It was a beautiful and calming hue that could bring her joy if she allowed it.
+    No matter how hard she tried to shake off the sadness that accompanied the color blue, it seemed to linger everywhere she turned. It was as if the color had seeped into her soul and would never let her forget the pain and loss she had experienced.
     
-    From that day on, Sophie embraced the color blue. She painted her room a lovely shade of sky blue, wore blue dresses and even started a collection of blue sea glass she found on the beach.
+    But one day, as she sat by the ocean watching the waves crash against the shore, she realized that blue wasn't just a color of sadness. It was also a color of peace and tranquility, of vastness and wonder. And in that moment, she decided to embrace the color blue once again, not as a reminder of her father's passing, but as a symbol of the love and memories they had shared.
     
-    She had discovered that the color blue didn't have to make her sad. It could be a source of peace and happiness, a reminder of the beauty that surrounded her every day. And Sophie was grateful for that new perspective.
+    From then on, whenever she saw the color blue, she would smile, knowing that her father was watching over her, bringing her comfort and joy in the most unexpected of places. And as she gazed at the endless expanse of blue sky above her, she felt a sense of peace and happiness wash over her, knowing that her father's spirit was always with her, guiding her through the darkest of days.
     ---Parsed Response (string)---
-    "Once there was a little girl named Sophie who always felt a wave of sadness every time she saw the color blue. She didn't know why, but whenever she looked at the sky or saw someone wearing blue clothing, a deep sense of melancholy washed over her.\n\nAs she grew older, Sophie tried to avoid anything blue as much as possible. She refused to paint her bedroom walls blue, and she even asked her friends not to wear blue around her.\n\nOne day, Sophie's best friend Lily asked her why she was so averse to the color blue. Sophie confided in Lily, telling her about the inexplicable sadness she felt whenever she saw it.\n\nLily listened intently and then suggested that they go on a trip to the beach together. Sophie was hesitant at first, knowing that the ocean was a vast expanse of blue. But she trusted Lily and agreed to go.\n\nAs they arrived at the beach, Sophie's eyes widened at the sight of the crystal clear sea and the vibrant blue sky above. She felt a lump in her throat as tears stung her eyes.\n\nBut as she stood there, feeling the warm sun on her face and the gentle breeze through her hair, something shifted inside her. She realized that the color blue was not always a sad thing. It was a beautiful and calming hue that could bring her joy if she allowed it.\n\nFrom that day on, Sophie embraced the color blue. She painted her room a lovely shade of sky blue, wore blue dresses and even started a collection of blue sea glass she found on the beach.\n\nShe had discovered that the color blue didn't have to make her sad. It could be a source of peace and happiness, a reminder of the beauty that surrounded her every day. And Sophie was grateful for that new perspective."
-

Teardown

PASSED test_streaming_claude 0:00:01.313189

Setup

Call

Captured stdout call
msgs:
-Here's a haiku about Mt. Rainier's height:
+    "Every time Lisa saw the color blue, it reminded her of the day her father passed away. He had been wearing a blue shirt, and since then, the color had taken on a heavy weight in her heart.\n\nShe found herself avoiding anything blue, from the sky to her favorite sweater. The mere sight of it would bring back memories of that fateful day, the sound of hospital machines beeping in the background, and the look of sorrow on her mother's face.\n\nNo matter how hard she tried to shake off the sadness that accompanied the color blue, it seemed to linger everywhere she turned. It was as if the color had seeped into her soul and would never let her forget the pain and loss she had experienced.\n\nBut one day, as she sat by the ocean watching the waves crash against the shore, she realized that blue wasn't just a color of sadness. It was also a color of peace and tranquility, of vastness and wonder. And in that moment, she decided to embrace the color blue once again, not as a reminder of her father's passing, but as a symbol of the love and memories they had shared.\n\nFrom then on, whenever she saw the color blue, she would smile, knowing that her father was watching over her, bringing her comfort and joy in the most unexpected of places. And as she gazed at the endless expanse of blue sky above her, she felt a sense of peace and happiness wash over her, knowing that her father's spirit was always with her, guiding her through the darkest of days."
+

Teardown

PASSED test_streaming_claude 0:00:01.490866

Setup

Call

Captured stdout call
msgs:
+Here's a haiku about Mt. Rainier:
 
-Rainier towers high
-Ancient glacier-crowned giant
-Piercing northwest skies
+Rainier stands above
+Piercing through clouds in splendor
+Ancient ice crowned peak
 final:
-Here's a haiku about Mt. Rainier's height:
+Here's a haiku about Mt. Rainier:
 
-Rainier towers high
-Ancient glacier-crowned giant
-Piercing northwest skies
-
Captured stderr call
[2024-11-25T23:51:21Z INFO  baml_events] Function PromptTestClaude:
-    Client: Sonnet (claude-3-5-sonnet-20241022) - 1298ms. StopReason: "end_turn". Tokens(in/out): 19/36
+Rainier stands above
+Piercing through clouds in splendor
+Ancient ice crowned peak
+
Captured stderr call
[2024-11-26T00:36:08Z INFO  baml_events] Function PromptTestClaude:
+    Client: Sonnet (claude-3-5-sonnet-20241022) - 1460ms. StopReason: "end_turn". Tokens(in/out): 19/36
     ---PROMPT---
     [chat] user: Tell me a haiku about Mt Rainier is tall
     
     ---LLM REPLY---
-    Here's a haiku about Mt. Rainier's height:
+    Here's a haiku about Mt. Rainier:
     
-    Rainier towers high
-    Ancient glacier-crowned giant
-    Piercing northwest skies
+    Rainier stands above
+    Piercing through clouds in splendor
+    Ancient ice crowned peak
     ---Parsed Response (string)---
-    "Here's a haiku about Mt. Rainier's height:\n\nRainier towers high\nAncient glacier-crowned giant\nPiercing northwest skies"
-

Teardown

PASSED test_streaming_gemini 0:00:08.396686

Setup

Call

Captured stdout call
msgs:
-Dottie Mae hadn't felt like herself since the storm hit. The power outage had spoiled all the milk, the heat was unbearable, and worst of all, she was down to her last can of Dr Pepper. 
-
-“Don't you fret none, Dottie Mae,” she mumbled to herself, “This here's a special occasion can. This one's gonna banish these storm clouds for good.”
-
-She popped the top, the familiar fizz a symphony to her ears. She took a long, slow sip, savoring the sweet, spicy taste that always reminded her of lazy summer evenings on the porch swing. 
+    "Here's a haiku about Mt. Rainier:\n\nRainier stands above\nPiercing through clouds in splendor\nAncient ice crowned peak"
+

Teardown

PASSED test_streaming_gemini 0:00:08.346627

Setup

Call

Captured stdout call
msgs:
+Dottie Mae's Diner bustled with the usual lunchtime crowd. Truckers, weary from the endless ribbon of highway, hunched over steaming plates of meatloaf. Locals swapped gossip over bottomless cups of coffee. And then there was Millie, perched on her usual stool at the counter, nursing a glass of ice-cold Dr Pepper. 
 
-Suddenly, the wind chimes outside began to clang furiously, though there wasn't a breath of wind. Then, a low rumble, not of thunder, but of something humming…singing?  
+Now, Millie knew her Dr Pepper. Had a glass every day since she was a girl, back when a nickel bought you a smile and a frosty bottle. Today, something was different. The familiar bite was sharper, the caramel notes singing a little louder. She swirled the dark liquid, mesmerized by the way it caught the light.
 
-Dottie Mae cautiously peeked out the window. There, hovering above her overgrown zinnias, was a miniature airship, shaped like a can of Dr Pepper, glowing with a soft, amber light. A ladder dropped from its underside, and a booming, jovial voice echoed from above. 
+"Something wrong with your drink, Millie?" asked Earl, the owner, wiping his hands on his apron.
 
-"Dottie Mae, we heard you were down to your last drop. Don't you worry none, we got you covered!"
+"Earl, this Dr Pepper...it's different. It's like...magic."
 
-A figure in a crisp white uniform, his face obscured by the shadow of his captain's hat, descended the ladder. He held out a frosty, familiar can.
+Earl chuckled, "It's the same 23 flavors, Millie. Maybe the heat's getting to you."
 
-"This here's a special delivery, ma'am. The good stuff. 23 flavors and then some!"
+But Millie knew better. This wasn't just any Dr Pepper. This was a taste of forgotten dreams, of summer evenings on porch swings, of a time when life was simpler. As she sipped, a warm feeling spread through her, chasing away the aches and pains that came with her 80-odd years. 
 
-Dottie Mae, her eyes wide with wonder, took the can. "But…how?" she stammered.
+Word got around about Millie's "magic" Dr Pepper. Soon, the diner was packed. People lined up, not just for a burger or a slice of pie, but for a chance to taste the extraordinary in the ordinary. And you know what? Some swore they felt it too. A forgotten memory resurfacing, a spark of joy, a moment of pure, simple happiness. 
 
-The figure tipped his hat and winked. "Let's just say, Dottie Mae, that when you love Dr Pepper as much as you do, sometimes, just sometimes, miracles happen."
-
-And with another rumble, the airship, shining like a beacon of hope, ascended into the now clear, star-studded sky, leaving Dottie Mae with a heart full of joy and a lifetime supply of her favorite drink. 
+It didn't last, of course. The next day, the Dr Pepper tasted just like it always had. But for a fleeting moment, Dottie Mae's Diner had been touched by something special. And it all started with Millie and her belief in the magic of a simple soda. 
 
 final:
-Dottie Mae hadn't felt like herself since the storm hit. The power outage had spoiled all the milk, the heat was unbearable, and worst of all, she was down to her last can of Dr Pepper. 
-
-“Don't you fret none, Dottie Mae,” she mumbled to herself, “This here's a special occasion can. This one's gonna banish these storm clouds for good.”
-
-She popped the top, the familiar fizz a symphony to her ears. She took a long, slow sip, savoring the sweet, spicy taste that always reminded her of lazy summer evenings on the porch swing. 
-
-Suddenly, the wind chimes outside began to clang furiously, though there wasn't a breath of wind. Then, a low rumble, not of thunder, but of something humming…singing?  
+Dottie Mae's Diner bustled with the usual lunchtime crowd. Truckers, weary from the endless ribbon of highway, hunched over steaming plates of meatloaf. Locals swapped gossip over bottomless cups of coffee. And then there was Millie, perched on her usual stool at the counter, nursing a glass of ice-cold Dr Pepper. 
 
-Dottie Mae cautiously peeked out the window. There, hovering above her overgrown zinnias, was a miniature airship, shaped like a can of Dr Pepper, glowing with a soft, amber light. A ladder dropped from its underside, and a booming, jovial voice echoed from above. 
+Now, Millie knew her Dr Pepper. Had a glass every day since she was a girl, back when a nickel bought you a smile and a frosty bottle. Today, something was different. The familiar bite was sharper, the caramel notes singing a little louder. She swirled the dark liquid, mesmerized by the way it caught the light.
 
-"Dottie Mae, we heard you were down to your last drop. Don't you worry none, we got you covered!"
+"Something wrong with your drink, Millie?" asked Earl, the owner, wiping his hands on his apron.
 
-A figure in a crisp white uniform, his face obscured by the shadow of his captain's hat, descended the ladder. He held out a frosty, familiar can.
+"Earl, this Dr Pepper...it's different. It's like...magic."
 
-"This here's a special delivery, ma'am. The good stuff. 23 flavors and then some!"
+Earl chuckled, "It's the same 23 flavors, Millie. Maybe the heat's getting to you."
 
-Dottie Mae, her eyes wide with wonder, took the can. "But…how?" she stammered.
+But Millie knew better. This wasn't just any Dr Pepper. This was a taste of forgotten dreams, of summer evenings on porch swings, of a time when life was simpler. As she sipped, a warm feeling spread through her, chasing away the aches and pains that came with her 80-odd years. 
 
-The figure tipped his hat and winked. "Let's just say, Dottie Mae, that when you love Dr Pepper as much as you do, sometimes, just sometimes, miracles happen."
+Word got around about Millie's "magic" Dr Pepper. Soon, the diner was packed. People lined up, not just for a burger or a slice of pie, but for a chance to taste the extraordinary in the ordinary. And you know what? Some swore they felt it too. A forgotten memory resurfacing, a spark of joy, a moment of pure, simple happiness. 
 
-And with another rumble, the airship, shining like a beacon of hope, ascended into the now clear, star-studded sky, leaving Dottie Mae with a heart full of joy and a lifetime supply of her favorite drink. 
+It didn't last, of course. The next day, the Dr Pepper tasted just like it always had. But for a fleeting moment, Dottie Mae's Diner had been touched by something special. And it all started with Millie and her belief in the magic of a simple soda. 
 
-
Captured stderr call
[2024-11-25T23:51:29Z INFO  baml_events] Function TestGemini:
-    Client: Gemini (gemini-1.5-pro-001) - 8391ms. StopReason: Stop. Tokens(in/out): unknown/unknown
+
Captured stderr call
[2024-11-26T00:36:16Z INFO  baml_events] Function TestGemini:
+    Client: Gemini (gemini-1.5-pro-001) - 8337ms. StopReason: Stop. Tokens(in/out): unknown/unknown
     ---PROMPT---
     [chat] user: Write a nice short story about Dr.Pepper
     
     ---LLM REPLY---
-    Dottie Mae hadn't felt like herself since the storm hit. The power outage had spoiled all the milk, the heat was unbearable, and worst of all, she was down to her last can of Dr Pepper. 
-    
-    “Don't you fret none, Dottie Mae,” she mumbled to herself, “This here's a special occasion can. This one's gonna banish these storm clouds for good.”
-    
-    She popped the top, the familiar fizz a symphony to her ears. She took a long, slow sip, savoring the sweet, spicy taste that always reminded her of lazy summer evenings on the porch swing. 
-    
-    Suddenly, the wind chimes outside began to clang furiously, though there wasn't a breath of wind. Then, a low rumble, not of thunder, but of something humming…singing?  
+    Dottie Mae's Diner bustled with the usual lunchtime crowd. Truckers, weary from the endless ribbon of highway, hunched over steaming plates of meatloaf. Locals swapped gossip over bottomless cups of coffee. And then there was Millie, perched on her usual stool at the counter, nursing a glass of ice-cold Dr Pepper. 
     
-    Dottie Mae cautiously peeked out the window. There, hovering above her overgrown zinnias, was a miniature airship, shaped like a can of Dr Pepper, glowing with a soft, amber light. A ladder dropped from its underside, and a booming, jovial voice echoed from above. 
+    Now, Millie knew her Dr Pepper. Had a glass every day since she was a girl, back when a nickel bought you a smile and a frosty bottle. Today, something was different. The familiar bite was sharper, the caramel notes singing a little louder. She swirled the dark liquid, mesmerized by the way it caught the light.
     
-    "Dottie Mae, we heard you were down to your last drop. Don't you worry none, we got you covered!"
+    "Something wrong with your drink, Millie?" asked Earl, the owner, wiping his hands on his apron.
     
-    A figure in a crisp white uniform, his face obscured by the shadow of his captain's hat, descended the ladder. He held out a frosty, familiar can.
+    "Earl, this Dr Pepper...it's different. It's like...magic."
     
-    "This here's a special delivery, ma'am. The good stuff. 23 flavors and then some!"
+    Earl chuckled, "It's the same 23 flavors, Millie. Maybe the heat's getting to you."
     
-    Dottie Mae, her eyes wide with wonder, took the can. "But…how?" she stammered.
+    But Millie knew better. This wasn't just any Dr Pepper. This was a taste of forgotten dreams, of summer evenings on porch swings, of a time when life was simpler. As she sipped, a warm feeling spread through her, chasing away the aches and pains that came with her 80-odd years. 
     
-    The figure tipped his hat and winked. "Let's just say, Dottie Mae, that when you love Dr Pepper as much as you do, sometimes, just sometimes, miracles happen."
+    Word got around about Millie's "magic" Dr Pepper. Soon, the diner was packed. People lined up, not just for a burger or a slice of pie, but for a chance to taste the extraordinary in the ordinary. And you know what? Some swore they felt it too. A forgotten memory resurfacing, a spark of joy, a moment of pure, simple happiness. 
     
-    And with another rumble, the airship, shining like a beacon of hope, ascended into the now clear, star-studded sky, leaving Dottie Mae with a heart full of joy and a lifetime supply of her favorite drink. 
+    It didn't last, of course. The next day, the Dr Pepper tasted just like it always had. But for a fleeting moment, Dottie Mae's Diner had been touched by something special. And it all started with Millie and her belief in the magic of a simple soda. 
     
     ---Parsed Response (string)---
-    "Dottie Mae hadn't felt like herself since the storm hit. The power outage had spoiled all the milk, the heat was unbearable, and worst of all, she was down to her last can of Dr Pepper. \n\n“Don't you fret none, Dottie Mae,” she mumbled to herself, “This here's a special occasion can. This one's gonna banish these storm clouds for good.”\n\nShe popped the top, the familiar fizz a symphony to her ears. She took a long, slow sip, savoring the sweet, spicy taste that always reminded her of lazy summer evenings on the porch swing. \n\nSuddenly, the wind chimes outside began to clang furiously, though there wasn't a breath of wind. Then, a low rumble, not of thunder, but of something humming…singing?  \n\nDottie Mae cautiously peeked out the window. There, hovering above her overgrown zinnias, was a miniature airship, shaped like a can of Dr Pepper, glowing with a soft, amber light. A ladder dropped from its underside, and a booming, jovial voice echoed from above. \n\n\"Dottie Mae, we heard you were down to your last drop. Don't you worry none, we got you covered!\"\n\nA figure in a crisp white uniform, his face obscured by the shadow of his captain's hat, descended the ladder. He held out a frosty, familiar can.\n\n\"This here's a special delivery, ma'am. The good stuff. 23 flavors and then some!\"\n\nDottie Mae, her eyes wide with wonder, took the can. \"But…how?\" she stammered.\n\nThe figure tipped his hat and winked. \"Let's just say, Dottie Mae, that when you love Dr Pepper as much as you do, sometimes, just sometimes, miracles happen.\"\n\nAnd with another rumble, the airship, shining like a beacon of hope, ascended into the now clear, star-studded sky, leaving Dottie Mae with a heart full of joy and a lifetime supply of her favorite drink. \n"
-

Teardown

PASSED test_tracing_async_only 0:00:06.230532

Setup

Call

Captured stdout call
STATS TraceStats(failed=0, started=15, finalized=15, submitted=15, sent=15, done=15)
-
Captured stderr call
[2024-11-25T23:51:30Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 476ms. StopReason: stop. Tokens(in/out): 50/18
+    "Dottie Mae's Diner bustled with the usual lunchtime crowd. Truckers, weary from the endless ribbon of highway, hunched over steaming plates of meatloaf. Locals swapped gossip over bottomless cups of coffee. And then there was Millie, perched on her usual stool at the counter, nursing a glass of ice-cold Dr Pepper. \n\nNow, Millie knew her Dr Pepper. Had a glass every day since she was a girl, back when a nickel bought you a smile and a frosty bottle. Today, something was different. The familiar bite was sharper, the caramel notes singing a little louder. She swirled the dark liquid, mesmerized by the way it caught the light.\n\n\"Something wrong with your drink, Millie?\" asked Earl, the owner, wiping his hands on his apron.\n\n\"Earl, this Dr Pepper...it's different. It's like...magic.\"\n\nEarl chuckled, \"It's the same 23 flavors, Millie. Maybe the heat's getting to you.\"\n\nBut Millie knew better. This wasn't just any Dr Pepper. This was a taste of forgotten dreams, of summer evenings on porch swings, of a time when life was simpler. As she sipped, a warm feeling spread through her, chasing away the aches and pains that came with her 80-odd years. \n\nWord got around about Millie's \"magic\" Dr Pepper. Soon, the diner was packed. People lined up, not just for a burger or a slice of pie, but for a chance to taste the extraordinary in the ordinary. And you know what? Some swore they felt it too. A forgotten memory resurfacing, a spark of joy, a moment of pure, simple happiness. \n\nIt didn't last, of course. The next day, the Dr Pepper tasted just like it always had. But for a fleeting moment, Dottie Mae's Diner had been touched by something special. And it all started with Millie and her belief in the magic of a simple soda. \n"
+

Teardown

PASSED test_tracing_async_only 0:00:05.556180

Setup

Call

Captured stdout call
STATS TraceStats(failed=0, started=15, finalized=15, submitted=15, sent=15, done=15)
+
Captured stderr call
[2024-11-26T00:36:17Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 727ms. StopReason: stop. Tokens(in/out): 50/18
     ---PROMPT---
     [chat] user: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -1139,16 +1239,16 @@
     
     ---LLM REPLY---
     {
-      "prop1": "example",
+      "prop1": "Hello",
       "prop2": 540
     }
     ---Parsed Response (class TestOutputClass)---
     {
-      "prop1": "example",
+      "prop1": "Hello",
       "prop2": 540
     }
-[2024-11-25T23:51:31Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 468ms. StopReason: stop. Tokens(in/out): 50/18
+[2024-11-26T00:36:18Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 437ms. StopReason: stop. Tokens(in/out): 50/18
     ---PROMPT---
     [chat] user: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -1171,8 +1271,8 @@
       "prop1": "Hello",
       "prop2": 540
     }
-[2024-11-25T23:51:33Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 409ms. StopReason: stop. Tokens(in/out): 50/18
+[2024-11-26T00:36:19Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 667ms. StopReason: stop. Tokens(in/out): 50/18
     ---PROMPT---
     [chat] user: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -1195,8 +1295,8 @@
       "prop1": "Hello",
       "prop2": 540
     }
-[2024-11-25T23:51:35Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 988ms. StopReason: stop. Tokens(in/out): 50/18
+[2024-11-26T00:36:21Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 446ms. StopReason: stop. Tokens(in/out): 50/18
     ---PROMPT---
     [chat] user: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -1219,9 +1319,9 @@
       "prop1": "example",
       "prop2": 540
     }
-

Teardown

PASSED test_tracing_sync 0:00:00.000419

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.467343

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.444399

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.373790

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.464393

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.298194

Setup

Call

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

Teardown

PASSED test_tracing_sync 0:00:00.000356

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.489107

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.129490

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.398919

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.282715

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.131032

Setup

Call

Captured stdout call
{'name': 'Harrison', 'hair_color': <Color.BLACK: 'BLACK'>, 'last_name': [], 'height': 1.8288, 'hobbies': [<Hobby.SPORTS: 'SPORTS'>]}
+
Captured stderr call
[2024-11-26T00:36:41Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-08-06) - 1123ms. StopReason: stop. Tokens(in/out): 177/50
     ---PROMPT---
     [chat] system: You are an expert extraction algorithm. Only extract relevant information from the text. If you do not know the value of an attribute asked to extract, return null for the attribute's value.
     
@@ -1248,7 +1348,7 @@
         "name": "Harrison",
         "hair_color": "BLACK",
         "last_name": [],
-        "height": 1.83,
+        "height": 1.8288,
         "hobbies": ["sports"]
       }
     ]
@@ -1259,16 +1359,16 @@
         "name": "Harrison",
         "hair_color": "BLACK",
         "last_name": [],
-        "height": 1.83,
+        "height": 1.8288,
         "hobbies": [
           "SPORTS"
         ]
       }
     ]
-

Teardown

PASSED test_dynamic_class_output 0:00:01.059491

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_dynamic_class_output 0:00:00.931332

Setup

Call

Captured stdout call
[]
 {"hair_color":"black"}
-
Captured stderr call
[2024-11-25T23:51:56Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 425ms. StopReason: stop. Tokens(in/out): 49/10
+
Captured stderr call
[2024-11-26T00:36:42Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 449ms. StopReason: stop. Tokens(in/out): 49/10
     ---PROMPT---
     [chat] user: Given a string, extract info using the schema:
     
@@ -1287,8 +1387,8 @@
     {
       "hair_color": "black"
     }
-[2024-11-25T23:51:57Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 625ms. StopReason: stop. Tokens(in/out): 49/10
+[2024-11-26T00:36:42Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 471ms. StopReason: stop. Tokens(in/out): 49/10
     ---PROMPT---
     [chat] user: Given a string, extract info using the schema:
     
@@ -1307,9 +1407,9 @@
     {
       "hair_color": "black"
     }
-

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.691159

Setup

Call

Captured stdout call
{"name":{"first_name":"Mark","last_name":"Gonzalez","middle_name":null},"address":null,"hair_color":"black","height":6.0}
-
Captured stderr call
[2024-11-25T23:51:58Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 685ms. StopReason: stop. Tokens(in/out): 117/57
+

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:01.176101

Setup

Call

Captured stdout call
{"name":{"first_name":"Mark","last_name":"Gonzalez","middle_name":null},"address":null,"hair_color":"black","height":6.0}
+
Captured stderr call
[2024-11-26T00:36:43Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1164ms. StopReason: stop. Tokens(in/out): 117/57
     ---PROMPT---
     [chat] user: Given a string, extract info using the schema:
     
@@ -1354,7 +1454,7 @@
       "hair_color": "black",
       "height": 6.0
     }
-

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.666037

Setup

Call

Captured stdout call
streamed  name=None hair_color=None
+

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.717229

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}
@@ -1431,8 +1531,8 @@
 streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color='black'
 streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': 'black'}
 {"name":{"first_name":"Mark","last_name":"Gonzalez"},"hair_color":"black"}
-
Captured stderr call
[2024-11-25T23:51:58Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 661ms. StopReason: stop. Tokens(in/out): 73/35
+
Captured stderr call
[2024-11-26T00:36:44Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 710ms. StopReason: stop. Tokens(in/out): 73/35
     ---PROMPT---
     [chat] user: Given a string, extract info using the schema:
     
@@ -1463,7 +1563,7 @@
       },
       "hair_color": "black"
     }
-

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.491513

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.785962

Setup

Call

Captured stdout call
[]
 streamed  {'hair_color': '{'}
 streamed  {'hair_color': '{'}
 streamed  {'hair_color': '{\n  "'}
@@ -1480,8 +1580,8 @@
 final  hair_color='black'
 final  {'hair_color': 'black'}
 final  {"hair_color":"black"}
-
Captured stderr call
[2024-11-25T23:51:59Z INFO  baml_events] Function MyFunc:
-    Client: MyClient (gpt-4o-mini-2024-07-18) - 487ms. StopReason: stop. Tokens(in/out): 48/14
+
Captured stderr call
[2024-11-26T00:36:45Z INFO  baml_events] Function MyFunc:
+    Client: MyClient (gpt-4o-mini-2024-07-18) - 780ms. StopReason: stop. Tokens(in/out): 48/14
     ---PROMPT---
     [chat] user: Given a string, extract info using the schema:
     
@@ -1502,22 +1602,22 @@
     {
       "hair_color": "black"
     }
-

Teardown

PASSED test_dynamic_inputs_list2 0:00:00.906871

Setup

Call

Captured stderr call
[2024-11-25T23:52:00Z INFO  baml_events] Function DynamicListInputOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 902ms. StopReason: stop. Tokens(in/out): 135/79
+

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.407343

Setup

Call

Captured stderr call
[2024-11-26T00:36:46Z INFO  baml_events] Function DynamicListInputOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1399ms. StopReason: stop. Tokens(in/out): 135/79
     ---PROMPT---
     [chat] user: Here is some input data:
     ----
     [{
-        "new_key": "hi1",
         "testKey": "myTest",
+        "new_key": "hi1",
         "blah": {
             "nestedKey1": "nestedVal",
         },
     }, {
-        "new_key": "hi",
         "blah": {
             "nestedKey1": "nestedVal",
         },
+        "new_key": "hi",
         "testKey": "myTest",
     }]
     ----
@@ -1568,8 +1668,8 @@
         }
       }
     ]
-

Teardown

PASSED test_dynamic_types_new_enum 0:00:01.189088

Setup

Call

Captured stderr call
[2024-11-25T23:52:01Z INFO  baml_events] Function ExtractPeople:
-    Client: GPT4 (gpt-4o-2024-08-06) - 1185ms. StopReason: stop. Tokens(in/out): 149/36
+

Teardown

PASSED test_dynamic_types_new_enum 0:00:01.202549

Setup

Call

Captured stderr call
[2024-11-26T00:36:47Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-08-06) - 1196ms. StopReason: stop. Tokens(in/out): 149/32
     ---PROMPT---
     [chat] system: You are an expert extraction algorithm. Only extract relevant information from the text. If you do not know the value of an attribute asked to extract, return null for the attribute's value.
     
@@ -1584,7 +1684,6 @@
     user: My name is Harrison. My hair is black and I'm 6 feet tall. I'm pretty good around the hoop. I like giraffes.
     
     ---LLM REPLY---
-    ```json
     [
       {
         "name": "Harrison",
@@ -1592,7 +1691,6 @@
         "animalLiked": "GIRAFFE"
       }
     ]
-    ```
     ---Parsed Response (list<class Person>)---
     [
       {
@@ -1601,8 +1699,8 @@
         "animalLiked": "GIRAFFE"
       }
     ]
-

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.648867

Setup

Call

Captured stderr call
[2024-11-25T23:52:01Z INFO  baml_events] Function ExtractHobby:
-    Client: GPT4 (gpt-4o-2024-08-06) - 642ms. StopReason: stop. Tokens(in/out): 65/16
+

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.775854

Setup

Call

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

Teardown

PASSED test_dynamic_literals 0:00:00.925722

Setup

Call

Captured stderr call
[2024-11-25T23:52:02Z INFO  baml_events] Function ExtractPeople:
-    Client: GPT4 (gpt-4o-2024-08-06) - 922ms. StopReason: stop. Tokens(in/out): 149/32
+

Teardown

PASSED test_dynamic_literals 0:00:02.349094

Setup

Call

Captured stderr call
[2024-11-26T00:36:50Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-08-06) - 2342ms. StopReason: stop. Tokens(in/out): 149/32
     ---PROMPT---
     [chat] system: You are an expert extraction algorithm. Only extract relevant information from the text. If you do not know the value of an attribute asked to extract, return null for the attribute's value.
     
@@ -1653,8 +1749,8 @@
         "animalLiked": "GIRAFFE"
       }
     ]
-

Teardown

PASSED test_dynamic_inputs_list 0:00:01.045220

Setup

Call

Captured stderr call
[2024-11-25T23:52:03Z INFO  baml_events] Function DynamicListInputOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1040ms. StopReason: stop. Tokens(in/out): 134/78
+

Teardown

PASSED test_dynamic_inputs_list 0:00:00.894979

Setup

Call

Captured stderr call
[2024-11-26T00:36:51Z INFO  baml_events] Function DynamicListInputOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 884ms. StopReason: stop. Tokens(in/out): 134/78
     ---PROMPT---
     [chat] user: Here is some input data:
     ----
@@ -1665,8 +1761,8 @@
             "nestedKey1": "nestedVal",
         },
     }, {
-        "testKey": "myTest",
         "new_key": "hi",
+        "testKey": "myTest",
         "blah": {
             "nestedKey1": "nestedVal",
         },
@@ -1719,12 +1815,12 @@
         }
       }
     ]
-

Teardown

PASSED test_dynamic_output_map 0:00:00.606896

Setup

Call

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

Teardown

PASSED test_dynamic_output_map 0:00:00.718771

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"}}
+
Captured stderr call
[2024-11-26T00:36:52Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 711ms. StopReason: stop. Tokens(in/out): 80/36
     ---PROMPT---
     [chat] user: Given a string, extract info using the schema:
     
@@ -1741,7 +1837,6 @@
     {
       "hair_color": "black",
       "attributes": {
-        "height": "6 feet",
         "eye_color": "blue",
         "facial_hair": "beard"
       }
@@ -1750,20 +1845,19 @@
     {
       "hair_color": "black",
       "attributes": {
-        "height": "6 feet",
         "eye_color": "blue",
         "facial_hair": "beard"
       }
     }
-

Teardown

PASSED test_dynamic_output_union 0:00:01.487384

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_dynamic_output_union 0:00:01.911571

Setup

Call

Captured stdout call
[]
 final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard'} height={'feet': 6.0, 'inches': None}
 final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard'}, 'height': {'feet': 6.0, 'inches': None}}
 final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard"},"height":{"feet":6.0,"inches":null}}
-final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard'} height={'meters': 1.8}
-final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard'}, 'height': {'meters': 1.8}}
-final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard"},"height":{"meters":1.8}}
-
Captured stderr call
[2024-11-25T23:52:05Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 770ms. StopReason: stop. Tokens(in/out): 114/51
+final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30 years'} height={'meters': 1.8}
+final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30 years'}, 'height': {'meters': 1.8}}
+final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard","age":"30 years"},"height":{"meters":1.8}}
+
Captured stderr call
[2024-11-26T00:36:53Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 779ms. StopReason: stop. Tokens(in/out): 114/58
     ---PROMPT---
     [chat] user: Given a string, extract info using the schema:
     
@@ -1790,7 +1884,8 @@
         "facial_hair": "beard"
       },
       "height": {
-        "feet": 6
+        "feet": 6,
+        "inches": null
       }
     }
     ---Parsed Response (class DynamicOutput)---
@@ -1805,8 +1900,8 @@
         "inches": null
       }
     }
-[2024-11-25T23:52:05Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 706ms. StopReason: stop. Tokens(in/out): 116/53
+[2024-11-26T00:36:54Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1112ms. StopReason: stop. Tokens(in/out): 116/61
     ---PROMPT---
     [chat] user: Given a string, extract info using the schema:
     
@@ -1830,7 +1925,8 @@
       "hair_color": "black",
       "attributes": {
         "eye_color": "blue",
-        "facial_hair": "beard"
+        "facial_hair": "beard",
+        "age": "30 years"
       },
       "height": {
         "meters": 1.8
@@ -1841,13 +1937,18 @@
       "hair_color": "black",
       "attributes": {
         "eye_color": "blue",
-        "facial_hair": "beard"
+        "facial_hair": "beard",
+        "age": "30 years"
       },
       "height": {
         "meters": 1.8
       }
     }
-

Teardown

PASSED test_nested_class_streaming 0:00:10.292039

Setup

Call

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

Teardown

PASSED test_nested_class_streaming 0:00:08.064284

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}
@@ -1873,201 +1974,90 @@
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': '', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': None}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': '', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': None}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': None}}}
-final  {'prop1': 'example', 'prop2': {'prop1': 'value1', 'prop2': 'value2', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-
Captured stderr call
[2024-11-25T23:52:16Z INFO  baml_events] Function FnOutputClassNested:
-    Client: Ollama (llama2) - 10285ms. StopReason: stop. Tokens(in/out): unknown/unknown
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': '', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'good', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+final  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'goodbye', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+
Captured stderr call
[2024-11-26T00:37:02Z INFO  baml_events] Function FnOutputClassNested:
+    Client: Ollama (llama2) - 8050ms. StopReason: stop. Tokens(in/out): unknown/unknown
     ---PROMPT---
     [chat] user: Return a made up json blob that matches this schema:
     Answer in JSON using this schema:
@@ -2087,13 +2077,13 @@
     JSON:
     
     ---LLM REPLY---
-    Here is a made-up JSON blob that matches the provided schema:
+    Sure! Here is a made-up JSON blob that matches the schema you provided:
     ```json
     {
-      "prop1": "example",
+      "prop1": "hello",
       "prop2": {
-        "prop1": "value1",
-        "prop2": "value2",
+        "prop1": "world",
+        "prop2": "goodbye",
         "inner": {
           "prop2": 42,
           "prop3": 3.14,
@@ -2101,202 +2091,54 @@
       },
     }
     ```
-    Explanation:
-    
-    * `prop1`: A string property with value "example".
-    * `prop2`: An object property with two properties: `prop1` with value "value1", and `prop2` with value "value2". The `inner` property is an object with a single property, `prop2`, with value 42. The `prop3` property has value 3.14.
-    
-    Note that this is just one example of a JSON blob that matches the provided schema. There are many other valid JSON objects that could also match this schema.
+    Let me know if you have any questions or need further assistance!
     ---Parsed Response (class TestClassNested)---
     {
-      "prop1": "example",
+      "prop1": "hello",
       "prop2": {
-        "prop1": "value1",
-        "prop2": "value2",
+        "prop1": "world",
+        "prop2": "goodbye",
         "inner": {
           "prop2": 42,
           "prop3": 3.14
         }
       }
     }
-

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.748679

Setup

Call

Captured stderr call
[2024-11-25T23:52:17Z INFO  baml_events] Function ExpectFailure:
-    Client: MyClient (gpt-3.5-turbo-0125) - 746ms. StopReason: stop. Tokens(in/out): 14/7
+

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.436631

Setup

Call

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

Teardown

FAILED test_dynamic_client_with_vertex_json_str_creds 0:00:00.283394

baml_py.BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "MyClient", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("What is the capital of England?")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1732578737, tv_nsec: 40333000 }, latency: 280.906042ms, message: "Request failed: https://us-central1-aiplatform.googleapis.com/v1/projects/sam-project-vertex-1/locations/us-central1/publishers/google/models/gemini-1.5-pro:generateContent\n{\n  \"error\": {\n    \"code\": 403,\n    \"message\": \"Permission 'aiplatform.endpoints.predict' denied on resource '//aiplatform.googleapis.com/projects/sam-project-vertex-1/locations/us-central1/publishers/google/models/gemini-1.5-pro' (or it may not exist).\",\n    \"status\": \"PERMISSION_DENIED\",\n    \"details\": [\n      {\n        \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n        \"reason\": \"IAM_PERMISSION_DENIED\",\n        \"domain\": \"aiplatform.googleapis.com\",\n        \"metadata\": {\n          \"resource\": \"projects/sam-project-vertex-1/locations/us-central1/publishers/google/models/gemini-1.5-pro\",\n          \"permission\": \"aiplatform.endpoints.predict\"\n        }\n      }\n    ]\n  }\n}\n", code: NotSupported }

Setup

Call

@pytest.mark.asyncio
-    async def test_dynamic_client_with_vertex_json_str_creds():
-        cb = baml_py.ClientRegistry()
-        cb.add_llm_client(
-            "MyClient",
-            "vertex-ai",
-            {
-                "model": "gemini-1.5-pro",
-                "project_id": "sam-project-vertex-1",
-                "location": "us-central1",
-                "credentials": os.environ[
-                    "INTEG_TESTS_GOOGLE_APPLICATION_CREDENTIALS_CONTENT"
-                ],
-            },
-        )
-        cb.set_primary("MyClient")
-    
->       capitol = await b.ExpectFailure(
-            baml_options={"client_registry": cb},
-        )
-
-tests/test_functions.py:1103: 
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
-
-self = 
-baml_options = {'client_registry': }
-
-    async def ExpectFailure(
-        self,
-    
-        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(
-        "ExpectFailure",
-        {
-    
-        },
-        self.__ctx_manager.get(),
-        tb,
-        __cr__,
-      )
->     return cast(str, raw.cast_to(types, types))
-E     baml_py.BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "MyClient", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("What is the capital of England?")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1732578737, tv_nsec: 40333000 }, latency: 280.906042ms, message: "Request failed: https://us-central1-aiplatform.googleapis.com/v1/projects/sam-project-vertex-1/locations/us-central1/publishers/google/models/gemini-1.5-pro:generateContent\n{\n  \"error\": {\n    \"code\": 403,\n    \"message\": \"Permission 'aiplatform.endpoints.predict' denied on resource '//aiplatform.googleapis.com/projects/sam-project-vertex-1/locations/us-central1/publishers/google/models/gemini-1.5-pro' (or it may not exist).\",\n    \"status\": \"PERMISSION_DENIED\",\n    \"details\": [\n      {\n        \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n        \"reason\": \"IAM_PERMISSION_DENIED\",\n        \"domain\": \"aiplatform.googleapis.com\",\n        \"metadata\": {\n          \"resource\": \"projects/sam-project-vertex-1/locations/us-central1/publishers/google/models/gemini-1.5-pro\",\n          \"permission\": \"aiplatform.endpoints.predict\"\n        }\n      }\n    ]\n  }\n}\n", code: NotSupported }
-
-baml_client/async_client.py:626: BamlClientHttpError
Captured stderr call
[2024-11-25T23:52:17Z WARN  baml_events] Function ExpectFailure:
-    Client: MyClient (<unknown>) - 280ms
+    "London"
+

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:00.915723

Setup

Call

Captured stderr call
[2024-11-26T00:37:03Z INFO  baml_events] Function ExpectFailure:
+    Client: MyClient () - 911ms. StopReason: "STOP". Tokens(in/out): 7/10
     ---PROMPT---
     [chat] user: What is the capital of England?
     
-    ---REQUEST OPTIONS---
-    ---ERROR (NotSupported (403))---
-    Request failed: https://us-central1-aiplatform.googleapis.com/v1/projects/sam-project-vertex-1/locations/us-central1/publishers/google/models/gemini-1.5-pro:generateContent
-    {
-      "error": {
-        "code": 403,
-        "message": "Permission 'aiplatform.endpoints.predict' denied on resource '//aiplatform.googleapis.com/projects/sam-project-vertex-1/locations/us-central1/publishers/google/models/gemini-1.5-pro' (or it may not exist).",
-        "status": "PERMISSION_DENIED",
-        "details": [
-          {
-            "@type": "type.googleapis.com/google.rpc.ErrorInfo",
-            "reason": "IAM_PERMISSION_DENIED",
-            "domain": "aiplatform.googleapis.com",
-            "metadata": {
-              "resource": "projects/sam-project-vertex-1/locations/us-central1/publishers/google/models/gemini-1.5-pro",
-              "permission": "aiplatform.endpoints.predict"
-            }
-          }
-        ]
-      }
-    }
-    
-

Teardown

FAILED test_dynamic_client_with_vertex_json_object_creds 0:00:00.004409

baml_py.BamlError: Failed to create clients from client_registry
-
-Caused by:
-    0: Failed to parse client: MyClient
-    1: Failed to parse client options for MyClient:
-       credentials must be a string. Got: {
-       token_uri: string,
-       auth_provider_x509_cert_url: string,
-       client_id: string,
-       auth_uri: string,
-       private_key: string,
-       type: string,
-       private_key_id: string,
-       project_id: string,
-       universe_domain: string,
-       client_x509_cert_url: string,
-       client_email: string
-       }

Setup

Call

@pytest.mark.asyncio
-    async def test_dynamic_client_with_vertex_json_object_creds():
-        cb = baml_py.ClientRegistry()
-        cb.add_llm_client(
-            "MyClient",
-            "vertex-ai",
-            {
-                "model": "gemini-1.5-pro",
-                "project_id": "sam-project-vertex-1",
-                "location": "us-central1",
-                "credentials": json.loads(
-                    os.environ["INTEG_TESTS_GOOGLE_APPLICATION_CREDENTIALS_CONTENT"]
-                ),
-            },
-        )
-        cb.set_primary("MyClient")
-    
->       capitol = await b.ExpectFailure(
-            baml_options={"client_registry": cb},
-        )
-
-tests/test_functions.py:1126: 
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
-
-self = 
-baml_options = {'client_registry': }
-
-    async def ExpectFailure(
-        self,
+    ---LLM REPLY---
+    The capital of England is **London**. 
     
-        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)
+    ---Parsed Response (string)---
+    "The capital of England is **London**. \n"
+

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:01.175949

Setup

Call

Captured stderr call
[2024-11-26T00:37:05Z INFO  baml_events] Function ExpectFailure:
+    Client: MyClient () - 1173ms. StopReason: "STOP". Tokens(in/out): 7/10
+    ---PROMPT---
+    [chat] user: What is the capital of England?
     
->     raw = await self.__runtime.call_function(
-        "ExpectFailure",
-        {
+    ---LLM REPLY---
+    The capital of England is **London**. 
     
-        },
-        self.__ctx_manager.get(),
-        tb,
-        __cr__,
-      )
-E     baml_py.BamlError: Failed to create clients from client_registry
-E     
-E     Caused by:
-E         0: Failed to parse client: MyClient
-E         1: Failed to parse client options for MyClient:
-E            credentials must be a string. Got: {
-E            token_uri: string,
-E            auth_provider_x509_cert_url: string,
-E            client_id: string,
-E            auth_uri: string,
-E            private_key: string,
-E            type: string,
-E            private_key_id: string,
-E            project_id: string,
-E            universe_domain: string,
-E            client_x509_cert_url: string,
-E            client_email: string
-E            }
-
-baml_client/async_client.py:617: BamlError
Captured stderr call
[2024-11-25T23:52:17Z ERROR baml_runtime::tracing] Failed to create clients from client_registry
-

Teardown

PASSED test_event_log_hook 0:00:01.454793

Setup

Call

Captured stdout call
Event log hook1: 
+    ---Parsed Response (string)---
+    "The capital of England is **London**. \n"
+

Teardown

PASSED test_event_log_hook 0:00:01.121972

Setup

Call

Captured stdout call
Event log hook1: 
 Event log event  BamlLogEvent {
     metadata: {
-        event_id: "c8c68047-bb7b-4ab2-8b69-bd89497008d8",
+        event_id: "4fe6d1f0-0318-4199-9b4a-599b0631cee0",
         parent_id: None,
-        root_event_id: "c8c68047-bb7b-4ab2-8b69-bd89497008d8"
+        root_event_id: "4fe6d1f0-0318-4199-9b4a-599b0631cee0"
     },
     prompt: "[
   {
@@ -2310,10 +2152,10 @@
 ]",
     raw_output: "["a", "b", "c"]",
     parsed_output: "["a", "b", "c"]",
-    start_time: "2024-11-25T23:52:17.910Z"
+    start_time: "2024-11-26T00:37:05.368Z"
 }
-
Captured stderr call
[2024-11-25T23:52:18Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 516ms. StopReason: stop. Tokens(in/out): 23/9
+
Captured stderr call
[2024-11-26T00:37:05Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 392ms. StopReason: stop. Tokens(in/out): 23/9
     ---PROMPT---
     [chat] user: Return this value back to me: ["a", "b", "c"]
     
@@ -2321,150 +2163,154 @@
     ["a", "b", "c"]
     ---Parsed Response (string)---
     "[\"a\", \"b\", \"c\"]"
-

Teardown

PASSED test_aws_bedrock 0:00:03.156196

Setup

Call

Captured stdout call
unstreamed 
+

Teardown

PASSED test_aws_bedrock 0:00:03.076307

Setup

Call

Captured stdout call
unstreamed 
 
-The old geologist, Emma, had spent her entire career studying the ancient rocks of the desert. She had seen it all - the towering sandstone formations, the glittering quartz crystals, and the mysterious veins of iron ore. But nothing could have prepared her for what she was about to discover.
+The old rock sat nestled among the roots of a ancient oak tree, its weathered surface bearing the scars of countless seasons. It was a peculiar rock, with veins of quartz that seemed to shimmer in the fading light of day.
 
-As she made her way through the arid landscape, her eyes scanning the ground for any sign of the rare mineral she was searching for, Emma noticed a peculiar rock formation. It was a large
+As the storm clouds gathered, the air grew heavy with electricity. The wind began to pick up, rustling the leaves of the oak tree and causing the rock to vibrate with an otherworldly energy.
+
+Suddenly, a brilliant flash of lightning illuminated the sky,
 streamed  '\n\n'
 streamed  '\n\nIn'
 streamed  '\n\nIn the'
 streamed  '\n\nIn the heart'
 streamed  '\n\nIn the heart of'
 streamed  '\n\nIn the heart of the'
-streamed  '\n\nIn the heart of the desert'
-streamed  '\n\nIn the heart of the desert,'
-streamed  '\n\nIn the heart of the desert, there'
-streamed  '\n\nIn the heart of the desert, there was'
-streamed  '\n\nIn the heart of the desert, there was a'
-streamed  '\n\nIn the heart of the desert, there was a peculiar'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation that'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation that had'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation that had been'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation that had been passed'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation that had been passed down'
-streamed  '\n\nIn the heart of the desert, there was a peculiar rock formation that had been passed down through'
-streamed  'art of the desert, there was a peculiar rock formation that had been passed down through generations'
-streamed  ' of the desert, there was a peculiar rock formation that had been passed down through generations of'
-streamed  'the desert, there was a peculiar rock formation that had been passed down through generations of the'
-streamed  'sert, there was a peculiar rock formation that had been passed down through generations of the local'
-streamed  'there was a peculiar rock formation that had been passed down through generations of the local tribe'
-streamed  'here was a peculiar rock formation that had been passed down through generations of the local tribe.'
-streamed  'e was a peculiar rock formation that had been passed down through generations of the local tribe. It'
-streamed  's a peculiar rock formation that had been passed down through generations of the local tribe. It was'
-streamed  'eculiar rock formation that had been passed down through generations of the local tribe. It was said'
-streamed  'ar rock formation that had been passed down through generations of the local tribe. It was said that'
-streamed  'ck formation that had been passed down through generations of the local tribe. It was said that this'
-streamed  'rmation that had been passed down through generations of the local tribe. It was said that this rock'
-streamed  'mation that had been passed down through generations of the local tribe. It was said that this rock,'
-streamed  ' that had been passed down through generations of the local tribe. It was said that this rock, known'
-streamed  'at had been passed down through generations of the local tribe. It was said that this rock, known as'
-streamed  'ad been passed down through generations of the local tribe. It was said that this rock, known as the'
-streamed  ' been passed down through generations of the local tribe. It was said that this rock, known as the "'
-streamed  'en passed down through generations of the local tribe. It was said that this rock, known as the "Eye'
-streamed  'passed down through generations of the local tribe. It was said that this rock, known as the "Eye of'
-streamed  'ed down through generations of the local tribe. It was said that this rock, known as the "Eye of the'
-streamed  'n through generations of the local tribe. It was said that this rock, known as the "Eye of the Storm'
-streamed  'through generations of the local tribe. It was said that this rock, known as the "Eye of the Storm,"'
-streamed  'gh generations of the local tribe. It was said that this rock, known as the "Eye of the Storm," held'
-streamed  ' generations of the local tribe. It was said that this rock, known as the "Eye of the Storm," held a'
-streamed  'tions of the local tribe. It was said that this rock, known as the "Eye of the Storm," held a secret'
-streamed  'f the local tribe. It was said that this rock, known as the "Eye of the Storm," held a secret within'
-streamed  'e local tribe. It was said that this rock, known as the "Eye of the Storm," held a secret within its'
-streamed  'tribe. It was said that this rock, known as the "Eye of the Storm," held a secret within its ancient'
-streamed  ' It was said that this rock, known as the "Eye of the Storm," held a secret within its ancient walls'
-streamed  'It was said that this rock, known as the "Eye of the Storm," held a secret within its ancient walls.'
-streamed  'as said that this rock, known as the "Eye of the Storm," held a secret within its ancient walls. The'
-streamed  'd that this rock, known as the "Eye of the Storm," held a secret within its ancient walls. The story'
-streamed  't this rock, known as the "Eye of the Storm," held a secret within its ancient walls. The story went'
-streamed  's rock, known as the "Eye of the Storm," held a secret within its ancient walls. The story went that'
-streamed  'rock, known as the "Eye of the Storm," held a secret within its ancient walls. The story went that a'
-streamed  ' known as the "Eye of the Storm," held a secret within its ancient walls. The story went that a bolt'
-streamed  'own as the "Eye of the Storm," held a secret within its ancient walls. The story went that a bolt of'
-streamed  ' "Eye of the Storm," held a secret within its ancient walls. The story went that a bolt of lightning'
-streamed  'e of the Storm," held a secret within its ancient walls. The story went that a bolt of lightning had'
-streamed  'e Storm," held a secret within its ancient walls. The story went that a bolt of lightning had struck'
-streamed  'orm," held a secret within its ancient walls. The story went that a bolt of lightning had struck the'
-streamed  ' held a secret within its ancient walls. The story went that a bolt of lightning had struck the rock'
-streamed  'eld a secret within its ancient walls. The story went that a bolt of lightning had struck the rock e'
-streamed  ' a secret within its ancient walls. The story went that a bolt of lightning had struck the rock eons'
-streamed  'ecret within its ancient walls. The story went that a bolt of lightning had struck the rock eons ago'
-streamed  'cret within its ancient walls. The story went that a bolt of lightning had struck the rock eons ago,'
-streamed  ' within its ancient walls. The story went that a bolt of lightning had struck the rock eons ago, imb'
-streamed  'hin its ancient walls. The story went that a bolt of lightning had struck the rock eons ago, imbuing'
-streamed  ' its ancient walls. The story went that a bolt of lightning had struck the rock eons ago, imbuing it'
-streamed  'ancient walls. The story went that a bolt of lightning had struck the rock eons ago, imbuing it with'
-streamed  'cient walls. The story went that a bolt of lightning had struck the rock eons ago, imbuing it with a'
-streamed  'lls. The story went that a bolt of lightning had struck the rock eons ago, imbuing it with a special'
-streamed  'e story went that a bolt of lightning had struck the rock eons ago, imbuing it with a special energy'
-streamed  'tory went that a bolt of lightning had struck the rock eons ago, imbuing it with a special energy.\n\n'
-streamed  'y went that a bolt of lightning had struck the rock eons ago, imbuing it with a special energy.\n\nThe'
-streamed  ' that a bolt of lightning had struck the rock eons ago, imbuing it with a special energy.\n\nThe tribe'
-streamed  'olt of lightning had struck the rock eons ago, imbuing it with a special energy.\n\nThe tribe believed'
-streamed  'f lightning had struck the rock eons ago, imbuing it with a special energy.\n\nThe tribe believed that'
-streamed  'ghtning had struck the rock eons ago, imbuing it with a special energy.\n\nThe tribe believed that the'
-streamed  'ng had struck the rock eons ago, imbuing it with a special energy.\n\nThe tribe believed that the rock'
-streamed  'd struck the rock eons ago, imbuing it with a special energy.\n\nThe tribe believed that the rock held'
-streamed  'ruck the rock eons ago, imbuing it with a special energy.\n\nThe tribe believed that the rock held the'
-streamed  'he rock eons ago, imbuing it with a special energy.\n\nThe tribe believed that the rock held the power'
-streamed  'rock eons ago, imbuing it with a special energy.\n\nThe tribe believed that the rock held the power to'
-streamed  'ons ago, imbuing it with a special energy.\n\nThe tribe believed that the rock held the power to grant'
-streamed  ', imbuing it with a special energy.\n\nThe tribe believed that the rock held the power to grant wisdom'
-streamed  'buing it with a special energy.\n\nThe tribe believed that the rock held the power to grant wisdom and'
-streamed  ' with a special energy.\n\nThe tribe believed that the rock held the power to grant wisdom and clarity'
-streamed  'th a special energy.\n\nThe tribe believed that the rock held the power to grant wisdom and clarity to'
-streamed  'pecial energy.\n\nThe tribe believed that the rock held the power to grant wisdom and clarity to those'
-streamed  'al energy.\n\nThe tribe believed that the rock held the power to grant wisdom and clarity to those who'
-streamed  '\nThe tribe believed that the rock held the power to grant wisdom and clarity to those who approached'
-streamed  'e tribe believed that the rock held the power to grant wisdom and clarity to those who approached it'
-streamed  'be believed that the rock held the power to grant wisdom and clarity to those who approached it with'
-streamed  'believed that the rock held the power to grant wisdom and clarity to those who approached it with an'
-streamed  'ved that the rock held the power to grant wisdom and clarity to those who approached it with an open'
-streamed  'at the rock held the power to grant wisdom and clarity to those who approached it with an open heart'
-streamed  'he rock held the power to grant wisdom and clarity to those who approached it with an open heart and'
-streamed  'ck held the power to grant wisdom and clarity to those who approached it with an open heart and mind'
-streamed  'k held the power to grant wisdom and clarity to those who approached it with an open heart and mind.'
-streamed  'k held the power to grant wisdom and clarity to those who approached it with an open heart and mind.'
-streamed  'k held the power to grant wisdom and clarity to those who approached it with an open heart and mind.'
-streamed  'k held the power to grant wisdom and clarity to those who approached it with an open heart and mind.'
+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 that'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock that had'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock that had been'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock that had been passed'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock that had been passed down'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock that had been passed down through'
+streamed  'heart of the ancient forest, there was a peculiar rock that had been passed down through generations'
+streamed  'rt of the ancient forest, there was a peculiar rock that had been passed down through generations of'
+streamed  'f the ancient forest, there was a peculiar rock that had been passed down through generations of the'
+streamed  'ancient forest, there was a peculiar rock that had been passed down through generations of the local'
+streamed  't forest, there was a peculiar rock that had been passed down through generations of the local tribe'
+streamed  ' forest, there was a peculiar rock that had been passed down through generations of the local tribe.'
+streamed  'rest, there was a peculiar rock that had been passed down through generations of the local tribe. It'
+streamed  ', there was a peculiar rock that had been passed down through generations of the local tribe. It was'
+streamed  're was a peculiar rock that had been passed down through generations of the local tribe. It was said'
+streamed  's a peculiar rock that had been passed down through generations of the local tribe. It was said that'
+streamed  'peculiar rock that had been passed down through generations of the local tribe. It was said that the'
+streamed  'iar rock that had been passed down through generations of the local tribe. It was said that the rock'
+streamed  'ock that had been passed down through generations of the local tribe. It was said that the rock held'
+streamed  'k that had been passed down through generations of the local tribe. It was said that the rock held a'
+streamed  'had been passed down through generations of the local tribe. It was said that the rock held a secret'
+streamed  'ad been passed down through generations of the local tribe. It was said that the rock held a secret,'
+streamed  ' been passed down through generations of the local tribe. It was said that the rock held a secret, a'
+streamed  'assed down through generations of the local tribe. It was said that the rock held a secret, a secret'
+streamed  ' down through generations of the local tribe. It was said that the rock held a secret, a secret that'
+streamed  ' through generations of the local tribe. It was said that the rock held a secret, a secret that only'
+streamed  'generations of the local tribe. It was said that the rock held a secret, a secret that only revealed'
+streamed  'ions of the local tribe. It was said that the rock held a secret, a secret that only revealed itself'
+streamed  's of the local tribe. It was said that the rock held a secret, a secret that only revealed itself to'
+streamed  'he local tribe. It was said that the rock held a secret, a secret that only revealed itself to those'
+streamed  'ocal tribe. It was said that the rock held a secret, a secret that only revealed itself to those who'
+streamed  'e. It was said that the rock held a secret, a secret that only revealed itself to those who listened'
+streamed  's said that the rock held a secret, a secret that only revealed itself to those who listened closely'
+streamed  'aid that the rock held a secret, a secret that only revealed itself to those who listened closely to'
+streamed  'that the rock held a secret, a secret that only revealed itself to those who listened closely to the'
+streamed  'rock held a secret, a secret that only revealed itself to those who listened closely to the whispers'
+streamed  'k held a secret, a secret that only revealed itself to those who listened closely to the whispers of'
+streamed  'ld a secret, a secret that only revealed itself to those who listened closely to the whispers of the'
+streamed  'secret, a secret that only revealed itself to those who listened closely to the whispers of the wind'
+streamed  'ret, a secret that only revealed itself to those who listened closely to the whispers of the wind.\n\n'
+streamed  ', a secret that only revealed itself to those who listened closely to the whispers of the wind.\n\nThe'
+streamed  'ecret that only revealed itself to those who listened closely to the whispers of the wind.\n\nThe rock'
+streamed  't that only revealed itself to those who listened closely to the whispers of the wind.\n\nThe rock was'
+streamed  'that only revealed itself to those who listened closely to the whispers of the wind.\n\nThe rock was a'
+streamed  'only revealed itself to those who listened closely to the whispers of the wind.\n\nThe rock was a deep'
+streamed  'nly revealed itself to those who listened closely to the whispers of the wind.\n\nThe rock was a deep,'
+streamed  'evealed itself to those who listened closely to the whispers of the wind.\n\nThe rock was a deep, rich'
+streamed  'd itself to those who listened closely to the whispers of the wind.\n\nThe rock was a deep, rich brown'
+streamed  ' itself to those who listened closely to the whispers of the wind.\n\nThe rock was a deep, rich brown,'
+streamed  'elf to those who listened closely to the whispers of the wind.\n\nThe rock was a deep, rich brown, and'
+streamed  'to those who listened closely to the whispers of the wind.\n\nThe rock was a deep, rich brown, and its'
+streamed  ' who listened closely to the whispers of the wind.\n\nThe rock was a deep, rich brown, and its surface'
+streamed  ' listened closely to the whispers of the wind.\n\nThe rock was a deep, rich brown, and its surface was'
+streamed  'stened closely to the whispers of the wind.\n\nThe rock was a deep, rich brown, and its surface was et'
+streamed  'ed closely to the whispers of the wind.\n\nThe rock was a deep, rich brown, and its surface was etched'
+streamed  'osely to the whispers of the wind.\n\nThe rock was a deep, rich brown, and its surface was etched with'
+streamed  ' the whispers of the wind.\n\nThe rock was a deep, rich brown, and its surface was etched with strange'
+streamed  'spers of the wind.\n\nThe rock was a deep, rich brown, and its surface was etched with strange symbols'
+streamed  ' of the wind.\n\nThe rock was a deep, rich brown, and its surface was etched with strange symbols that'
+streamed  ' wind.\n\nThe rock was a deep, rich brown, and its surface was etched with strange symbols that seemed'
+streamed  'nd.\n\nThe rock was a deep, rich brown, and its surface was etched with strange symbols that seemed to'
+streamed  ' rock was a deep, rich brown, and its surface was etched with strange symbols that seemed to shimmer'
+streamed  'ck was a deep, rich brown, and its surface was etched with strange symbols that seemed to shimmer in'
+streamed  'as a deep, rich brown, and its surface was etched with strange symbols that seemed to shimmer in the'
+streamed  'eep, rich brown, and its surface was etched with strange symbols that seemed to shimmer in the flick'
+streamed  'rich brown, and its surface was etched with strange symbols that seemed to shimmer in the flickering'
+streamed  'n, and its surface was etched with strange symbols that seemed to shimmer in the flickering sunlight'
+streamed  ', and its surface was etched with strange symbols that seemed to shimmer in the flickering sunlight.'
+streamed  'd its surface was etched with strange symbols that seemed to shimmer in the flickering sunlight. The'
+streamed  'surface was etched with strange symbols that seemed to shimmer in the flickering sunlight. The tribe'
+streamed  "rface was etched with strange symbols that seemed to shimmer in the flickering sunlight. The tribe's"
+streamed  "as etched with strange symbols that seemed to shimmer in the flickering sunlight. The tribe's elders"
+streamed  " with strange symbols that seemed to shimmer in the flickering sunlight. The tribe's elders believed"
+streamed  " strange symbols that seemed to shimmer in the flickering sunlight. The tribe's elders believed that"
+streamed  "ange symbols that seemed to shimmer in the flickering sunlight. The tribe's elders believed that the"
+streamed  "symbols that seemed to shimmer in the flickering sunlight. The tribe's elders believed that the rock"
+streamed  "ols that seemed to shimmer in the flickering sunlight. The tribe's elders believed that the rock was"
+streamed  "that seemed to shimmer in the flickering sunlight. The tribe's elders believed that the rock was imb"
+streamed  "t seemed to shimmer in the flickering sunlight. The tribe's elders believed that the rock was imbued"
+streamed  "med to shimmer in the flickering sunlight. The tribe's elders believed that the rock was imbued with"
+streamed  "to shimmer in the flickering sunlight. The tribe's elders believed that the rock was imbued with the"
+streamed  "mmer in the flickering sunlight. The tribe's elders believed that the rock was imbued with the power"
+streamed  "r in the flickering sunlight. The tribe's elders believed that the rock was imbued with the power of"
+streamed  " the flickering sunlight. The tribe's elders believed that the rock was imbued with the power of the"
+streamed  "ering sunlight. The tribe's elders believed that the rock was imbued with the power of the lightning"
+streamed  " sunlight. The tribe's elders believed that the rock was imbued with the power of the lightning that"
+streamed  " sunlight. The tribe's elders believed that the rock was imbued with the power of the lightning that"
+streamed  " sunlight. The tribe's elders believed that the rock was imbued with the power of the lightning that"
+streamed  " sunlight. The tribe's elders believed that the rock was imbued with the power of the lightning that"
 streamed final 
 
-In the heart of the desert, there was a peculiar rock formation that had been passed down through generations of the local tribe. It was said that this rock, known as the "Eye of the Storm," held a secret within its ancient walls. The story went that a bolt of lightning had struck the rock eons ago, imbuing it with a special energy.
+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 secret that only revealed itself to those who listened closely to the whispers of the wind.
 
-The tribe believed that the rock held the power to grant wisdom and clarity to those who approached it with an open heart and mind.
-
Captured stderr call
[2024-11-25T23:52:18Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
-[2024-11-25T23:52:20Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (meta.llama3-8b-instruct-v1:0) - 1546ms. StopReason: max_tokens. Tokens(in/out): 24/100
+The rock was a deep, rich brown, and its surface was etched with strange symbols that seemed to shimmer in the flickering sunlight. The tribe's elders believed that the rock was imbued with the power of the lightning that
+
Captured stderr call
[2024-11-26T00:37:06Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-11-26T00:37:07Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (meta.llama3-8b-instruct-v1:0) - 1532ms. StopReason: max_tokens. Tokens(in/out): 24/100
     ---PROMPT---
     [chat] user: Write a nice short story about lightning in a rock
     
     ---LLM REPLY---
     
     
-    The old geologist, Emma, had spent her entire career studying the ancient rocks of the desert. She had seen it all - the towering sandstone formations, the glittering quartz crystals, and the mysterious veins of iron ore. But nothing could have prepared her for what she was about to discover.
+    The old rock sat nestled among the roots of a ancient oak tree, its weathered surface bearing the scars of countless seasons. It was a peculiar rock, with veins of quartz that seemed to shimmer in the fading light of day.
+    
+    As the storm clouds gathered, the air grew heavy with electricity. The wind began to pick up, rustling the leaves of the oak tree and causing the rock to vibrate with an otherworldly energy.
     
-    As she made her way through the arid landscape, her eyes scanning the ground for any sign of the rare mineral she was searching for, Emma noticed a peculiar rock formation. It was a large
+    Suddenly, a brilliant flash of lightning illuminated the sky,
     ---Parsed Response (string)---
-    "\n\nThe old geologist, Emma, had spent her entire career studying the ancient rocks of the desert. She had seen it all - the towering sandstone formations, the glittering quartz crystals, and the mysterious veins of iron ore. But nothing could have prepared her for what she was about to discover.\n\nAs she made her way through the arid landscape, her eyes scanning the ground for any sign of the rare mineral she was searching for, Emma noticed a peculiar rock formation. It was a large"
-[2024-11-25T23:52:20Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
-[2024-11-25T23:52:22Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (meta.llama3-8b-instruct-v1:0) - 1603ms. StopReason: unknown. Tokens(in/out): 24/100
+    "\n\nThe old rock sat nestled among the roots of a ancient oak tree, its weathered surface bearing the scars of countless seasons. It was a peculiar rock, with veins of quartz that seemed to shimmer in the fading light of day.\n\nAs the storm clouds gathered, the air grew heavy with electricity. The wind began to pick up, rustling the leaves of the oak tree and causing the rock to vibrate with an otherworldly energy.\n\nSuddenly, a brilliant flash of lightning illuminated the sky,"
+[2024-11-26T00:37:07Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-11-26T00:37:09Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (meta.llama3-8b-instruct-v1:0) - 1528ms. StopReason: unknown. Tokens(in/out): 24/100
     ---PROMPT---
     [chat] user: Write a nice short story about lightning in a rock
     
     ---LLM REPLY---
     
     
-    In the heart of the desert, there was a peculiar rock formation that had been passed down through generations of the local tribe. It was said that this rock, known as the "Eye of the Storm," held a secret within its ancient walls. The story went that a bolt of lightning had struck the rock eons ago, imbuing it with a special energy.
+    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 secret that only revealed itself to those who listened closely to the whispers of the wind.
     
-    The tribe believed that the rock held the power to grant wisdom and clarity to those who approached it with an open heart and mind.
+    The rock was a deep, rich brown, and its surface was etched with strange symbols that seemed to shimmer in the flickering sunlight. The tribe's elders believed that the rock was imbued with the power of the lightning that
     ---Parsed Response (string)---
-    "\n\nIn the heart of the desert, there was a peculiar rock formation that had been passed down through generations of the local tribe. It was said that this rock, known as the \"Eye of the Storm,\" held a secret within its ancient walls. The story went that a bolt of lightning had struck the rock eons ago, imbuing it with a special energy.\n\nThe tribe believed that the rock held the power to grant wisdom and clarity to those who approached it with an open heart and mind."
-

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.028505

Setup

Call

Captured stderr call
[2024-11-25T23:52:22Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
-[2024-11-25T23:52:22Z WARN  baml_events] Function TestAwsInvalidRegion:
-    Client: AwsBedrockInvalidRegion (meta.llama3-8b-instruct-v1:0) - 25ms
+    "\n\nIn 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 secret that only revealed itself to those who listened closely to the whispers of the wind.\n\nThe rock was a deep, rich brown, and its surface was etched with strange symbols that seemed to shimmer in the flickering sunlight. The tribe's elders believed that the rock was imbued with the power of the lightning that"
+

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.012686

Setup

Call

Captured stderr call
[2024-11-26T00:37:09Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-11-26T00:37:09Z WARN  baml_events] Function TestAwsInvalidRegion:
+    Client: AwsBedrockInvalidRegion (meta.llama3-8b-instruct-v1:0) - 6ms
     ---PROMPT---
     [chat] user: Write a nice short story about lightning in a rock
     
@@ -2488,11 +2334,11 @@
             },
         },
     )
-

Teardown

PASSED test_serialization_exception 0:00:00.404709

Setup

Call

Captured stdout call
Exception message from test:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...ld: nonce
+

Teardown

PASSED test_serialization_exception 0:00:00.393358

Setup

Call

Captured stdout call
Exception message from test:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...ld: nonce
   - <root>: Missing required field: nonce2, raw_output=Hello there!, prompt=[chat] user: Say "hello there".
 ) tblen=2>
-
Captured stderr call
[2024-11-25T23:52:22Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 401ms. StopReason: stop. Tokens(in/out): 12/3
+
Captured stderr call
[2024-11-26T00:37:09Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 387ms. StopReason: stop. Tokens(in/out): 12/3
     ---PROMPT---
     [chat] user: Say "hello there".
     
@@ -2502,7 +2348,7 @@
     Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
-

Teardown

PASSED test_stream_serialization_exception 0:00:00.321617

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None
+

Teardown

PASSED test_stream_serialization_exception 0:00:00.636167

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
@@ -2511,8 +2357,8 @@
 Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...ld: nonce
   - <root>: Missing required field: nonce2, raw_output=Hello there!, prompt=[chat] user: Say "hello there".
 ) tblen=3>
-
Captured stderr call
[2024-11-25T23:52:22Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 317ms. StopReason: stop. Tokens(in/out): 12/3
+
Captured stderr call
[2024-11-26T00:37:10Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 631ms. StopReason: stop. Tokens(in/out): 12/3
     ---PROMPT---
     [chat] user: Say "hello there".
     
@@ -2522,7 +2368,7 @@
     Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
-

Teardown

PASSED test_stream2_serialization_exception 0:00:00.451052

Setup

Call

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

Teardown

PASSED test_stream2_serialization_exception 0:00:00.363745

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
@@ -2531,8 +2377,8 @@
 Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...d: nonce2
   - <root>: Missing required field: nonce3, raw_output=Hello there!, prompt=[chat] user: Say "hello there".
 ) tblen=3>
-
Captured stderr call
[2024-11-25T23:52:23Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 446ms. StopReason: stop. Tokens(in/out): 12/3
+
Captured stderr call
[2024-11-26T00:37:10Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 357ms. StopReason: stop. Tokens(in/out): 12/3
     ---PROMPT---
     [chat] user: Say "hello there".
     
@@ -2543,8 +2389,8 @@
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
       - <root>: Missing required field: nonce3
-

Teardown

PASSED test_descriptions 0:00:03.370366

Setup

Call

Captured stderr call
[2024-11-25T23:52:26Z INFO  baml_events] Function SchemaDescriptions:
-    Client: GPT4o (gpt-4o-2024-08-06) - 3358ms. StopReason: stop. Tokens(in/out): 340/108
+

Teardown

PASSED test_descriptions 0:00:02.110718

Setup

Call

Captured stderr call
[2024-11-26T00:37:12Z INFO  baml_events] Function SchemaDescriptions:
+    Client: GPT4o (gpt-4o-2024-08-06) - 2098ms. StopReason: stop. Tokens(in/out): 340/108
     ---PROMPT---
     [chat] user: Return a schema with this format:
     
@@ -2649,13 +2495,53 @@
       "parens": "parens1",
       "other_group": "other"
     }
-

Teardown

PASSED test_caching 0:00:07.479859

Setup

Call

Captured stdout call
Duration no caching:  4.52044415473938
-Duration with caching:  2.9583849906921387
-
Captured stderr call
[2024-11-25T23:52:31Z INFO  baml_events] Function TestCaching:
-    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 4512ms. StopReason: "end_turn". Tokens(in/out): 14/459
+

Teardown

FAILED test_caching 0:00:07.604673

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

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.9973297119140625 < 3.6063649654388428. Expected second call to be faster than first by a large margin.
+E       assert 3.9973297119140625 < 3.6063649654388428
+
+tests/test_functions.py:1271: AssertionError
Captured stdout call
Duration no caching:  3.6063649654388428
+Duration with caching:  3.9973297119140625
+
Captured stderr call
[2024-11-26T00:37:16Z INFO  baml_events] Function TestCaching:
+    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 3597ms. StopReason: "end_turn". Tokens(in/out): 14/421
     ---PROMPT---
     [chat] system: {"cache_control": Object {"type": String("ephemeral")}}::Generate the following story
-    8a810c31cce74b2f91bc4c984708adc7
+    50ad921e06064de89a839db471078df1
     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.
@@ -2673,7 +2559,7 @@
     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.
     
     
-    8a810c31cce74b2f91bc4c984708adc7
+    50ad921e06064de89a839db471078df1
     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.
@@ -2692,26 +2578,24 @@
     user: 1. try to be funny
     
     ---LLM REPLY---
-    Here's an attempt at a more humorous version of the story:
+    Sure, let's see if we can add a little humor to this futuristic tale of dream manipulation:
     
-    In a world where dreams are the new cryptocurrency, a socially awkward teen named Alex discovers they have the power to not just observe, but manipulate the dreams of others. At first, Alex uses their powers for good - helping classmates conquer fears, boost self-esteem, and embark on wild fantasy adventures. But soon, the temptation of easy money leads Alex to start peddling exclusive "dream experiences" to high-paying clients on the underground market.
+    In a world where dreams are the new cryptocurrency, a socially awkward teen named Alex discovers they have the power to hack into people's subconscious and redesign their nightly adventures. At first, Alex uses their powers for good - helping their peers overcome fears of public speaking or giving grandma the dream vacation of a lifetime. But it's not long before Alex starts dabbling in the dream black market, crafting bespoke dreamscapes for wealthy insomniacs who'll pay top dollar for a good night's sleep. 
     
-    These clients quickly become hooked on Alex's dream creations, struggling to tell reality from their fabricated memories. It's all fun and games until the government and a covert resistance group both come knocking, both wanting to harness Alex's dream-altering abilities for their own nefarious purposes. 
+    The only problem? Some clients get a little too attached to their custom-made dreams. One CEO wakes up convinced he's a dolphin and starts swimming laps in the company koi pond. Another client develops an unhealthy fixation on her dream persona - a suave secret agent - and starts showing up to work in a catsuit, demanding to be called "Velvet Thunder."
     
-    Trapped between these conflicting forces, Alex has to navigate a tangled web of moral dilemmas - like whether to use their powers to help grandma overcome her fear of spiders, or design a luxury dream vacation for a rich CEO. Should they join the government's quest for a "utopian" dream-controlled society, or fight for the resistance's vision of pure mental freedom? All while hoping their own dreams don't get hijacked in the process.
+    As government agencies and shadowy resistance groups come calling, Alex has to navigate a maze of moral quandaries. Should they embrace their power and capitalize on it? Team up with the feds to use dream manipulation for good? Or join the rebels fighting to protect the sanctity of the subconscious?
     
-    As Alex's meddling continues, the line between dreams and reality blurs for everyone involved. Clients start believing their dream experiences are real, while Alex's own sense of self gets lost in the maze of manipulated memories. It's a predicament straight out of a bad teen sci-fi movie - if that movie was directed by Christopher Nolan on a caffeine bender.
+    It's enough to give anyone night terrors! But through it all, Alex discovers the true power isn't just in designing dreams - it's in having the courage to face their own.
     
-    Ultimately, Alex has to decide whether to embrace their power, reject it, or find some middle ground. All while dealing with the consequences of unwittingly becoming the puppet master of an entire world's subconscious. No pressure, right? 
-    
-    It's a mind-bending tale of technology, morality, and the importance of getting a good night's sleep. So buckle up, because this is one dream you won't be able to wake up from.
+    How's that? I tried to inject a bit more humor by poking fun at some of the more absurd consequences of Alex's dream hacking, like the CEO who thinks he's a dolphin and the client who gets dangerously immersed in her secret agent persona. Hopefully that adds a lighthearted touch without losing the core themes and dramatic tension of the story. Let me know if you'd like me to try a different comedic angle.
     ---Parsed Response (string)---
-    "Here's an attempt at a more humorous version of the story:\n\nIn a world where dreams are the new cryptocurrency, a socially awkward teen named Alex discovers they have the power to not just observe, but manipulate the dreams of others. At first, Alex uses their powers for good - helping classmates conquer fears, boost self-esteem, and embark on wild fantasy adventures. But soon, the temptation of easy money leads Alex to start peddling exclusive \"dream experiences\" to high-paying clients on the underground market.\n\nThese clients quickly become hooked on Alex's dream creations, struggling to tell reality from their fabricated memories. It's all fun and games until the government and a covert resistance group both come knocking, both wanting to harness Alex's dream-altering abilities for their own nefarious purposes. \n\nTrapped between these conflicting forces, Alex has to navigate a tangled web of moral dilemmas - like whether to use their powers to help grandma overcome her fear of spiders, or design a luxury dream vacation for a rich CEO. Should they join the government's quest for a \"utopian\" dream-controlled society, or fight for the resistance's vision of pure mental freedom? All while hoping their own dreams don't get hijacked in the process.\n\nAs Alex's meddling continues, the line between dreams and reality blurs for everyone involved. Clients start believing their dream experiences are real, while Alex's own sense of self gets lost in the maze of manipulated memories. It's a predicament straight out of a bad teen sci-fi movie - if that movie was directed by Christopher Nolan on a caffeine bender.\n\nUltimately, Alex has to decide whether to embrace their power, reject it, or find some middle ground. All while dealing with the consequences of unwittingly becoming the puppet master of an entire world's subconscious. No pressure, right? \n\nIt's a mind-bending tale of technology, morality, and the importance of getting a good night's sleep. So buckle up, because this is one dream you won't be able to wake up from."
-[2024-11-25T23:52:34Z INFO  baml_events] Function TestCaching:
-    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 2950ms. StopReason: "end_turn". Tokens(in/out): 14/329
+    "Sure, let's see if we can add a little humor to this futuristic tale of dream manipulation:\n\nIn a world where dreams are the new cryptocurrency, a socially awkward teen named Alex discovers they have the power to hack into people's subconscious and redesign their nightly adventures. At first, Alex uses their powers for good - helping their peers overcome fears of public speaking or giving grandma the dream vacation of a lifetime. But it's not long before Alex starts dabbling in the dream black market, crafting bespoke dreamscapes for wealthy insomniacs who'll pay top dollar for a good night's sleep. \n\nThe only problem? Some clients get a little too attached to their custom-made dreams. One CEO wakes up convinced he's a dolphin and starts swimming laps in the company koi pond. Another client develops an unhealthy fixation on her dream persona - a suave secret agent - and starts showing up to work in a catsuit, demanding to be called \"Velvet Thunder.\"\n\nAs government agencies and shadowy resistance groups come calling, Alex has to navigate a maze of moral quandaries. Should they embrace their power and capitalize on it? Team up with the feds to use dream manipulation for good? Or join the rebels fighting to protect the sanctity of the subconscious?\n\nIt's enough to give anyone night terrors! But through it all, Alex discovers the true power isn't just in designing dreams - it's in having the courage to face their own.\n\nHow's that? I tried to inject a bit more humor by poking fun at some of the more absurd consequences of Alex's dream hacking, like the CEO who thinks he's a dolphin and the client who gets dangerously immersed in her secret agent persona. Hopefully that adds a lighthearted touch without losing the core themes and dramatic tension of the story. Let me know if you'd like me to try a different comedic angle."
+[2024-11-26T00:37:20Z INFO  baml_events] Function TestCaching:
+    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 3988ms. StopReason: "end_turn". Tokens(in/out): 14/442
     ---PROMPT---
     [chat] system: {"cache_control": Object {"type": String("ephemeral")}}::Generate the following story
-    8a810c31cce74b2f91bc4c984708adc7
+    50ad921e06064de89a839db471078df1
     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.
@@ -2729,7 +2613,7 @@
     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.
     
     
-    8a810c31cce74b2f91bc4c984708adc7
+    50ad921e06064de89a839db471078df1
     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.
@@ -2748,23 +2632,23 @@
     user: 1. try to be funny
     
     ---LLM REPLY---
-    Alright, let me try to inject some humor into this futuristic tale of dream manipulation:
+    Alright, let's try to inject a little humor into this futuristic tale of dream manipulation. Here's an attempt at adding some comedic elements:
     
-    In a world where dreams are just another product on the market, a socially awkward teen named Alex stumbles upon their uncanny ability to tinker with people's nightly visions. Rather than using their powers for good, like curing night terrors or helping grandma relive her glory days, Alex decides to start their own little dream-for-hire business. 
+    In this world of commercialized dream experiences, Alex - the socially awkward teen with a penchant for meddling in others' subconscious - finds themselves in a rather peculiar predicament. Armed with the ability to sculpt dreams like a virtuoso sculptor, Alex can't help but get carried away, crafting increasingly bizarre and outlandish dreamscapes for their unsuspecting clients.
     
-    "You want to finally win that big race? I got you covered, just send over $99.99 and your subconscious is mine!" Alex would advertise on the underground dream-net.
+    One wealthy businessman pays handsomely for a VIP dream package, only to find himself trapped in a never-ending loop of show tunes and tap-dancing penguins. Another client, a high-strung workaholic, commissions Alex to create a soothing nature retreat, only to wake up covered in glitter and neon-colored flower petals, much to the delight of their coworkers.
     
-    Of course, the government and a covert resistance group soon catch wind of Alex's lucrative yet ethically dubious enterprise. They both come knocking, offering Alex a deal - work for us or face the consequences. Talk about a nightmare scenario!
+    As Alex's reputation grows, so do the expectations - and the eccentricities. The government agents tasked with recruiting Alex find themselves struggling to keep a straight face during the pitch meeting, as Alex describes their latest dream design involving a herd of levitating llamas and a game of volleyball with sentient marshmallows.
     
-    Alex is now stuck between a rock and a hard place, forced to decide whether to use their dream powers for personal gain, become a pawn of the state, or join the fight for mental freedom. If only they had the social skills to negotiate properly - maybe they could just lucid dream their way out of this predicament.
+    Meanwhile, the resistance fighters trying to sway Alex to their cause can't help but chuckle at the sheer absurdity of Alex's creations, even as they warn of the dangers of dream manipulation. "So, let me get this straight," one rebel leader says, "you've been making people think they're dancing with sentient toasters? Well, that's certainly one way to fight the system."
     
-    In the end, Alex's journey is a cautionary tale about the dangers of messing with people's sleep. Who knew raking in the cash by altering someone's innermost fantasies would come back to haunt them? Sweet dreams, Alex. Or should I say, nightmares.
+    Through it all, Alex remains oblivious to the humor of their situation, laser-focused on perfecting their craft and exploring the boundless possibilities of the dream world. After all, who needs reality when you can design your own fantastical escapes - even if they do involve the occasional mutant unicorn or singing paperclip.
     ---Parsed Response (string)---
-    "Alright, let me try to inject some humor into this futuristic tale of dream manipulation:\n\nIn a world where dreams are just another product on the market, a socially awkward teen named Alex stumbles upon their uncanny ability to tinker with people's nightly visions. Rather than using their powers for good, like curing night terrors or helping grandma relive her glory days, Alex decides to start their own little dream-for-hire business. \n\n\"You want to finally win that big race? I got you covered, just send over $99.99 and your subconscious is mine!\" Alex would advertise on the underground dream-net.\n\nOf course, the government and a covert resistance group soon catch wind of Alex's lucrative yet ethically dubious enterprise. They both come knocking, offering Alex a deal - work for us or face the consequences. Talk about a nightmare scenario!\n\nAlex is now stuck between a rock and a hard place, forced to decide whether to use their dream powers for personal gain, become a pawn of the state, or join the fight for mental freedom. If only they had the social skills to negotiate properly - maybe they could just lucid dream their way out of this predicament.\n\nIn the end, Alex's journey is a cautionary tale about the dangers of messing with people's sleep. Who knew raking in the cash by altering someone's innermost fantasies would come back to haunt them? Sweet dreams, Alex. Or should I say, nightmares."
-

Teardown

PASSED test_arg_exceptions 0:00:00.950133

Setup

Call

Captured stderr call
[2024-11-25T23:52:34Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
+    "Alright, let's try to inject a little humor into this futuristic tale of dream manipulation. Here's an attempt at adding some comedic elements:\n\nIn this world of commercialized dream experiences, Alex - the socially awkward teen with a penchant for meddling in others' subconscious - finds themselves in a rather peculiar predicament. Armed with the ability to sculpt dreams like a virtuoso sculptor, Alex can't help but get carried away, crafting increasingly bizarre and outlandish dreamscapes for their unsuspecting clients.\n\nOne wealthy businessman pays handsomely for a VIP dream package, only to find himself trapped in a never-ending loop of show tunes and tap-dancing penguins. Another client, a high-strung workaholic, commissions Alex to create a soothing nature retreat, only to wake up covered in glitter and neon-colored flower petals, much to the delight of their coworkers.\n\nAs Alex's reputation grows, so do the expectations - and the eccentricities. The government agents tasked with recruiting Alex find themselves struggling to keep a straight face during the pitch meeting, as Alex describes their latest dream design involving a herd of levitating llamas and a game of volleyball with sentient marshmallows.\n\nMeanwhile, the resistance fighters trying to sway Alex to their cause can't help but chuckle at the sheer absurdity of Alex's creations, even as they warn of the dangers of dream manipulation. \"So, let me get this straight,\" one rebel leader says, \"you've been making people think they're dancing with sentient toasters? Well, that's certainly one way to fight the system.\"\n\nThrough it all, Alex remains oblivious to the humor of their situation, laser-focused on perfecting their craft and exploring the boundless possibilities of the dream world. After all, who needs reality when you can design your own fantastical escapes - even if they do involve the occasional mutant unicorn or singing paperclip."
+

Teardown

PASSED test_arg_exceptions 0:00:00.989845

Setup

Call

Captured stderr call
[2024-11-26T00:37:20Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
     
-[2024-11-25T23:52:34Z WARN  baml_events] Function MyFunc:
-    Client: MyClient (<unknown>) - 281ms
+[2024-11-26T00:37:20Z WARN  baml_events] Function MyFunc:
+    Client: MyClient (<unknown>) - 385ms
     ---PROMPT---
     [chat] user: Given a string, extract info using the schema:
     
@@ -2787,8 +2671,8 @@
         }
     }
     
-[2024-11-25T23:52:34Z WARN  baml_events] Function MyFunc:
-    Client: MyClient (<unknown>) - 182ms
+[2024-11-26T00:37:20Z WARN  baml_events] Function MyFunc:
+    Client: MyClient (<unknown>) - 161ms
     ---PROMPT---
     [chat] user: Given a string, extract info using the schema:
     
@@ -2811,8 +2695,8 @@
         }
     }
     
-[2024-11-25T23:52:35Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 471ms. StopReason: stop. Tokens(in/out): 12/3
+[2024-11-26T00:37:21Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 426ms. StopReason: stop. Tokens(in/out): 12/3
     ---PROMPT---
     [chat] user: Say "hello there".
     
@@ -2822,25 +2706,25 @@
     Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
-

Teardown

PASSED test_map_as_param 0:00:00.001820

Setup

Call

Captured stderr call
[2024-11-25T23:52:35Z ERROR baml_runtime::tracing]   Error: myMap: a: Expected map, got `String("b")`
+

Teardown

PASSED test_map_as_param 0:00:00.001731

Setup

Call

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

Teardown

PASSED test_baml_validation_error_format 0:00:00.390795

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

Setup

Call

Captured stdout call
Error:  BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
   - <root>: Missing required field: nonce
-  - <root>: Missing required field: nonce2, raw_output=Hello there!, prompt=[chat] user: Say "hello there".
+  - <root>: Missing required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] user: Say "hello there".
 )
-
Captured stderr call
[2024-11-25T23:52:35Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 384ms. StopReason: stop. Tokens(in/out): 12/3
+
Captured stderr call
[2024-11-26T00:37:22Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 717ms. StopReason: stop. Tokens(in/out): 12/10
     ---PROMPT---
     [chat] user: Say "hello there".
     
     ---LLM REPLY---
-    Hello there!
+    Hello there! How can I assist you today?
     ---Parsed Response (Error)---
     Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
-

Teardown

PASSED test_no_stream_big_integer 0:00:00.428494

Setup

Call

Captured stderr call
[2024-11-25T23:52:35Z INFO  baml_events] Function StreamOneBigNumber:
-    Client: GPT4 (gpt-4o-2024-08-06) - 422ms. StopReason: stop. Tokens(in/out): 46/4
+

Teardown

PASSED test_no_stream_big_integer 0:00:00.416612

Setup

Call

Captured stderr call
[2024-11-26T00:37:22Z INFO  baml_events] Function StreamOneBigNumber:
+    Client: GPT4 (gpt-4o-2024-08-06) - 411ms. StopReason: stop. Tokens(in/out): 46/4
     ---PROMPT---
     [chat] user: Respond with only an integer, no affirmations or prefixes or anything.
     The response should be parsable as a JSON number.
@@ -2850,11 +2734,11 @@
     Answer as an int
     
     ---LLM REPLY---
-    123456789012
+    102345678901
     ---Parsed Response (int)---
-    123456789012
-

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.484051

Setup

Call

Captured stderr call
[2024-11-25T23:52:36Z INFO  baml_events] Function StreamBigNumbers:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 479ms. StopReason: stop. Tokens(in/out): 70/24
+    102345678901
+

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.454241

Setup

Call

Captured stderr call
[2024-11-26T00:37:22Z INFO  baml_events] Function StreamBigNumbers:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 449ms. StopReason: stop. Tokens(in/out): 70/23
     ---PROMPT---
     [chat] user: Please make sure every integer in the output has 12 digits.
     For floats, provide a mix - from 0-10 places before the decimal point,
@@ -2868,16 +2752,16 @@
     
     ---LLM REPLY---
     {
-      "a": 100000000001,
-      "b": 5.6789123456
+      "a": 123456789012,
+      "b": 7.890123456
     }
     ---Parsed Response (class BigNumbers)---
     {
-      "a": 100000000001,
-      "b": 5.6789123456
+      "a": 123456789012,
+      "b": 7.890123456
     }
-

Teardown

PASSED test_no_stream_compound_object 0:00:02.104237

Setup

Call

Captured stderr call
[2024-11-25T23:52:38Z INFO  baml_events] Function StreamingCompoundNumbers:
-    Client: GPT4 (gpt-4o-2024-08-06) - 2099ms. StopReason: stop. Tokens(in/out): 133/150
+

Teardown

PASSED test_no_stream_compound_object 0:00:02.528516

Setup

Call

Captured stderr call
[2024-11-26T00:37:25Z INFO  baml_events] Function StreamingCompoundNumbers:
+    Client: GPT4 (gpt-4o-2024-08-06) - 2522ms. StopReason: stop. Tokens(in/out): 133/149
     ---PROMPT---
     [chat] user:     Respond in pure json. Don't use any English descriptions like "Sure, I'll do that",
         nor put the result into a fenced code block.
@@ -2904,54 +2788,54 @@
     {
       "big": {
         "a": 123456789012,
-        "b": 12345.6789012345
+        "b": 9876543210.1234567890
       },
       "big_nums": [
         {
           "a": 234567890123,
-          "b": 3456789.0123456789
+          "b": 1234567.89
         },
         {
           "a": 345678901234,
-          "b": 1234567890.1
+          "b": 1234567890123.456789
         },
         {
           "a": 456789012345,
-          "b": 1234567890.123456
+          "b": 12345.6789012
         }
       ],
       "another": {
         "a": 567890123456,
-        "b": 567890.123456789
+        "b": 123.456789012
       }
     }
     ---Parsed Response (class CompoundBigNumbers)---
     {
       "big": {
         "a": 123456789012,
-        "b": 12345.6789012345
+        "b": 9876543210.123457
       },
       "big_nums": [
         {
           "a": 234567890123,
-          "b": 3456789.012345679
+          "b": 1234567.89
         },
         {
           "a": 345678901234,
-          "b": 1234567890.1
+          "b": 1234567890123.4568
         },
         {
           "a": 456789012345,
-          "b": 1234567890.123456
+          "b": 12345.6789012
         }
       ],
       "another": {
         "a": 567890123456,
-        "b": 567890.123456789
+        "b": 123.456789012
       }
     }
-

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:03.002314

Setup

Call

Captured stderr call
[2024-11-25T23:52:41Z INFO  baml_events] Function StreamingCompoundNumbers:
-    Client: GPT4 (gpt-4o-2024-08-06) - 2997ms. StopReason: stop. Tokens(in/out): 114/145
+

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:01.786465

Setup

Call

Captured stderr call
[2024-11-26T00:37:27Z INFO  baml_events] Function StreamingCompoundNumbers:
+    Client: GPT4 (gpt-4o-2024-08-06) - 1781ms. StopReason: stop. Tokens(in/out): 114/148
     ---PROMPT---
     [chat] user:     Please give me a friendly response before outputting json. And put the JSON
         into a fenced code block.
@@ -2973,53 +2857,53 @@
     }
     
     ---LLM REPLY---
-    Hello there! I've got your request covered. Here's the JSON information formatted according to your specified schema:
+    Hey there! I'm about to share some JSON data with you following your specifications. Check it out below:
     
     ```json
     {
       "big": {
-        "a": 123456789012,
-        "b": 9876543.2101
+        "a": 100000000001,
+        "b": 1234567890.123456789
       },
       "big_nums": [
         {
-          "a": 234567890123,
-          "b": 123456789.123456
+          "a": 200000000002,
+          "b": 987654321.1
         },
         {
-          "a": 345678901234,
-          "b": 98765.432109876
+          "a": 300000000003,
+          "b": 12340000000.1234
         }
       ],
       "another": {
-        "a": 456789012345,
-        "b": 5432109876.54321
+        "a": 400000000004,
+        "b": 567890123.987654321
       }
     }
     ```
     ---Parsed Response (class CompoundBigNumbers)---
     {
       "big": {
-        "a": 123456789012,
-        "b": 9876543.2101
+        "a": 100000000001,
+        "b": 1234567890.1234567
       },
       "big_nums": [
         {
-          "a": 234567890123,
-          "b": 123456789.123456
+          "a": 200000000002,
+          "b": 987654321.1
         },
         {
-          "a": 345678901234,
-          "b": 98765.432109876
+          "a": 300000000003,
+          "b": 12340000000.1234
         }
       ],
       "another": {
-        "a": 456789012345,
-        "b": 5432109876.54321
+        "a": 400000000004,
+        "b": 567890123.9876543
       }
     }
-

Teardown

PASSED test_differing_unions 0:00:01.695981

Setup

Call

Captured stderr call
[2024-11-25T23:52:43Z INFO  baml_events] Function DifferentiateUnions:
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 1692ms. StopReason: stop. Tokens(in/out): 50/78
+

Teardown

PASSED test_differing_unions 0:00:01.066114

Setup

Call

Captured stderr call
[2024-11-26T00:37:28Z INFO  baml_events] Function DifferentiateUnions:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 1057ms. StopReason: stop. Tokens(in/out): 50/60
     ---PROMPT---
     [chat] user: Create a data model that represents the latter of the two classes.
     
@@ -3032,23 +2916,23 @@
     }
     
     ---LLM REPLY---
-    Certainly! Since you've mentioned "the latter of the two classes" but didn't specify what the two classes are, I will create a JSON data model based on the second schema you provided:
+    Here’s a data model in JSON that represents the latter of the two classes, which includes an integer value and a string value:
     
     ```json
     {
       "value": 42,
       "value2": "example string"
     }
-    ```
+    ``` 
     
-    Feel free to provide more context or specify the exact classes if you need a different model!
+    Feel free to customize the values to suit your needs!
     ---Parsed Response (class OriginalB)---
     {
       "value": 42,
       "value2": "example string"
     }
-

Teardown

PASSED test_return_failing_assert 0:00:00.524551

Setup

Call

Captured stderr call
[2024-11-25T23:52:43Z WARN  baml_events] Function ReturnFailingAssert:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 522ms. StopReason: stop. Tokens(in/out): 19/1
+

Teardown

PASSED test_return_failing_assert 0:00:00.619982

Setup

Call

Captured stderr call
[2024-11-26T00:37:28Z WARN  baml_events] Function ReturnFailingAssert:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 615ms. StopReason: stop. Tokens(in/out): 19/1
     ---PROMPT---
     [chat] user: Return the next integer after 1.
     
@@ -3058,74 +2942,9 @@
     2
     ---Parsed Response (Error)---
     Failed to coerce value: <root>: Assertions failed.
-

Teardown

PASSED test_parameter_failing_assert 0:00:00.001120

Setup

Call

Captured stderr call
[2024-11-25T23:52:43Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: small_int
+

Teardown

PASSED test_parameter_failing_assert 0:00:00.002388

Setup

Call

Captured stderr call
[2024-11-26T00:37:28Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: small_int
     
-

Teardown

PASSED test_failing_assert_can_stream 0:00:02.628451

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
+

Teardown

PASSED test_failing_assert_can_stream 0:00:02.132530

Setup

Call

Captured stdout call
None
 None
 None
 None
@@ -3665,49 +3484,8 @@
 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
-
Captured stderr call
[2024-11-25T23:52:46Z WARN  baml_events] Function StreamFailingAssertion:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 2624ms. StopReason: stop. Tokens(in/out): 62/320
+
Captured stderr call
[2024-11-26T00:37:31Z WARN  baml_events] Function StreamFailingAssertion:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 2127ms. StopReason: stop. Tokens(in/out): 62/267
     ---PROMPT---
     [chat] user: Tell me two different stories along the theme of Yoshimi battles the pink robots with the same title.
     Please make each about 300 words long.
@@ -3721,8 +3499,8 @@
     ---LLM REPLY---
     {
       "title": "Yoshimi Battles the Pink Robots",
-      "story_a": "Yoshimi was a young warrior born in a world where pink robots roamed freely, causing chaos and destruction wherever they went. Armed with only her determination and bravery, Yoshimi set out to battle these pink robots and protect her village. With each robot she defeated, she grew stronger and more courageous. The battle was long and treacherous, but Yoshimi's unwavering spirit never faltered. Finally, after a fierce showdown with the leader of the pink robots, Yoshimi emerged victorious, saving her village and becoming a hero to all. The people celebrated her bravery and hailed her as the savior who had defeated the pink robots once and for all.",
-      "story_b": "Yoshimi was a talented musician who lived in a world where pink robots ruled the music industry. These robots produced catchy pop tunes that mesmerized the masses, leaving no room for independent artists like Yoshimi. Determined to reclaim her place in the music scene, Yoshimi composed a powerful and rebellious anthem that spoke out against the pink robots' control. The song quickly gained popularity and inspired other musicians to join her in the fight. The showdown between Yoshimi and the pink robots was not a physical battle, but a battle of creativity and innovation. In the end, Yoshimi's music triumphed, bringing down the pink robots and restoring freedom to the music industry. She became a symbol of resistance and a beacon of hope for all independent artists striving to break free from the mainstream." 
+      "story_a": "Yoshimi was a skilled warrior, trained in the ancient art of robot combat. When a group of pink robots invaded her village, Yoshimi knew it was up to her to save the day. Armed with her trusty sword and fierce determination, she faced off against the robots in a battle that shook the ground. With each swing of her sword, Yoshimi fought bravely, dodging lasers and parrying attacks. In the end, Yoshimi emerged victorious, her village saved from the robot threat. The townspeople cheered her name, grateful for her bravery and skill in battle.",
+      "story_b": "Yoshimi was a young musician who stumbled upon a mysterious pink robot invasion while on tour with her band. Intrigued by the strange creatures, Yoshimi decided to investigate further. As she delved deeper into the mystery, Yoshimi realized that the robots were not as menacing as they first appeared. In fact, they were lost and confused, searching for their way home. With her music, Yoshimi was able to communicate with the robots and guide them back to their own world, where they belonged. The pink robots danced joyfully as they bid Yoshimi farewell, grateful for her help and understanding."
     }
     ---Parsed Response (Error)---
     Failed to coerce value: <root>: Failed while parsing required fields: missing=0, unparsed=2
@@ -3730,8 +3508,8 @@
         - <root>: Assertions failed.
       - <root>: Failed to parse field story_b: <root>: Assertions failed.
         - <root>: Assertions failed.
-

Teardown

PASSED test_simple_recursive_type 0:00:02.263871

Setup

Call

Captured stderr call
[2024-11-25T23:52:48Z INFO  baml_events] Function BuildLinkedList:
-    Client: O1 (o1-mini-2024-09-12) - 2254ms. StopReason: stop. Tokens(in/out): 81/293
+

Teardown

PASSED test_simple_recursive_type 0:00:02.987520

Setup

Call

Captured stderr call
[2024-11-26T00:37:34Z INFO  baml_events] Function BuildLinkedList:
+    Client: O1 (o1-mini-2024-09-12) - 2978ms. StopReason: stop. Tokens(in/out): 81/357
     ---PROMPT---
     [chat] user: Build a linked list from the input array of integers.
     
@@ -3791,21 +3569,14 @@
       },
       "len": 5
     }
-

Teardown

PASSED test_mutually_recursive_type 0:00:01.653936

Setup

Call

Captured stderr call
[2024-11-25T23:52:50Z INFO  baml_events] Function BuildTree:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1643ms. StopReason: stop. Tokens(in/out): 216/190
+

Teardown

PASSED test_mutually_recursive_type 0:00:01.932089

Setup

Call

Captured stderr call
[2024-11-26T00:37:36Z INFO  baml_events] Function BuildTree:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1921ms. StopReason: stop. Tokens(in/out): 216/190
     ---PROMPT---
     [chat] user: Given the input binary tree, transform it into a generic tree using the given schema.
     
     INPUT:
     {
-        "data": 5,
         "left": {
-            "right": {
-                "data": 4,
-                "left": none,
-                "right": none,
-            },
-            "data": 3,
             "left": {
                 "right": none,
                 "data": 1,
@@ -3815,19 +3586,26 @@
                     "left": none,
                 },
             },
-        },
-        "right": {
             "right": {
-                "left": none,
+                "data": 4,
                 "right": none,
-                "data": 8,
+                "left": none,
             },
+            "data": 3,
+        },
+        "data": 5,
+        "right": {
+            "data": 7,
             "left": {
                 "left": none,
                 "right": none,
                 "data": 6,
             },
-            "data": 7,
+            "right": {
+                "right": none,
+                "data": 8,
+                "left": none,
+            },
         },
     }
     
@@ -3844,56 +3622,56 @@
     
     ---LLM REPLY---
     {
-      "data": 5,
-      "children": {
-        "trees": [
-          {
-            "data": 3,
-            "children": {
-              "trees": [
-                {
-                  "data": 1,
-                  "children": {
-                    "trees": [
-                      {
-                        "data": 2,
-                        "children": {
-                          "trees": []
-                        }
-                      }
-                    ]
-                  }
-                },
-                {
-                  "data": 4,
-                  "children": {
-                    "trees": []
-                  }
-                }
-              ]
-            }
-          },
-          {
-            "data": 7,
-            "children": {
-              "trees": [
+        "data": 5,
+        "children": {
+            "trees": [
                 {
-                  "data": 6,
-                  "children": {
-                    "trees": []
-                  }
+                    "data": 3,
+                    "children": {
+                        "trees": [
+                            {
+                                "data": 1,
+                                "children": {
+                                    "trees": [
+                                        {
+                                            "data": 2,
+                                            "children": {
+                                                "trees": []
+                                            }
+                                        }
+                                    ]
+                                }
+                            },
+                            {
+                                "data": 4,
+                                "children": {
+                                    "trees": []
+                                }
+                            }
+                        ]
+                    }
                 },
                 {
-                  "data": 8,
-                  "children": {
-                    "trees": []
-                  }
+                    "data": 7,
+                    "children": {
+                        "trees": [
+                            {
+                                "data": 6,
+                                "children": {
+                                    "trees": []
+                                }
+                            },
+                            {
+                                "data": 8,
+                                "children": {
+                                    "trees": []
+                                }
+                            }
+                        ]
+                    }
                 }
-              ]
-            }
-          }
-        ]
-      }
+            ]
+        }
     }
     ---Parsed Response (class Tree)---
     {
@@ -3948,8 +3726,8 @@
         ]
       }
     }
-

Teardown

PASSED test_block_constraints 0:00:00.510715

Setup

Call

Captured stderr call
[2024-11-25T23:52:50Z INFO  baml_events] Function MakeBlockConstraint:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 504ms. StopReason: stop. Tokens(in/out): 42/19
+

Teardown

PASSED test_block_constraints 0:00:00.493983

Setup

Call

Captured stderr call
[2024-11-26T00:37:36Z INFO  baml_events] Function MakeBlockConstraint:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 491ms. StopReason: stop. Tokens(in/out): 42/20
     ---PROMPT---
     [chat] user: Generate an output in the following schema with a short string and a large int.
     
@@ -3962,13 +3740,13 @@
     ---LLM REPLY---
     {
       "foo": 1000000,
-      "bar": "Hello World!"
+      "bar": "Hello, World!"
     }
     ---Parsed Response (class BlockConstraint)---
     {
       "value": {
         "foo": 1000000,
-        "bar": "Hello World!"
+        "bar": "Hello, World!"
       },
       "checks": {
         "cross_field": {
@@ -3978,9 +3756,9 @@
         }
       }
     }
-

Teardown

PASSED test_nested_block_constraints 0:00:00.599392

Setup

Call

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

Teardown

PASSED test_nested_block_constraints 0:00:00.550835

Setup

Call

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

Teardown

PASSED test_block_constraint_arguments 0:00:00.002035

Setup

Call

Captured stderr call
[2024-11-25T23:52:51Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+

Teardown

PASSED test_block_constraint_arguments 0:00:00.002001

Setup

Call

Captured stderr call
[2024-11-26T00:37:37Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-[2024-11-25T23:52:51Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+[2024-11-26T00:37:37Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-

Teardown

tests/test_pydantic.py 3 0:00:00.002156

PASSED test_model_validate_success 0:00:00.000421

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.001188

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000547

Setup

Call

Teardown

\ No newline at end of file +

Teardown

tests/test_pydantic.py 3 0:00:00.001668

PASSED test_model_validate_success 0:00:00.000383

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000537

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000749

Setup

Call

Teardown

\ No newline at end of file diff --git a/integ-tests/python/tests/test_functions.py b/integ-tests/python/tests/test_functions.py index 6bb0c2f9b..961f897b9 100644 --- a/integ-tests/python/tests/test_functions.py +++ b/integ-tests/python/tests/test_functions.py @@ -1091,7 +1091,6 @@ async def test_dynamic_client_with_vertex_json_str_creds(): "vertex-ai", { "model": "gemini-1.5-pro", - "project_id": "sam-project-vertex-1", "location": "us-central1", "credentials": os.environ[ "INTEG_TESTS_GOOGLE_APPLICATION_CREDENTIALS_CONTENT" @@ -1114,7 +1113,6 @@ async def test_dynamic_client_with_vertex_json_object_creds(): "vertex-ai", { "model": "gemini-1.5-pro", - "project_id": "sam-project-vertex-1", "location": "us-central1", "credentials": json.loads( os.environ["INTEG_TESTS_GOOGLE_APPLICATION_CREDENTIALS_CONTENT"] diff --git a/integ-tests/ruby/baml_client/client.rb b/integ-tests/ruby/baml_client/client.rb index 4968ab8d7..0bf846671 100644 --- a/integ-tests/ruby/baml_client/client.rb +++ b/integ-tests/ruby/baml_client/client.rb @@ -1810,6 +1810,102 @@ def GetQuery( (raw.parsed_using_types(Baml::Types)) end + sig { + params( + varargs: T.untyped, + i1: T::Hash[String, String],i2: T::Hash[String, String], + baml_options: T::Hash[Symbol, T.any(Baml::TypeBuilder, Baml::ClientRegistry)] + ).returns(T::Hash[String, String]) + } + def InOutEnumMapKey( + *varargs, + i1:,i2:, + baml_options: {} + ) + if varargs.any? + + raise ArgumentError.new("InOutEnumMapKey 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( + "InOutEnumMapKey", + { + i1: i1,i2: i2, + }, + @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, + i1: T::Hash[String, String],i2: T::Hash[String, String], + baml_options: T::Hash[Symbol, T.any(Baml::TypeBuilder, Baml::ClientRegistry)] + ).returns(T::Hash[String, String]) + } + def InOutLiteralStringUnionMapKey( + *varargs, + i1:,i2:, + baml_options: {} + ) + if varargs.any? + + raise ArgumentError.new("InOutLiteralStringUnionMapKey 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( + "InOutLiteralStringUnionMapKey", + { + i1: i1,i2: i2, + }, + @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, + m: T::Hash[String, String], + baml_options: T::Hash[Symbol, T.any(Baml::TypeBuilder, Baml::ClientRegistry)] + ).returns(T::Hash[String, String]) + } + def InOutSingleLiteralStringMapKey( + *varargs, + m:, + baml_options: {} + ) + if varargs.any? + + raise ArgumentError.new("InOutSingleLiteralStringMapKey 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( + "InOutSingleLiteralStringMapKey", + { + m: m, + }, + @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, @@ -5668,6 +5764,111 @@ def GetQuery( ) end + sig { + params( + varargs: T.untyped, + i1: T::Hash[String, String],i2: T::Hash[String, String], + baml_options: T::Hash[Symbol, T.any(Baml::TypeBuilder, Baml::ClientRegistry)] + ).returns(Baml::BamlStream[T::Hash[String, String]]) + } + def InOutEnumMapKey( + *varargs, + i1:,i2:, + baml_options: {} + ) + if varargs.any? + + raise ArgumentError.new("InOutEnumMapKey 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( + "InOutEnumMapKey", + { + i1: i1,i2: i2, + }, + @ctx_manager, + baml_options[:tb]&.instance_variable_get(:@registry), + baml_options[:client_registry], + ) + Baml::BamlStream[T::Hash[String, T.nilable(String)], T::Hash[String, String]].new( + ffi_stream: raw, + ctx_manager: @ctx_manager + ) + end + + sig { + params( + varargs: T.untyped, + i1: T::Hash[String, String],i2: T::Hash[String, String], + baml_options: T::Hash[Symbol, T.any(Baml::TypeBuilder, Baml::ClientRegistry)] + ).returns(Baml::BamlStream[T::Hash[String, String]]) + } + def InOutLiteralStringUnionMapKey( + *varargs, + i1:,i2:, + baml_options: {} + ) + if varargs.any? + + raise ArgumentError.new("InOutLiteralStringUnionMapKey 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( + "InOutLiteralStringUnionMapKey", + { + i1: i1,i2: i2, + }, + @ctx_manager, + baml_options[:tb]&.instance_variable_get(:@registry), + baml_options[:client_registry], + ) + Baml::BamlStream[T::Hash[String, T.nilable(String)], T::Hash[String, String]].new( + ffi_stream: raw, + ctx_manager: @ctx_manager + ) + end + + sig { + params( + varargs: T.untyped, + m: T::Hash[String, String], + baml_options: T::Hash[Symbol, T.any(Baml::TypeBuilder, Baml::ClientRegistry)] + ).returns(Baml::BamlStream[T::Hash[String, String]]) + } + def InOutSingleLiteralStringMapKey( + *varargs, + m:, + baml_options: {} + ) + if varargs.any? + + raise ArgumentError.new("InOutSingleLiteralStringMapKey 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( + "InOutSingleLiteralStringMapKey", + { + m: m, + }, + @ctx_manager, + baml_options[:tb]&.instance_variable_get(:@registry), + baml_options[:client_registry], + ) + Baml::BamlStream[T::Hash[String, T.nilable(String)], T::Hash[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 d185866d2..11b3f2a39 100644 --- a/integ-tests/ruby/baml_client/inlined.rb +++ b/integ-tests/ruby/baml_client/inlined.rb @@ -74,8 +74,8 @@ module Inlined "test-files/functions/output/literal-int.baml" => "function FnOutputLiteralInt(input: string) -> 5 {\n client GPT35\n prompt #\"\n Return an integer: {{ ctx.output_format}}\n \"#\n}\n\ntest FnOutputLiteralInt {\n functions [FnOutputLiteralInt]\n args {\n input \"example input\"\n }\n}\n", "test-files/functions/output/literal-string.baml" => "function FnOutputLiteralString(input: string) -> \"example output\" {\n client GPT35\n prompt #\"\n Return a string: {{ ctx.output_format}}\n \"#\n}\n\ntest FnOutputLiteralString {\n functions [FnOutputLiteralString]\n args {\n input \"example input\"\n }\n}\n", "test-files/functions/output/literal-unions.baml" => "function LiteralUnionsTest(input: string) -> 1 | true | \"string output\" {\n client GPT35\n prompt #\"\n Return one of these values: \n {{ctx.output_format}}\n \"#\n}\n\ntest LiteralUnionsTest {\n functions [LiteralUnionsTest]\n args {\n input \"example input\"\n }\n}\n", - "test-files/functions/output/map-enum-key.baml" => "enum MapKey {\n A\n B\n C\n}\n\n// function InOutEnumMapKey(i1: map, i2: map) -> map {\n// client \"openai/gpt-4o\"\n// prompt #\"\n// Merge these: {{i1}} {{i2}}\n\n// {{ ctx.output_format }}\n// \"#\n// }\n", - "test-files/functions/output/map-literal-union-key.baml" => "// function InOutLiteralStringUnionMapKey(\n// i1: map<\"one\" | \"two\" | (\"three\" | \"four\"), string>, \n// i2: map<\"one\" | \"two\" | (\"three\" | \"four\"), string>\n// ) -> map<\"one\" | \"two\" | (\"three\" | \"four\"), string> {\n// client \"openai/gpt-4o\"\n// prompt #\"\n// Merge these:\n \n// {{i1}}\n \n// {{i2}}\n\n// {{ ctx.output_format }}\n// \"#\n// }\n\n// function InOutSingleLiteralStringMapKey(m: map<\"key\", string>) -> map<\"key\", string> {\n// client \"openai/gpt-4o\"\n// prompt #\"\n// Return the same map you were given:\n \n// {{m}}\n\n// {{ ctx.output_format }}\n// \"#\n// }\n", + "test-files/functions/output/map-enum-key.baml" => "enum MapKey {\n A\n B\n C\n}\n\nfunction InOutEnumMapKey(i1: map, i2: map) -> map {\n client \"openai/gpt-4o\"\n prompt #\"\n Merge these: {{i1}} {{i2}}\n\n {{ ctx.output_format }}\n \"#\n}\n", + "test-files/functions/output/map-literal-union-key.baml" => "function InOutLiteralStringUnionMapKey(\n i1: map<\"one\" | \"two\" | (\"three\" | \"four\"), string>, \n i2: map<\"one\" | \"two\" | (\"three\" | \"four\"), string>\n) -> map<\"one\" | \"two\" | (\"three\" | \"four\"), string> {\n client \"openai/gpt-4o\"\n prompt #\"\n Merge these:\n \n {{i1}}\n \n {{i2}}\n\n {{ ctx.output_format }}\n \"#\n}\n\nfunction InOutSingleLiteralStringMapKey(m: map<\"key\", string>) -> map<\"key\", string> {\n client \"openai/gpt-4o\"\n prompt #\"\n Return the same map you were given:\n \n {{m}}\n\n {{ ctx.output_format }}\n \"#\n}\n", "test-files/functions/output/mutually-recursive-classes.baml" => "class Tree {\n data int\n children Forest\n}\n\nclass Forest {\n trees Tree[]\n}\n\nclass BinaryNode {\n data int\n left BinaryNode?\n right BinaryNode?\n}\n\nfunction BuildTree(input: BinaryNode) -> Tree {\n client GPT35\n prompt #\"\n Given the input binary tree, transform it into a generic tree using the given schema.\n\n INPUT:\n {{ input }}\n\n {{ ctx.output_format }} \n \"#\n}\n\ntest TestTree {\n functions [BuildTree]\n args {\n input {\n data 2\n left {\n data 1\n left null\n right null\n }\n right {\n data 3\n left null\n right null\n }\n }\n }\n}", "test-files/functions/output/optional-class.baml" => "class ClassOptionalOutput {\n prop1 string\n prop2 string\n}\n\nfunction FnClassOptionalOutput(input: string) -> ClassOptionalOutput? {\n client GPT35\n prompt #\"\n Return a json blob for the following input:\n {{input}}\n\n {{ctx.output_format}}\n\n JSON:\n \"#\n}\n\n\nclass Blah {\n prop4 string?\n}\n\nclass ClassOptionalOutput2 {\n prop1 string?\n prop2 string?\n prop3 Blah?\n}\n\nfunction FnClassOptionalOutput2(input: string) -> ClassOptionalOutput2? {\n client GPT35\n prompt #\"\n Return a json blob for the following input:\n {{input}}\n\n {{ctx.output_format}}\n\n JSON:\n \"#\n}\n\ntest FnClassOptionalOutput2 {\n functions [FnClassOptionalOutput2, FnClassOptionalOutput]\n args {\n input \"example input\"\n }\n}\n", "test-files/functions/output/optional.baml" => "class OptionalTest_Prop1 {\n omega_a string\n omega_b int\n}\n\nenum OptionalTest_CategoryType {\n Aleph\n Beta\n Gamma\n}\n \nclass OptionalTest_ReturnType {\n omega_1 OptionalTest_Prop1?\n omega_2 string?\n omega_3 (OptionalTest_CategoryType?)[]\n} \n \nfunction OptionalTest_Function(input: string) -> (OptionalTest_ReturnType?)[]\n{ \n client GPT35\n prompt #\"\n Return a JSON blob with this schema: \n {{ctx.output_format}}\n\n JSON:\n \"#\n}\n\ntest OptionalTest_Function {\n functions [OptionalTest_Function]\n args {\n input \"example input\"\n }\n}\n", diff --git a/integ-tests/typescript/baml_client/async_client.ts b/integ-tests/typescript/baml_client/async_client.ts index 73f2ac397..7c910ffae 100644 --- a/integ-tests/typescript/baml_client/async_client.ts +++ b/integ-tests/typescript/baml_client/async_client.ts @@ -1418,6 +1418,81 @@ export class BamlAsyncClient { } } + async InOutEnumMapKey( + i1: Partial>,i2: Partial>, + __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } + ): Promise>> { + try { + const raw = await this.runtime.callFunction( + "InOutEnumMapKey", + { + "i1": i1,"i2": i2 + }, + this.ctx_manager.cloneContext(), + __baml_options__?.tb?.__tb(), + __baml_options__?.clientRegistry, + ) + return raw.parsed() as Partial> + } catch (error: any) { + const bamlError = createBamlValidationError(error); + if (bamlError instanceof BamlValidationError) { + throw bamlError; + } else { + throw error; + } + } + } + + async InOutLiteralStringUnionMapKey( + i1: Partial>,i2: Partial>, + __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } + ): Promise>> { + try { + const raw = await this.runtime.callFunction( + "InOutLiteralStringUnionMapKey", + { + "i1": i1,"i2": i2 + }, + this.ctx_manager.cloneContext(), + __baml_options__?.tb?.__tb(), + __baml_options__?.clientRegistry, + ) + return raw.parsed() as Partial> + } catch (error: any) { + const bamlError = createBamlValidationError(error); + if (bamlError instanceof BamlValidationError) { + throw bamlError; + } else { + throw error; + } + } + } + + async InOutSingleLiteralStringMapKey( + m: Partial>, + __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } + ): Promise>> { + try { + const raw = await this.runtime.callFunction( + "InOutSingleLiteralStringMapKey", + { + "m": m + }, + this.ctx_manager.cloneContext(), + __baml_options__?.tb?.__tb(), + __baml_options__?.clientRegistry, + ) + return raw.parsed() as Partial> + } catch (error: any) { + const bamlError = createBamlValidationError(error); + if (bamlError instanceof BamlValidationError) { + throw bamlError; + } else { + throw error; + } + } + } + async LiteralUnionsTest( input: string, __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } @@ -4739,6 +4814,105 @@ class BamlStreamClient { } } + InOutEnumMapKey( + i1: Partial>,i2: Partial>, + __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } + ): BamlStream>>, Partial>> { + try { + const raw = this.runtime.streamFunction( + "InOutEnumMapKey", + { + "i1": i1,"i2": i2 + }, + undefined, + this.ctx_manager.cloneContext(), + __baml_options__?.tb?.__tb(), + __baml_options__?.clientRegistry, + ) + return new BamlStream>>, Partial>>( + raw, + (a): a is RecursivePartialNull>> => a, + (a): a is Partial> => 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; + } + } + + InOutLiteralStringUnionMapKey( + i1: Partial>,i2: Partial>, + __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } + ): BamlStream>>, Partial>> { + try { + const raw = this.runtime.streamFunction( + "InOutLiteralStringUnionMapKey", + { + "i1": i1,"i2": i2 + }, + undefined, + this.ctx_manager.cloneContext(), + __baml_options__?.tb?.__tb(), + __baml_options__?.clientRegistry, + ) + return new BamlStream>>, Partial>>( + raw, + (a): a is RecursivePartialNull>> => a, + (a): a is Partial> => 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; + } + } + + InOutSingleLiteralStringMapKey( + m: Partial>, + __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } + ): BamlStream>>, Partial>> { + try { + const raw = this.runtime.streamFunction( + "InOutSingleLiteralStringMapKey", + { + "m": m + }, + undefined, + this.ctx_manager.cloneContext(), + __baml_options__?.tb?.__tb(), + __baml_options__?.clientRegistry, + ) + return new BamlStream>>, Partial>>( + raw, + (a): a is RecursivePartialNull>> => a, + (a): a is Partial> => 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; + } + } + LiteralUnionsTest( input: 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 94798a9d7..6cf961ac7 100644 --- a/integ-tests/typescript/baml_client/inlinedbaml.ts +++ b/integ-tests/typescript/baml_client/inlinedbaml.ts @@ -75,8 +75,8 @@ const fileMap = { "test-files/functions/output/literal-int.baml": "function FnOutputLiteralInt(input: string) -> 5 {\n client GPT35\n prompt #\"\n Return an integer: {{ ctx.output_format}}\n \"#\n}\n\ntest FnOutputLiteralInt {\n functions [FnOutputLiteralInt]\n args {\n input \"example input\"\n }\n}\n", "test-files/functions/output/literal-string.baml": "function FnOutputLiteralString(input: string) -> \"example output\" {\n client GPT35\n prompt #\"\n Return a string: {{ ctx.output_format}}\n \"#\n}\n\ntest FnOutputLiteralString {\n functions [FnOutputLiteralString]\n args {\n input \"example input\"\n }\n}\n", "test-files/functions/output/literal-unions.baml": "function LiteralUnionsTest(input: string) -> 1 | true | \"string output\" {\n client GPT35\n prompt #\"\n Return one of these values: \n {{ctx.output_format}}\n \"#\n}\n\ntest LiteralUnionsTest {\n functions [LiteralUnionsTest]\n args {\n input \"example input\"\n }\n}\n", - "test-files/functions/output/map-enum-key.baml": "enum MapKey {\n A\n B\n C\n}\n\n// function InOutEnumMapKey(i1: map, i2: map) -> map {\n// client \"openai/gpt-4o\"\n// prompt #\"\n// Merge these: {{i1}} {{i2}}\n\n// {{ ctx.output_format }}\n// \"#\n// }\n", - "test-files/functions/output/map-literal-union-key.baml": "// function InOutLiteralStringUnionMapKey(\n// i1: map<\"one\" | \"two\" | (\"three\" | \"four\"), string>, \n// i2: map<\"one\" | \"two\" | (\"three\" | \"four\"), string>\n// ) -> map<\"one\" | \"two\" | (\"three\" | \"four\"), string> {\n// client \"openai/gpt-4o\"\n// prompt #\"\n// Merge these:\n \n// {{i1}}\n \n// {{i2}}\n\n// {{ ctx.output_format }}\n// \"#\n// }\n\n// function InOutSingleLiteralStringMapKey(m: map<\"key\", string>) -> map<\"key\", string> {\n// client \"openai/gpt-4o\"\n// prompt #\"\n// Return the same map you were given:\n \n// {{m}}\n\n// {{ ctx.output_format }}\n// \"#\n// }\n", + "test-files/functions/output/map-enum-key.baml": "enum MapKey {\n A\n B\n C\n}\n\nfunction InOutEnumMapKey(i1: map, i2: map) -> map {\n client \"openai/gpt-4o\"\n prompt #\"\n Merge these: {{i1}} {{i2}}\n\n {{ ctx.output_format }}\n \"#\n}\n", + "test-files/functions/output/map-literal-union-key.baml": "function InOutLiteralStringUnionMapKey(\n i1: map<\"one\" | \"two\" | (\"three\" | \"four\"), string>, \n i2: map<\"one\" | \"two\" | (\"three\" | \"four\"), string>\n) -> map<\"one\" | \"two\" | (\"three\" | \"four\"), string> {\n client \"openai/gpt-4o\"\n prompt #\"\n Merge these:\n \n {{i1}}\n \n {{i2}}\n\n {{ ctx.output_format }}\n \"#\n}\n\nfunction InOutSingleLiteralStringMapKey(m: map<\"key\", string>) -> map<\"key\", string> {\n client \"openai/gpt-4o\"\n prompt #\"\n Return the same map you were given:\n \n {{m}}\n\n {{ ctx.output_format }}\n \"#\n}\n", "test-files/functions/output/mutually-recursive-classes.baml": "class Tree {\n data int\n children Forest\n}\n\nclass Forest {\n trees Tree[]\n}\n\nclass BinaryNode {\n data int\n left BinaryNode?\n right BinaryNode?\n}\n\nfunction BuildTree(input: BinaryNode) -> Tree {\n client GPT35\n prompt #\"\n Given the input binary tree, transform it into a generic tree using the given schema.\n\n INPUT:\n {{ input }}\n\n {{ ctx.output_format }} \n \"#\n}\n\ntest TestTree {\n functions [BuildTree]\n args {\n input {\n data 2\n left {\n data 1\n left null\n right null\n }\n right {\n data 3\n left null\n right null\n }\n }\n }\n}", "test-files/functions/output/optional-class.baml": "class ClassOptionalOutput {\n prop1 string\n prop2 string\n}\n\nfunction FnClassOptionalOutput(input: string) -> ClassOptionalOutput? {\n client GPT35\n prompt #\"\n Return a json blob for the following input:\n {{input}}\n\n {{ctx.output_format}}\n\n JSON:\n \"#\n}\n\n\nclass Blah {\n prop4 string?\n}\n\nclass ClassOptionalOutput2 {\n prop1 string?\n prop2 string?\n prop3 Blah?\n}\n\nfunction FnClassOptionalOutput2(input: string) -> ClassOptionalOutput2? {\n client GPT35\n prompt #\"\n Return a json blob for the following input:\n {{input}}\n\n {{ctx.output_format}}\n\n JSON:\n \"#\n}\n\ntest FnClassOptionalOutput2 {\n functions [FnClassOptionalOutput2, FnClassOptionalOutput]\n args {\n input \"example input\"\n }\n}\n", "test-files/functions/output/optional.baml": "class OptionalTest_Prop1 {\n omega_a string\n omega_b int\n}\n\nenum OptionalTest_CategoryType {\n Aleph\n Beta\n Gamma\n}\n \nclass OptionalTest_ReturnType {\n omega_1 OptionalTest_Prop1?\n omega_2 string?\n omega_3 (OptionalTest_CategoryType?)[]\n} \n \nfunction OptionalTest_Function(input: string) -> (OptionalTest_ReturnType?)[]\n{ \n client GPT35\n prompt #\"\n Return a JSON blob with this schema: \n {{ctx.output_format}}\n\n JSON:\n \"#\n}\n\ntest OptionalTest_Function {\n functions [OptionalTest_Function]\n args {\n input \"example input\"\n }\n}\n", diff --git a/integ-tests/typescript/baml_client/sync_client.ts b/integ-tests/typescript/baml_client/sync_client.ts index 6b3c2c470..f57137669 100644 --- a/integ-tests/typescript/baml_client/sync_client.ts +++ b/integ-tests/typescript/baml_client/sync_client.ts @@ -1418,6 +1418,81 @@ export class BamlSyncClient { } } + InOutEnumMapKey( + i1: Partial>,i2: Partial>, + __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } + ): Partial> { + try { + const raw = this.runtime.callFunctionSync( + "InOutEnumMapKey", + { + "i1": i1,"i2": i2 + }, + this.ctx_manager.cloneContext(), + __baml_options__?.tb?.__tb(), + __baml_options__?.clientRegistry, + ) + return raw.parsed() as Partial> + } catch (error: any) { + const bamlError = createBamlValidationError(error); + if (bamlError instanceof BamlValidationError) { + throw bamlError; + } else { + throw error; + } + } + } + + InOutLiteralStringUnionMapKey( + i1: Partial>,i2: Partial>, + __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } + ): Partial> { + try { + const raw = this.runtime.callFunctionSync( + "InOutLiteralStringUnionMapKey", + { + "i1": i1,"i2": i2 + }, + this.ctx_manager.cloneContext(), + __baml_options__?.tb?.__tb(), + __baml_options__?.clientRegistry, + ) + return raw.parsed() as Partial> + } catch (error: any) { + const bamlError = createBamlValidationError(error); + if (bamlError instanceof BamlValidationError) { + throw bamlError; + } else { + throw error; + } + } + } + + InOutSingleLiteralStringMapKey( + m: Partial>, + __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } + ): Partial> { + try { + const raw = this.runtime.callFunctionSync( + "InOutSingleLiteralStringMapKey", + { + "m": m + }, + this.ctx_manager.cloneContext(), + __baml_options__?.tb?.__tb(), + __baml_options__?.clientRegistry, + ) + return raw.parsed() as Partial> + } catch (error: any) { + const bamlError = createBamlValidationError(error); + if (bamlError instanceof BamlValidationError) { + throw bamlError; + } else { + throw error; + } + } + } + LiteralUnionsTest( input: string, __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry } diff --git a/integ-tests/typescript/test-report.html b/integ-tests/typescript/test-report.html index f6b7d12e7..fd505d175 100644 --- a/integ-tests/typescript/test-report.html +++ b/integ-tests/typescript/test-report.html @@ -257,4 +257,2334 @@ font-size: 1rem; padding: 0 0.5rem; } -

Test Report

Started: 2024-11-25 00:28:41
Suites (1)
0 passed
1 failed
0 pending
Tests (0)
0 passed
0 failed
0 pending
\ No newline at end of file +

Test Report

Started: 2024-11-25 16:42:57
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.435s
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.472s
Integ tests > should work for all inputs
single class
passed
0.492s
Integ tests > should work for all inputs
multiple classes
passed
0.419s
Integ tests > should work for all inputs
single enum list
passed
0.379s
Integ tests > should work for all inputs
single float
passed
0.33s
Integ tests > should work for all inputs
single int
passed
0.4s
Integ tests > should work for all inputs
single literal int
passed
0.334s
Integ tests > should work for all inputs
single literal bool
passed
0.427s
Integ tests > should work for all inputs
single literal string
passed
0.377s
Integ tests > should work for all inputs
single class with literal prop
passed
0.947s
Integ tests > should work for all inputs
single class with literal union prop
passed
0.551s
Integ tests > should work for all inputs
single optional string
passed
0.371s
Integ tests > should work for all inputs
single map string to string
passed
0.429s
Integ tests > should work for all inputs
single map string to class
passed
0.808s
Integ tests > should work for all inputs
single map string to map
passed
0.51s
Integ tests > should work for all inputs
enum key in map
passed
0.795s
Integ tests > should work for all inputs
literal string union key in map
passed
0.507s
Integ tests > should work for all inputs
single literal string key in map
passed
0.615s
Integ tests
should work for all outputs
passed
4.625s
Integ tests
works with retries1
passed
1.139s
Integ tests
works with retries2
passed
2.203s
Integ tests
works with fallbacks
passed
1.743s
Integ tests
should work with image from url
passed
2.23s
Integ tests
should work with image from base 64
passed
1.562s
Integ tests
should work with audio base 64
passed
1.054s
Integ tests
should work with audio from url
passed
1.086s
Integ tests
should support streaming in OpenAI
passed
2.135s
Integ tests
should support streaming in Gemini
passed
9.901s
Integ tests
should support AWS
passed
1.69s
Integ tests
should support streaming in AWS
passed
1.619s
Integ tests
should allow overriding the region
passed
0.024s
Integ tests
should support OpenAI shorthand
passed
14.595s
Integ tests
should support OpenAI shorthand streaming
passed
8.963s
Integ tests
should support anthropic shorthand
passed
2.5s
Integ tests
should support anthropic shorthand streaming
passed
2.398s
Integ tests
should support streaming without iterating
passed
1.873s
Integ tests
should support streaming in Claude
passed
1.216s
Integ tests
should support vertex
passed
10.167s
Integ tests
supports tracing sync
passed
0.02s
Integ tests
supports tracing async
passed
3.711s
Integ tests
should work with dynamic types single
passed
1.13s
Integ tests
should work with dynamic types enum
passed
1.201s
Integ tests
should work with dynamic literals
passed
1.021s
Integ tests
should work with dynamic types class
passed
1.343s
Integ tests
should work with dynamic inputs class
passed
0.515s
Integ tests
should work with dynamic inputs list
passed
0.486s
Integ tests
should work with dynamic output map
passed
0.58s
Integ tests
should work with dynamic output union
passed
1.902s
Integ tests
should work with nested classes
failed
9.02s
Error: {"type":"BamlValidationError","prompt":"[\u001b[2mchat\u001b[0m] \u001b[43muser: \u001b[0mReturn a made up json blob that matches this schema:\nAnswer in JSON using this schema:\n{\n  prop1: string,\n  prop2: {\n    prop1: string,\n    prop2: string,\n    inner: {\n      prop2: int,\n      prop3: float,\n    },\n  },\n}\n---\n\nJSON:\n","raw_output":"Sure! Here's a made-up JSON blob that matches the schema you provided:\n```json\n{\n  \"prop1\": \"Hello World!\",\n  \"prop2\": {\n    \"prop1\": \"Foo”,\n    \"prop2\": \"Bar\",\n    \"inner\": {\n      \"prop2\": 42,\n      \"prop3\": 3.14,\n    },\n  },\n}\n```\nExplanation:\n\n* The `prop1` field is a string with the value \"Hello World!\".\n* The `prop2` field is an object with three keys: `prop1`, `prop2`, and `inner`.\n\t+ The `prop1` field within the `prop2` object is a string with the value \"Foo”.\n\t+ The `prop2` field within the `prop2` object is a string with the value \"Bar\".\n\t+ The `inner` field within the `prop2` object is an object with two keys: `prop2` and `prop3`.\n\t\t- The `prop2` field within the `inner` object is an integer with the value 42.\n\t\t- The `prop3` field within the `inner` object is a floating-point number with the value 3.14.\n\nI hope this helps! Let me know if you have any questions or need further assistance.","message":"BamlValidationError: Failed to parse LLM response: Failed to coerce value: <root>: Failed to find any TestClassNested in 3 items\n  - <root>: Failed while parsing required fields: missing=0, unparsed=1\n    - <root>: Failed to parse field prop2: prop2: Failed while parsing required fields: missing=1, unparsed=0\n      - prop2: Missing required field: prop2\n      - prop2: Failed while parsing required fields: missing=1, unparsed=0\n        - prop2: Missing required field: prop2\n  - <root>: Failed while parsing required fields: missing=2, unparsed=0\n    - <root>: Missing required field: prop1\n    - <root>: Missing required field: prop2\n  - <root>: Failed while parsing required fields: missing=0, unparsed=1\n    - <root>: Failed to parse field prop2: prop2: Failed while parsing required fields: missing=1, unparsed=0\n      - prop2: Missing required field: prop2\n      - prop2: Failed while parsing required fields: missing=1, unparsed=0\n        - prop2: Missing required field: prop2"}
+    at BamlStream.parsed [as getFinalResponse] (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/stream.js:58:39)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:602:19)
Integ tests
should work with dynamic client
passed
0.55s
Integ tests
should work with 'onLogEvent'
passed
1.828s
Integ tests
should work with a sync client
passed
0.797s
Integ tests
should raise an error when appropriate
passed
0.779s
Integ tests
should raise a BAMLValidationError
passed
0.354s
Integ tests
should reset environment variables correctly
passed
1.23s
Integ tests
should use aliases when serializing input objects - classes
passed
0.881s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.947s
Integ tests
should use aliases when serializing input objects - enums
passed
0.523s
Integ tests
should use aliases when serializing input objects - lists
passed
0.401s
Integ tests
constraints: should handle checks in return types
passed
0.671s
Integ tests
constraints: should handle checks in returned unions
passed
3.124s
Integ tests
constraints: should handle block-level checks
passed
0.52s
Integ tests
constraints: should handle nested-block-level checks
passed
0.526s
Integ tests
simple recursive type
passed
8.24s
Integ tests
mutually recursive type
failed
1.903s
Error: expect(received).toEqual(expected) // deep equality
+
+- Expected  - 6
++ Received  + 5
+
+@@ -4,30 +4,29 @@
+        Object {
+          "children": Object {
+            "trees": Array [
+              Object {
+                "children": Object {
+-                 "trees": Array [
++                 "trees": Array [],
++               },
++               "data": 1,
++             },
+              Object {
+                "children": Object {
+                  "trees": Array [],
+                },
+                "data": 2,
+              },
+            ],
+          },
+-               "data": 1,
++         "data": 3,
+        },
+        Object {
+          "children": Object {
+            "trees": Array [],
+          },
+          "data": 4,
+-             },
+-           ],
+-         },
+-         "data": 3,
+        },
+        Object {
+          "children": Object {
+            "trees": Array [
+              Object {
+    at Object.toEqual (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:838:17)
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:48:15)
+    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
+    at new Promise (<anonymous>)
+    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
+    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
+    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
+    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
calling with class
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:54:15)
got response key, true, 52
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:194:15)
Expected error Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "RetryClientConstant", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1732581794, tv_nsec: 12578000 }, latency: 272.346375ms, 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: "user", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1732581796, tv_nsec: 310300000 }, latency: 197.029625ms, 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 /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: { eye_color: 'blue', facial_hair: 'beard' }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:564:13)
+    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
+    at new Promise (<anonymous>)
+    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
+    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
+    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
+    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
[
+  [
+    'hair_color',
+    ClassPropertyBuilder { bldr: ClassPropertyBuilder {} }
+  ],
+  [
+    'attributes',
+    ClassPropertyBuilder { bldr: ClassPropertyBuilder {} }
+  ],
+  [ 'height', ClassPropertyBuilder { bldr: ClassPropertyBuilder {} } ]
+]
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:566:15)
+    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
+    at new Promise (<anonymous>)
+    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
+    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
+    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
+    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
Property: hair_color
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:566:15)
+    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
+    at new Promise (<anonymous>)
+    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
+    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
+    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
+    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
Property: attributes
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:566:15)
+    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
+    at new Promise (<anonymous>)
+    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
+    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
+    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
+    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
Property: height
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:574:13)
final  {
+  hair_color: 'black',
+  attributes: { eye_color: 'blue', facial_hair: 'beard', 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: 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 World', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello World!', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello World!', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello World!', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello World!', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello World!', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello World!', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello World!', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'Hello World!', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  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 World!',
+  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 World!',
+  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 World!',
+  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 World!',
+  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 World!',
+  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 World!',
+  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 World!',
+  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 World!',
+  prop2: { prop1: 'Foo', 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 World!',
+  prop2: { prop1: 'Foo”,', 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 World!',
+  prop2: { prop1: 'Foo”,', 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 World!',
+  prop2: { prop1: 'Foo”,', 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 World!',
+  prop2: { prop1: 'Foo”,\n    ', 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 World!',
+  prop2: { prop1: 'Foo”,\n    "prop', 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 World!',
+  prop2: { prop1: 'Foo”,\n    "prop2', 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 World!',
+  prop2: { prop1: 'Foo”,\n    "prop2":', 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 World!',
+  prop2: { prop1: 'Foo”,\n    "prop2": ', 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 World!',
+  prop2: { prop1: 'Foo”,\n    "prop2": "Bar', 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 World!',
+  prop2: { prop1: 'Foo”,\n    "prop2": "Bar', 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 World!',
+  prop2: { prop1: 'Foo”,\n    "prop2": "Bar', 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 World!',
+  prop2: { prop1: 'Foo”,\n    "prop2": "Bar', 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 World!',
+  prop2: { prop1: 'Foo”,\n    "prop2": "Bar', 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 World!',
+  prop2: { prop1: 'Foo”,\n    "prop2": "Bar', 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 World!',
+  prop2: { prop1: 'Foo”,\n    "prop2": "Bar', 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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    inner: { prop2: 42, prop3: 3.14 }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'Hello World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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 World!',
+  prop2: {
+    prop1: 'Foo”,\n    "prop2": "Bar',
+    prop2: null,
+    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: '4965c78f-09d8-436d-931d-305945add5d4',
+    rootEventId: '4965c78f-09d8-436d-931d-305945add5d4'
+  },
+  prompt: '[\n' +
+    '  {\n' +
+    '    "role": "user",\n' +
+    '    "content": [\n' +
+    '      {\n' +
+    '        "text": "Return this value back to me: [\\"a\\", \\"b\\", \\"c\\"]"\n' +
+    '      }\n' +
+    '    ]\n' +
+    '  }\n' +
+    ']',
+  rawOutput: '["a", "b", "c"]',
+  parsedOutput: '["a", "b", "c"]',
+  startTime: '2024-11-26T00:44:43.387Z'
+}
    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: 'c0cee060-530e-43dc-84c0-be5077be71ca',
+    rootEventId: 'c0cee060-530e-43dc-84c0-be5077be71ca'
+  },
+  prompt: '[\n' +
+    '  {\n' +
+    '    "role": "user",\n' +
+    '    "content": [\n' +
+    '      {\n' +
+    '        "text": "Return this value back to me: [\\"d\\", \\"e\\", \\"f\\"]"\n' +
+    '      }\n' +
+    '    ]\n' +
+    '  }\n' +
+    ']',
+  rawOutput: '["d", "e", "f"]',
+  parsedOutput: '["d", "e", "f"]',
+  startTime: '2024-11-26T00:44:43.813Z'
+}
    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: "user", 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: 1732581885, tv_nsec: 564378000 }, latency: 158.524416ms, 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:33:28)
+    at from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:58:32)
+    at BamlAsyncClient.DummyOutputFunction (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts: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[43muser: \x1B[0mSay "hello there".\n',
+  raw_output: 'Hello there!'
+}
    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:33:28)
+    at from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:58:32)
+    at BamlAsyncClient.DummyOutputFunction (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts: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[43muser: \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