From b0baed1b054cb746826beacd8d0df4a0d10c772e Mon Sep 17 00:00:00 2001 From: David Tam Date: Thu, 19 Sep 2024 16:37:21 -0700 Subject: [PATCH 01/71] reapply litellm updates to support only messages llm kwarg --- guardrails/actions/reask.py | 2 +- guardrails/async_guard.py | 120 ++--- .../execution/guard_execution_options.py | 5 - guardrails/classes/history/call.py | 82 +--- guardrails/classes/history/call_inputs.py | 14 +- guardrails/classes/history/inputs.py | 58 +-- guardrails/classes/history/iteration.py | 66 +-- guardrails/formatters/json_formatter.py | 12 +- guardrails/guard.py | 197 ++------ guardrails/llm_providers.py | 464 +----------------- guardrails/run/async_runner.py | 222 ++------- guardrails/run/async_stream_runner.py | 39 +- guardrails/run/runner.py | 267 +++------- guardrails/run/stream_runner.py | 44 +- guardrails/run/utils.py | 20 +- guardrails/schema/rail_schema.py | 48 -- guardrails/telemetry/guard_tracing.py | 2 +- 17 files changed, 259 insertions(+), 1403 deletions(-) diff --git a/guardrails/actions/reask.py b/guardrails/actions/reask.py index 2ca1f711b..04ef70643 100644 --- a/guardrails/actions/reask.py +++ b/guardrails/actions/reask.py @@ -499,7 +499,7 @@ def get_reask_setup( use_full_schema: Optional[bool] = False, prompt_params: Optional[Dict[str, Any]] = None, exec_options: Optional[GuardExecutionOptions] = None, -) -> Tuple[Dict[str, Any], Prompt, Instructions]: +) -> Tuple[Dict[str, Any], Messages]: prompt_params = prompt_params or {} exec_options = exec_options or GuardExecutionOptions() diff --git a/guardrails/async_guard.py b/guardrails/async_guard.py index e3f7ce658..e7369ae17 100644 --- a/guardrails/async_guard.py +++ b/guardrails/async_guard.py @@ -92,11 +92,8 @@ def from_pydantic( cls, output_class: ModelOrListOfModels, *, - prompt: Optional[str] = None, - instructions: Optional[str] = None, + messages: Optional[List[Dict]] = None, num_reasks: Optional[int] = None, - reask_prompt: Optional[str] = None, - reask_instructions: Optional[str] = None, reask_messages: Optional[List[Dict]] = None, tracer: Optional[Tracer] = None, name: Optional[str] = None, @@ -104,11 +101,8 @@ def from_pydantic( ): guard = super().from_pydantic( output_class, - prompt=prompt, - instructions=instructions, num_reasks=num_reasks, - reask_prompt=reask_prompt, - reask_instructions=reask_instructions, + messages=messages, reask_messages=reask_messages, tracer=tracer, name=name, @@ -125,10 +119,8 @@ def from_string( validators: Sequence[Validator], *, string_description: Optional[str] = None, - prompt: Optional[str] = None, - instructions: Optional[str] = None, - reask_prompt: Optional[str] = None, - reask_instructions: Optional[str] = None, + messages: Optional[List[Dict]] = None, + reask_messages: Optional[List[Dict]] = None, num_reasks: Optional[int] = None, tracer: Optional[Tracer] = None, name: Optional[str] = None, @@ -137,10 +129,8 @@ def from_string( guard = super().from_string( validators, string_description=string_description, - prompt=prompt, - instructions=instructions, - reask_prompt=reask_prompt, - reask_instructions=reask_instructions, + messages=messages, + reask_messages=reask_messages, num_reasks=num_reasks, tracer=tracer, name=name, @@ -178,9 +168,7 @@ async def _execute( llm_output: Optional[str] = None, prompt_params: Optional[Dict] = None, num_reasks: Optional[int] = None, - prompt: Optional[str] = None, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, metadata: Optional[Dict], full_schema_reask: Optional[bool] = None, **kwargs, @@ -192,10 +180,8 @@ async def _execute( self._fill_validator_map() self._fill_validators() metadata = metadata or {} - if not llm_output and llm_api and not (prompt or msg_history): - raise RuntimeError( - "'prompt' or 'msg_history' must be provided in order to call an LLM!" - ) + if not llm_output and llm_api and not (messages): + raise RuntimeError("'messages' must be provided in order to call an LLM!") # check if validator requirements are fulfilled missing_keys = verify_metadata_requirements(metadata, self._validators) if missing_keys: @@ -210,9 +196,7 @@ async def __exec( llm_output: Optional[str] = None, prompt_params: Optional[Dict] = None, num_reasks: Optional[int] = None, - prompt: Optional[str] = None, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, metadata: Optional[Dict] = None, full_schema_reask: Optional[bool] = None, **kwargs, @@ -245,14 +229,6 @@ async def __exec( ("guard_id", self.id), ("user_id", self._user_id), ("llm_api", llm_api_str), - ( - "custom_reask_prompt", - self._exec_opts.reask_prompt is not None, - ), - ( - "custom_reask_instructions", - self._exec_opts.reask_instructions is not None, - ), ( "custom_reask_messages", self._exec_opts.reask_messages is not None, @@ -273,13 +249,10 @@ async def __exec( "This should never happen." ) - input_prompt = prompt or self._exec_opts.prompt - input_instructions = instructions or self._exec_opts.instructions + messages = messages or self._exec_opts.messages call_inputs = CallInputs( llm_api=llm_api, - prompt=input_prompt, - instructions=input_instructions, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, num_reasks=self._num_reasks, metadata=metadata, @@ -298,9 +271,7 @@ async def __exec( prompt_params=prompt_params, metadata=metadata, full_schema_reask=full_schema_reask, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, *args, **kwargs, ) @@ -315,9 +286,7 @@ async def __exec( llm_output=llm_output, prompt_params=prompt_params, num_reasks=self._num_reasks, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, metadata=metadata, full_schema_reask=full_schema_reask, call_log=call_log, @@ -343,9 +312,7 @@ async def __exec( llm_output=llm_output, prompt_params=prompt_params, num_reasks=num_reasks, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, metadata=metadata, full_schema_reask=full_schema_reask, *args, @@ -362,9 +329,7 @@ async def _exec( num_reasks: int = 0, # Should be defined at this point metadata: Dict, # Should be defined at this point full_schema_reask: bool = False, # Should be defined at this point - prompt: Optional[str], - instructions: Optional[str], - msg_history: Optional[List[Dict]], + messages: Optional[List[Dict]], **kwargs, ) -> Union[ ValidationOutcome[OT], @@ -377,9 +342,7 @@ async def _exec( llm_api: The LLM API to call asynchronously (e.g. openai.Completion.acreate) prompt_params: The parameters to pass to the prompt.format() method. num_reasks: The max times to re-ask the LLM for invalid output. - prompt: The prompt to use for the LLM. - instructions: Instructions for chat models. - msg_history: The message history to pass to the LLM. + messages: The message history to pass to the LLM. metadata: Metadata to pass to the validators. full_schema_reask: When reasking, whether to regenerate the full schema or just the incorrect values. @@ -396,9 +359,7 @@ async def _exec( output_schema=self.output_schema.to_dict(), num_reasks=num_reasks, validation_map=self._validator_map, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, api=api, metadata=metadata, output=llm_output, @@ -418,9 +379,7 @@ async def _exec( output_schema=self.output_schema.to_dict(), num_reasks=num_reasks, validation_map=self._validator_map, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, api=api, metadata=metadata, output=llm_output, @@ -441,9 +400,7 @@ async def __call__( *args, prompt_params: Optional[Dict] = None, num_reasks: Optional[int] = 1, - prompt: Optional[str] = None, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, metadata: Optional[Dict] = None, full_schema_reask: Optional[bool] = None, **kwargs, @@ -460,9 +417,7 @@ async def __call__( (e.g. openai.completions.create or openai.chat.completions.create) prompt_params: The parameters to pass to the prompt.format() method. num_reasks: The max times to re-ask the LLM for invalid output. - prompt: The prompt to use for the LLM. - instructions: Instructions for chat models. - msg_history: The message history to pass to the LLM. + messages: The message history to pass to the LLM. metadata: Metadata to pass to the validators. full_schema_reask: When reasking, whether to regenerate the full schema or just the incorrect values. @@ -473,16 +428,13 @@ async def __call__( The raw text output from the LLM and the validated output. """ - instructions = instructions or self._exec_opts.instructions - prompt = prompt or self._exec_opts.prompt - msg_history = msg_history or kwargs.pop("messages", None) or [] + messages = messages or kwargs.pop("messages", None) or [] - if prompt is None: - if msg_history is not None and not len(msg_history): - raise RuntimeError( - "You must provide a prompt if msg_history is empty. " - "Alternatively, you can provide a prompt in the Schema constructor." - ) + if messages is not None and not len(messages): + raise RuntimeError( + "You must provide a prompt if messages is empty. " + "Alternatively, you can provide a prompt in the Schema constructor." + ) return await trace_async_guard_execution( self.name, @@ -493,9 +445,7 @@ async def __call__( llm_api=llm_api, prompt_params=prompt_params, num_reasks=num_reasks, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, metadata=metadata, full_schema_reask=full_schema_reask, **kwargs, @@ -538,14 +488,8 @@ async def parse( if llm_api is None else 1 ) - default_prompt = self._exec_opts.prompt if llm_api is not None else None - prompt = kwargs.pop("prompt", default_prompt) - - default_instructions = self._exec_opts.instructions if llm_api else None - instructions = kwargs.pop("instructions", default_instructions) - - default_msg_history = self._exec_opts.msg_history if llm_api else None - msg_history = kwargs.pop("msg_history", default_msg_history) + default_messages = self._exec_opts.messages if llm_api else None + messages = kwargs.pop("messages", default_messages) return await trace_async_guard_execution( # type: ignore self.name, @@ -557,9 +501,7 @@ async def parse( llm_api=llm_api, prompt_params=prompt_params, num_reasks=final_num_reasks, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, metadata=metadata, full_schema_reask=full_schema_reask, **kwargs, diff --git a/guardrails/classes/execution/guard_execution_options.py b/guardrails/classes/execution/guard_execution_options.py index 1230cf7d8..cabdddbcf 100644 --- a/guardrails/classes/execution/guard_execution_options.py +++ b/guardrails/classes/execution/guard_execution_options.py @@ -4,11 +4,6 @@ @dataclass class GuardExecutionOptions: - prompt: Optional[str] = None - instructions: Optional[str] = None - msg_history: Optional[List[Dict]] = None messages: Optional[List[Dict]] = None - reask_prompt: Optional[str] = None - reask_instructions: Optional[str] = None reask_messages: Optional[List[Dict]] = None num_reasks: Optional[int] = None diff --git a/guardrails/classes/history/call.py b/guardrails/classes/history/call.py index cf79a6e2f..08175edc3 100644 --- a/guardrails/classes/history/call.py +++ b/guardrails/classes/history/call.py @@ -15,8 +15,6 @@ from guardrails.classes.generic.arbitrary_model import ArbitraryModel from guardrails.classes.validation.validation_result import ValidationResult from guardrails.constants import error_status, fail_status, not_run_status, pass_status -from guardrails.prompt.instructions import Instructions -from guardrails.prompt.prompt import Prompt from guardrails.prompt.messages import Messages from guardrails.classes.validation.validator_logs import ValidatorLogs from guardrails.actions.reask import ( @@ -72,12 +70,6 @@ def __init__( self.inputs = inputs self.exception = exception - @property - def prompt(self) -> Optional[str]: - """The prompt as provided by the user when initializing or calling the - Guard.""" - return self.inputs.prompt - @property def prompt_params(self) -> Optional[Dict]: """The prompt parameters as provided by the user when initializing or @@ -85,53 +77,25 @@ def prompt_params(self) -> Optional[Dict]: return self.inputs.prompt_params @property - def compiled_prompt(self) -> Optional[str]: - """The initial compiled prompt that was passed to the LLM on the first - call.""" - if self.iterations.empty(): - return None - initial_inputs = self.iterations.first.inputs # type: ignore - prompt: Prompt = initial_inputs.prompt # type: ignore - prompt_params = initial_inputs.prompt_params or {} - if initial_inputs.prompt is not None: - return prompt.format(**prompt_params).source - - @property - def reask_prompts(self) -> Stack[Optional[str]]: - """The compiled prompts used during reasks. - - Does not include the initial prompt. - """ - if self.iterations.length > 0: - reasks = self.iterations.copy() - initial_prompt = reasks.first - reasks.remove(initial_prompt) # type: ignore - return Stack( - *[ - r.inputs.prompt.source if r.inputs.prompt is not None else None - for r in reasks - ] - ) - - return Stack() - - @property - def instructions(self) -> Optional[str]: - """The instructions as provided by the user when initializing or - calling the Guard.""" - return self.inputs.instructions + def messages(self) -> Optional[Messages]: + """The messages as provided by the user when initializing or calling the + Guard.""" + return self.inputs.messages @property - def compiled_instructions(self) -> Optional[str]: - """The initial compiled instructions that were passed to the LLM on the + def compiled_messages(self) -> Optional[str]: + """The initial compiled messages that were passed to the LLM on the first call.""" if self.iterations.empty(): return None - initial_inputs = self.iterations.first.inputs # type: ignore - instructions: Instructions = initial_inputs.instructions # type: ignore + initial_inputs = self.iterations.first.inputs + messages: Messages = initial_inputs.messages prompt_params = initial_inputs.prompt_params or {} - if instructions is not None: - return instructions.format(**prompt_params).source + compiled_messages = [] + for message in messages: + compiled_messages.append(message.format(**prompt_params).source) + + return compiled_messages @property def reask_messages(self) -> Stack[Messages]: @@ -152,26 +116,6 @@ def reask_messages(self) -> Stack[Messages]: return Stack() - @property - def reask_instructions(self) -> Stack[str]: - """The compiled instructions used during reasks. - - Does not include the initial instructions. - """ - if self.iterations.length > 0: - reasks = self.iterations.copy() - reasks.remove(reasks.first) # type: ignore - return Stack( - *[ - r.inputs.instructions.source - if r.inputs.instructions is not None - else None - for r in reasks - ] - ) - - return Stack() - @property def logs(self) -> Stack[str]: """Returns all logs from all iterations as a stack.""" diff --git a/guardrails/classes/history/call_inputs.py b/guardrails/classes/history/call_inputs.py index 4aa2363f8..0803e42b8 100644 --- a/guardrails/classes/history/call_inputs.py +++ b/guardrails/classes/history/call_inputs.py @@ -15,8 +15,7 @@ class CallInputs(Inputs, ICallInputs, ArbitraryModel): Attributes: llm_api (Optional[Callable[[Any], Awaitable[Any]]]): The LLM function provided by the user during Guard.__call__ or Guard.parse. - prompt (Optional[str]): The prompt string as provided by the user. - instructions (Optional[str]): The instructions string as provided by the user. + messages (Optional[dict[str, str]]): The messages as provided by the user. args (List[Any]): Additional arguments for the LLM as provided by the user. Default []. kwargs (Dict[str, Any]): Additional keyword-arguments for @@ -28,11 +27,8 @@ class CallInputs(Inputs, ICallInputs, ArbitraryModel): "during Guard.__call__ or Guard.parse.", default=None, ) - prompt: Optional[str] = Field( - description="The prompt string as provided by the user.", default=None - ) - instructions: Optional[str] = Field( - description="The instructions string as provided by the user.", default=None + messages: Optional[dict[str, str]] = Field( + description="The messages as provided by the user.", default=None ) args: List[Any] = Field( description="Additional arguments for the LLM as provided by the user.", @@ -67,9 +63,7 @@ def from_interface(cls, i_call_inputs: ICallInputs) -> "CallInputs": return cls( llm_api=None, llm_output=i_call_inputs.llm_output, - instructions=i_call_inputs.instructions, - prompt=i_call_inputs.prompt, - msg_history=i_call_inputs.msg_history, + messages=i_call_inputs.messages, prompt_params=i_call_inputs.prompt_params, num_reasks=i_call_inputs.num_reasks, metadata=i_call_inputs.metadata, diff --git a/guardrails/classes/history/inputs.py b/guardrails/classes/history/inputs.py index e5ffdad02..fb7c87b0b 100644 --- a/guardrails/classes/history/inputs.py +++ b/guardrails/classes/history/inputs.py @@ -5,7 +5,6 @@ from guardrails_api_client import Inputs as IInputs from guardrails.classes.generic.arbitrary_model import ArbitraryModel from guardrails.classes.llm.prompt_callable import PromptCallableBase -from guardrails.prompt.instructions import Instructions from guardrails.prompt.prompt import Prompt from guardrails.prompt.messages import Messages @@ -18,10 +17,7 @@ class Inputs(IInputs, ArbitraryModel): for calling the LLM. llm_output (Optional[str]): The string output from an external LLM call provided by the user via Guard.parse. - instructions (Optional[Instructions]): The constructed - Instructions class for chat model calls. - prompt (Optional[Prompt]): The constructed Prompt class. - msg_history (Optional[List[Dict]]): The message history + messages (Optional[List[Dict]]): The message history provided by the user for chat model calls. prompt_params (Optional[Dict]): The parameters provided by the user that will be formatted into the final LLM prompt. @@ -42,17 +38,6 @@ class Inputs(IInputs, ArbitraryModel): "provided by the user via Guard.parse.", default=None, ) - instructions: Optional[Instructions] = Field( - description="The constructed Instructions class for chat model calls.", - default=None, - ) - prompt: Optional[Prompt] = Field( - description="The constructed Prompt class.", default=None - ) - msg_history: Optional[List[Dict]] = Field( - description="The message history provided by the user for chat model calls.", - default=None, - ) messages: Optional[List[Messages]] = Field( description="The message history provided by the user for chat model calls.", default=None, @@ -81,32 +66,22 @@ class Inputs(IInputs, ArbitraryModel): ) def to_interface(self) -> IInputs: - serialized_msg_history = None - if self.msg_history: - serialized_msg_history = [] - for msg in self.msg_history: + serialized_messages = None + if self.messages: + serialized_messages = [] + for msg in self.messages: ser_msg = {**msg} content = ser_msg.get("content") if content: ser_msg["content"] = ( content.source if isinstance(content, Prompt) else content ) - serialized_msg_history.append(ser_msg) - - instructions = ( - self.instructions.source - if isinstance(self.instructions, Instructions) - else self.instructions - ) - - prompt = self.prompt.source if isinstance(self.prompt, Prompt) else self.prompt + serialized_messages.append(ser_msg) return IInputs( llm_api=str(self.llm_api) if self.llm_api else None, # type: ignore - pyright doesn't understand aliases llm_output=self.llm_output, # type: ignore - pyright doesn't understand aliases - instructions=instructions, - prompt=prompt, - msg_history=serialized_msg_history, # type: ignore - pyright doesn't understand aliases + messages=serialized_messages, # type: ignore - pyright doesn't understand aliases prompt_params=self.prompt_params, # type: ignore - pyright doesn't understand aliases num_reasks=self.num_reasks, # type: ignore - pyright doesn't understand aliases metadata=self.metadata, @@ -119,30 +94,23 @@ def to_dict(self) -> Dict[str, Any]: @classmethod def from_interface(cls, i_inputs: IInputs) -> "Inputs": - deserialized_msg_history = None - if i_inputs.msg_history: - deserialized_msg_history = [] - for msg in i_inputs.msg_history: + deserialized_messages = None + if i_inputs.messages: + deserialized_messages = [] + for msg in i_inputs.messages: ser_msg = {**msg} content = ser_msg.get("content") if content: ser_msg["content"] = Prompt(content) - deserialized_msg_history.append(ser_msg) - - instructions = ( - Instructions(i_inputs.instructions) if i_inputs.instructions else None - ) + deserialized_messages.append(ser_msg) - prompt = Prompt(i_inputs.prompt) if i_inputs.prompt else None num_reasks = ( int(i_inputs.num_reasks) if i_inputs.num_reasks is not None else None ) return cls( llm_api=None, llm_output=i_inputs.llm_output, - instructions=instructions, - prompt=prompt, - msg_history=deserialized_msg_history, + messages=deserialized_messages, prompt_params=i_inputs.prompt_params, num_reasks=num_reasks, metadata=i_inputs.metadata, diff --git a/guardrails/classes/history/iteration.py b/guardrails/classes/history/iteration.py index 45c60baab..fcecf8f4c 100644 --- a/guardrails/classes/history/iteration.py +++ b/guardrails/classes/history/iteration.py @@ -188,63 +188,33 @@ def status(self) -> str: @property def rich_group(self) -> Group: - def create_msg_history_table( - msg_history: Optional[List[Dict[str, Prompt]]], + def create_messages_table( + messages: Optional[List[Dict[str, Prompt]]], ) -> Union[str, Table]: - if msg_history is None: - return "No message history." + if messages is None: + return "No messages." table = Table(show_lines=True) table.add_column("Role", justify="right", no_wrap=True) table.add_column("Content") - for msg in msg_history: + for msg in messages: table.add_row(str(msg["role"]), msg["content"].source) return table - table = create_msg_history_table(self.inputs.msg_history) - - if self.inputs.instructions is not None: - return Group( - Panel( - self.inputs.prompt.source if self.inputs.prompt else "No prompt", - title="Prompt", - style="on #F0F8FF", - ), - Panel( - self.inputs.instructions.source, - title="Instructions", - style="on #FFF0F2", - ), - Panel(table, title="Message History", style="on #E7DFEB"), - Panel( - self.raw_output or "", title="Raw LLM Output", style="on #F5F5DC" - ), - Panel( - pretty_repr(self.validation_response), - title="Validated Output", - style="on #F0FFF0", - ), - ) - else: - return Group( - Panel( - self.inputs.prompt.source if self.inputs.prompt else "No prompt", - title="Prompt", - style="on #F0F8FF", - ), - Panel(table, title="Message History", style="on #E7DFEB"), - Panel( - self.raw_output or "", title="Raw LLM Output", style="on #F5F5DC" - ), - Panel( - self.validation_response - if isinstance(self.validation_response, str) - else pretty_repr(self.validation_response), - title="Validated Output", - style="on #F0FFF0", - ), - ) + table = create_messages_table(self.inputs.messages) + + return Group( + Panel(table, title="Messages", style="on #E7DFEB"), + Panel(self.raw_output or "", title="Raw LLM Output", style="on #F5F5DC"), + Panel( + self.validation_response + if isinstance(self.validation_response, str) + else pretty_repr(self.validation_response), + title="Validated Output", + style="on #F0FFF0", + ), + ) def __str__(self) -> str: return pretty_repr(self) diff --git a/guardrails/formatters/json_formatter.py b/guardrails/formatters/json_formatter.py index 491999f91..1c771ae61 100644 --- a/guardrails/formatters/json_formatter.py +++ b/guardrails/formatters/json_formatter.py @@ -101,10 +101,8 @@ def wrap_callable(self, llm_callable) -> ArbitraryCallable: model = llm_callable.init_kwargs["pipeline"] def fn( - prompt: str, *args, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict[str, str]]] = None, + messages: Optional[List[Dict[str, str]]] = None, **kwargs, ) -> str: return json.dumps( @@ -112,7 +110,7 @@ def fn( model=model.model, tokenizer=model.tokenizer, json_schema=self.output_schema, - prompt=prompt, + messages=messages, )() ) @@ -125,10 +123,8 @@ def fn( tokenizer = llm_callable.init_kwargs["tokenizer"] def fn( - prompt: str, *args, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict[str, str]]] = None, + messages: Optional[List[Dict[str, str]]] = None, **kwargs, ) -> str: return json.dumps( @@ -136,7 +132,7 @@ def fn( model=model, tokenizer=tokenizer, json_schema=self.output_schema, - prompt=prompt, + messages=messages, )() ) diff --git a/guardrails/guard.py b/guardrails/guard.py index ac8198e5e..6140211b4 100644 --- a/guardrails/guard.py +++ b/guardrails/guard.py @@ -341,26 +341,17 @@ def _fill_exec_opts( self, *, num_reasks: Optional[int] = None, - prompt: Optional[str] = None, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, - reask_prompt: Optional[str] = None, - reask_instructions: Optional[str] = None, + messages: Optional[List[Dict]] = None, + reask_messages: Optional[List[Dict]] = None, **kwargs, # noqa ): """Backfill execution options from kwargs.""" if num_reasks is not None: self._exec_opts.num_reasks = num_reasks - if prompt is not None: - self._exec_opts.prompt = prompt - if instructions is not None: - self._exec_opts.instructions = instructions - if msg_history is not None: - self._exec_opts.msg_history = msg_history - if reask_prompt is not None: - self._exec_opts.reask_prompt = reask_prompt - if reask_instructions is not None: - self._exec_opts.reask_instructions = reask_instructions + if messages is not None: + self._exec_opts.messages = messages + if reask_messages is not None: + self._exec_opts.reask_messages = reask_messages @classmethod def _from_rail_schema( @@ -496,11 +487,7 @@ def from_pydantic( cls, output_class: ModelOrListOfModels, *, - prompt: Optional[str] = None, - instructions: Optional[str] = None, num_reasks: Optional[int] = None, - reask_prompt: Optional[str] = None, - reask_instructions: Optional[str] = None, reask_messages: Optional[List[Dict]] = None, messages: Optional[List[Dict]] = None, tracer: Optional[Tracer] = None, @@ -514,10 +501,7 @@ def from_pydantic( Args: output_class: (Union[Type[BaseModel], List[Type[BaseModel]]]): The pydantic model that describes the desired structure of the output. - prompt (str, optional): The prompt used to generate the string. Defaults to None. - instructions (str, optional): Instructions for chat models. Defaults to None. - reask_prompt (str, optional): An alternative prompt to use during reasks. Defaults to None. - reask_instructions (str, optional): Alternative instructions to use during reasks. Defaults to None. + messages (List[Dict], optional): A list of messages to give to the llm. Defaults to None. reask_messages (List[Dict], optional): A list of messages to use during reasks. Defaults to None. num_reasks (int, optional): The max times to re-ask the LLM if validation fails. Deprecated tracer (Tracer, optional): An OpenTelemetry tracer to use for metrics and traces. Defaults to None. @@ -537,29 +521,12 @@ def from_pydantic( DeprecationWarning, ) - if reask_instructions: - warnings.warn( - "reask_instructions is deprecated and will be removed in 0.6.x!" - "Please be prepared to set reask_messages instead.", - DeprecationWarning, - ) - if reask_prompt: - warnings.warn( - "reask_prompt is deprecated and will be removed in 0.6.x!" - "Please be prepared to set reask_messages instead.", - DeprecationWarning, - ) - # We have to set the tracer in the ContextStore before the Rail, # and therefore the Validators, are initialized cls._set_tracer(cls, tracer) # type: ignore schema = pydantic_model_to_schema(output_class) exec_opts = GuardExecutionOptions( - prompt=prompt, - instructions=instructions, - reask_prompt=reask_prompt, - reask_instructions=reask_instructions, reask_messages=reask_messages, messages=messages, ) @@ -597,10 +564,6 @@ def from_string( validators: Sequence[Validator], *, string_description: Optional[str] = None, - prompt: Optional[str] = None, - instructions: Optional[str] = None, - reask_prompt: Optional[str] = None, - reask_instructions: Optional[str] = None, reask_messages: Optional[List[Dict]] = None, messages: Optional[List[Dict]] = None, num_reasks: Optional[int] = None, @@ -613,29 +576,13 @@ def from_string( Args: validators: (List[Validator]): The list of validators to apply to the string output. string_description (str, optional): A description for the string to be generated. Defaults to None. - prompt (str, optional): The prompt used to generate the string. Defaults to None. - instructions (str, optional): Instructions for chat models. Defaults to None. - reask_prompt (str, optional): An alternative prompt to use during reasks. Defaults to None. - reask_instructions (str, optional): Alternative instructions to use during reasks. Defaults to None. + messages (List[Dict], optional): A list of messages to pass to llm. Defaults to None. reask_messages (List[Dict], optional): A list of messages to use during reasks. Defaults to None. num_reasks (int, optional): The max times to re-ask the LLM if validation fails. Deprecated tracer (Tracer, optional): An OpenTelemetry tracer to use for metrics and traces. Defaults to None. name (str, optional): A unique name for this Guard. Defaults to `gr-` + the object id. description (str, optional): A description for this Guard. Defaults to None. """ # noqa - if reask_instructions: - warnings.warn( - "reask_instructions is deprecated and will be removed in 0.6.x!" - "Please be prepared to set reask_messages instead.", - DeprecationWarning, - ) - if reask_prompt: - warnings.warn( - "reask_prompt is deprecated and will be removed in 0.6.x!" - "Please be prepared to set reask_messages instead.", - DeprecationWarning, - ) - if num_reasks: warnings.warn( "Setting num_reasks during initialization is deprecated" @@ -654,12 +601,8 @@ def from_string( list(validators), type=SimpleTypes.STRING, description=string_description ) exec_opts = GuardExecutionOptions( - prompt=prompt, - instructions=instructions, - reask_prompt=reask_prompt, - reask_instructions=reask_instructions, - reask_messages=reask_messages, messages=messages, + reask_messages=reask_messages, ) guard = cast( Guard[str], @@ -684,11 +627,8 @@ def _execute( llm_output: Optional[str] = None, prompt_params: Optional[Dict] = None, num_reasks: Optional[int] = None, - prompt: Optional[str] = None, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, - reask_prompt: Optional[str] = None, - reask_instructions: Optional[str] = None, + messages: Optional[List[Dict]] = None, + reask_messages: Optional[List[Dict]] = None, metadata: Optional[Dict], full_schema_reask: Optional[bool] = None, **kwargs, @@ -697,17 +637,12 @@ def _execute( self._fill_validators() self._fill_exec_opts( num_reasks=num_reasks, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, - reask_prompt=reask_prompt, - reask_instructions=reask_instructions, + messages=messages, + reask_messages=reask_messages, ) metadata = metadata or {} - if not llm_output and llm_api and not (prompt or msg_history): - raise RuntimeError( - "'prompt' or 'msg_history' must be provided in order to call an LLM!" - ) + if not llm_output and llm_api and not (messages): + raise RuntimeError("'messages' must be provided in order to call an LLM!") # check if validator requirements are fulfilled missing_keys = verify_metadata_requirements(metadata, self._validators) @@ -723,9 +658,7 @@ def __exec( llm_output: Optional[str] = None, prompt_params: Optional[Dict] = None, num_reasks: Optional[int] = None, - prompt: Optional[str] = None, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, metadata: Optional[Dict] = None, full_schema_reask: Optional[bool] = None, **kwargs, @@ -754,14 +687,6 @@ def __exec( ("guard_id", self.id), ("user_id", self._user_id), ("llm_api", llm_api_str if llm_api_str else "None"), - ( - "custom_reask_prompt", - self._exec_opts.reask_prompt is not None, - ), - ( - "custom_reask_instructions", - self._exec_opts.reask_instructions is not None, - ), ( "custom_reask_messages", self._exec_opts.reask_messages is not None, @@ -783,13 +708,10 @@ def __exec( "This should never happen." ) - input_prompt = prompt or self._exec_opts.prompt - input_instructions = instructions or self._exec_opts.instructions + input_messages = messages or self._exec_opts.messages call_inputs = CallInputs( llm_api=llm_api, - prompt=input_prompt, - instructions=input_instructions, - msg_history=msg_history, + messages=input_messages, prompt_params=prompt_params, num_reasks=self._num_reasks, metadata=metadata, @@ -821,9 +743,7 @@ def __exec( llm_output=llm_output, prompt_params=prompt_params, num_reasks=self._num_reasks, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, metadata=metadata, full_schema_reask=full_schema_reask, call_log=call_log, @@ -846,9 +766,7 @@ def __exec( llm_output=llm_output, prompt_params=prompt_params, num_reasks=num_reasks, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, metadata=metadata, full_schema_reask=full_schema_reask, *args, @@ -865,9 +783,7 @@ def _exec( num_reasks: int = 0, # Should be defined at this point metadata: Dict, # Should be defined at this point full_schema_reask: bool = False, # Should be defined at this point - prompt: Optional[str] = None, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, **kwargs, ) -> Union[ValidationOutcome[OT], Iterable[ValidationOutcome[OT]]]: api = None @@ -887,9 +803,7 @@ def _exec( output_schema=self.output_schema.to_dict(), num_reasks=num_reasks, validation_map=self._validator_map, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, api=api, metadata=metadata, output=llm_output, @@ -906,9 +820,7 @@ def _exec( output_schema=self.output_schema.to_dict(), num_reasks=num_reasks, validation_map=self._validator_map, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, api=api, metadata=metadata, output=llm_output, @@ -926,9 +838,7 @@ def __call__( *args, prompt_params: Optional[Dict] = None, num_reasks: Optional[int] = 1, - prompt: Optional[str] = None, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, metadata: Optional[Dict] = None, full_schema_reask: Optional[bool] = None, **kwargs, @@ -940,9 +850,7 @@ def __call__( (e.g. openai.completions.create or openai.Completion.acreate) prompt_params: The parameters to pass to the prompt.format() method. num_reasks: The max times to re-ask the LLM for invalid output. - prompt: The prompt to use for the LLM. - instructions: Instructions for chat models. - msg_history: The message history to pass to the LLM. + messages: The message history to pass to the LLM. metadata: Metadata to pass to the validators. full_schema_reask: When reasking, whether to regenerate the full schema or just the incorrect values. @@ -952,15 +860,13 @@ def __call__( Returns: ValidationOutcome """ - instructions = instructions or self._exec_opts.instructions - prompt = prompt or self._exec_opts.prompt - msg_history = msg_history or kwargs.get("messages", None) or [] - if prompt is None: - if msg_history is not None and not len(msg_history): - raise RuntimeError( - "You must provide a prompt if msg_history is empty. " - "Alternatively, you can provide a prompt in the Schema constructor." - ) + + messages = messages or [] + if messages is not None and not len(messages): + raise RuntimeError( + "You must provide messages. " + "Alternatively, you can provide a prompt in the Schema constructor." + ) return trace_guard_execution( self.name, self.history, @@ -970,9 +876,7 @@ def __call__( llm_api=llm_api, prompt_params=prompt_params, num_reasks=num_reasks, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, metadata=metadata, full_schema_reask=full_schema_reask, **kwargs, @@ -1013,14 +917,9 @@ def parse( if llm_api is None else 1 ) - default_prompt = self._exec_opts.prompt if llm_api else None - prompt = kwargs.pop("prompt", default_prompt) - default_instructions = self._exec_opts.instructions if llm_api else None - instructions = kwargs.pop("instructions", default_instructions) - - default_msg_history = self._exec_opts.msg_history if llm_api else None - msg_history = kwargs.pop("msg_history", default_msg_history) + default_messages = self._exec_opts.messages if llm_api else None + messages = kwargs.pop("messages", default_messages) return trace_guard_execution( self.name, @@ -1032,9 +931,7 @@ def parse( llm_api=llm_api, prompt_params=prompt_params, num_reasks=final_num_reasks, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, metadata=metadata, full_schema_reask=full_schema_reask, **kwargs, @@ -1056,14 +953,12 @@ def error_spans_in_output(self) -> List[ErrorSpan]: def __add_validator(self, validator: Validator, on: str = "output"): if on not in [ "output", - "prompt", - "instructions", - "msg_history", + "messages", ] and not on.startswith("$"): warnings.warn( f"Unusual 'on' value: {on}!" "This value is typically one of " - "'output', 'prompt', 'instructions', 'msg_history') " + "'output', 'messages') " "or a JSON path starting with '$.'", UserWarning, ) @@ -1099,8 +994,6 @@ def use( ) -> "Guard": """Use a validator to validate either of the following: - The output of an LLM request - - The prompt - - The instructions - The message history Args: @@ -1284,16 +1177,10 @@ def _call_server( if llm_api is not None: payload["llmApi"] = get_llm_api_enum(llm_api, *args, **kwargs) - if not payload.get("prompt"): - payload["prompt"] = self._exec_opts.prompt - if not payload.get("instructions"): - payload["instructions"] = self._exec_opts.instructions - if not payload.get("msg_history"): - payload["msg_history"] = self._exec_opts.msg_history - if not payload.get("reask_prompt"): - payload["reask_prompt"] = self._exec_opts.reask_prompt - if not payload.get("reask_instructions"): - payload["reask_instructions"] = self._exec_opts.reask_instructions + if not payload.get("messages"): + payload["messages"] = self._exec_opts.messages + if not payload.get("reask_messages"): + payload["reask_messages"] = self._exec_opts.reask_messages should_stream = kwargs.get("stream", False) if should_stream: diff --git a/guardrails/llm_providers.py b/guardrails/llm_providers.py index b48bf031f..4b4096b1d 100644 --- a/guardrails/llm_providers.py +++ b/guardrails/llm_providers.py @@ -9,7 +9,6 @@ Iterable, List, Optional, - Type, Union, cast, ) @@ -17,7 +16,6 @@ import warnings from guardrails_api_client.models import LLMResource -from pydantic import BaseModel from guardrails.errors import UserFacingException from guardrails.classes.llm.llm_response import LLMResponse @@ -25,15 +23,7 @@ PromptCallableBase, PromptCallableException, ) -from guardrails.utils.openai_utils import ( - AsyncOpenAIClient, - OpenAIClient, - is_static_openai_acreate_func, - is_static_openai_chat_acreate_func, - is_static_openai_chat_create_func, - is_static_openai_create_func, -) -from guardrails.utils.pydantic_utils import convert_pydantic_model_to_openai_fn + from guardrails.utils.safe_get import safe_get from guardrails.telemetry import trace_llm_call, trace_operation @@ -91,128 +81,6 @@ def litellm_messages( return [{"role": "user", "content": prompt}] -class OpenAIModel(PromptCallableBase): - pass - - -class OpenAICallable(OpenAIModel): - def _invoke_llm( - self, - text: str, - engine: str = "text-davinci-003", - instructions: Optional[str] = None, - *args, - **kwargs, - ) -> LLMResponse: - warnings.warn( - "This callable is deprecated in favor of passing " - "no callable and the model argument which utilizes LiteLLM" - "for example guard(model='gpt-4.o', messages=[...], ...)", - DeprecationWarning, - ) - if "api_key" in kwargs: - api_key = kwargs.pop("api_key") - else: - api_key = None - - if "model" in kwargs: - engine = kwargs.pop("model") - - client = OpenAIClient(api_key=api_key) - trace_llm_call( - input_messages=[ - {"role": "system", "content": instructions}, - {"role": "user", "content": text}, - ], - model_name=engine, - ) - return client.create_completion( - engine=engine, - prompt=nonchat_prompt(prompt=text, instructions=instructions), - *args, - **kwargs, - ) - - -class OpenAIChatCallable(OpenAIModel): - supports_base_model = True - - def _invoke_llm( - self, - text: Optional[str] = None, - model: str = "gpt-3.5-turbo", - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, - base_model: Optional[ - Union[Type[BaseModel], Type[List[Type[BaseModel]]]] - ] = None, - function_call: Optional[Any] = None, - *args, - **kwargs, - ) -> LLMResponse: - """Wrapper for OpenAI chat engines. - - Use Guardrails with OpenAI chat engines by doing - ``` - raw_llm_response, validated_response, *rest = guard( - openai.chat.completions.create, - prompt_params={...}, - text=..., - instructions=..., - msg_history=..., - temperature=..., - ... - ) - ``` - - If `base_model` is passed, the chat engine will be used as a function - on the base model. - """ - warnings.warn( - "This callable is deprecated in favor of passing " - "no callable and the model argument which utilizes LiteLLM" - "for example guard(model='gpt-4.o', messages=[...], ...)", - DeprecationWarning, - ) - if msg_history is None and text is None: - raise PromptCallableException( - "You must pass in either `text` or `msg_history` to `guard.__call__`." - ) - - # TODO: Update this to tools - # Configure function calling if applicable (only for non-streaming) - fn_kwargs = {} - if ( - base_model - and not kwargs.get("stream", False) - and not kwargs.get("tools", False) - ): - function_params = convert_pydantic_model_to_openai_fn(base_model) - if function_call is None and function_params: - function_call = {"name": function_params["name"]} - fn_kwargs = { - "functions": [function_params], - "function_call": function_call, - } - - # Call OpenAI - if "api_key" in kwargs: - api_key = kwargs.pop("api_key") - else: - api_key = None - - client = OpenAIClient(api_key=api_key) - return client.create_chat_completion( - model=model, - messages=chat_prompt( - prompt=text, instructions=instructions, msg_history=msg_history - ), - *args, - **fn_kwargs, - **kwargs, - ) - - class ManifestCallable(PromptCallableBase): def _invoke_llm( self, @@ -270,170 +138,6 @@ def _invoke_llm( ) -class CohereCallable(PromptCallableBase): - def _invoke_llm( - self, prompt: str, client_callable: Any, model: str, *args, **kwargs - ) -> LLMResponse: - """To use cohere for guardrails, do ``` client = - cohere.Client(api_key=...) - - raw_llm_response, validated_response, *rest = guard( - client.generate, - prompt_params={...}, - model="command-nightly", - ... - ) - ``` - """ # noqa - warnings.warn( - "This callable is deprecated in favor of passing " - "no callable and the model argument which utilizes LiteLLM" - "for example guard(model='command-r', messages=[...], ...)", - DeprecationWarning, - ) - - trace_input_messages = chat_prompt(prompt, kwargs.get("instructions")) - if "instructions" in kwargs: - prompt = kwargs.pop("instructions") + "\n\n" + prompt - - def is_base_cohere_chat(func): - try: - return ( - func.__closure__[1].cell_contents.__func__.__qualname__ - == "BaseCohere.chat" - ) - except (AttributeError, IndexError): - return False - - # TODO: When cohere totally gets rid of `generate`, - # remove this cond and the final return - if is_base_cohere_chat(client_callable): - trace_operation( - input_mime_type="application/json", - input_value={**kwargs, "message": prompt, "args": args, "model": model}, - ) - - trace_llm_call( - input_messages=trace_input_messages, - invocation_parameters={**kwargs, "message": prompt, "model": model}, - ) - cohere_response = client_callable( - message=prompt, model=model, *args, **kwargs - ) - trace_operation( - output_mime_type="application/json", output_value=cohere_response - ) - trace_llm_call( - output_messages=[{"role": "assistant", "content": cohere_response.text}] - ) - return LLMResponse( - output=cohere_response.text, - ) - - trace_operation( - input_mime_type="application/json", - input_value={**kwargs, "prompt": prompt, "args": args, "model": model}, - ) - - trace_llm_call( - input_messages=trace_input_messages, - invocation_parameters={**kwargs, "prompt": prompt, "model": model}, - ) - cohere_response = client_callable(prompt=prompt, model=model, *args, **kwargs) - trace_operation( - output_mime_type="application/json", output_value=cohere_response - ) - trace_llm_call( - output_messages=[{"role": "assistant", "content": cohere_response[0].text}] - ) - return LLMResponse( - output=cohere_response[0].text, - ) - - -class AnthropicCallable(PromptCallableBase): - def _invoke_llm( - self, - prompt: str, - client_callable: Any, - model: str = "claude-instant-1", - max_tokens_to_sample: int = 100, - *args, - **kwargs, - ) -> LLMResponse: - """Wrapper for Anthropic Completions. - - To use Anthropic for guardrails, do - ``` - client = anthropic.Anthropic(api_key=...) - - raw_llm_response, validated_response = guard( - client, - model="claude-2", - max_tokens_to_sample=200, - prompt_params={...}, - ... - ``` - """ - warnings.warn( - "This callable is deprecated in favor of passing " - "no callable and the model argument which utilizes LiteLLM" - "for example guard(model='claude-3-opus-20240229', messages=[...], ...)", - DeprecationWarning, - ) - try: - import anthropic - except ImportError: - raise PromptCallableException( - "The `anthropic` package is not installed. " - "Install with `pip install anthropic`" - ) - - trace_input_messages = chat_prompt(prompt, kwargs.get("instructions")) - if "instructions" in kwargs: - prompt = kwargs.pop("instructions") + "\n\n" + prompt - - anthropic_prompt = f"{anthropic.HUMAN_PROMPT} {prompt} {anthropic.AI_PROMPT}" - - trace_operation( - input_mime_type="application/json", - input_value={ - **kwargs, - "model": model, - "prompt": anthropic_prompt, - "max_tokens_to_sample": max_tokens_to_sample, - "args": args, - }, - ) - - trace_llm_call( - input_messages=trace_input_messages, - invocation_parameters={ - **kwargs, - "model": model, - "prompt": anthropic_prompt, - "max_tokens_to_sample": max_tokens_to_sample, - }, - ) - - anthropic_response = client_callable( - model=model, - prompt=anthropic_prompt, - max_tokens_to_sample=max_tokens_to_sample, - *args, - **kwargs, - ) - trace_operation( - output_mime_type="application/json", output_value=anthropic_response - ) - trace_llm_call( - output_messages=[ - {"role": "assistant", "content": anthropic_response.completion} - ] - ) - return LLMResponse(output=anthropic_response.completion) - - class LiteLLMCallable(PromptCallableBase): def _invoke_llm( self, @@ -805,11 +509,6 @@ def get_llm_ask( except ImportError: pass - if is_static_openai_create_func(llm_api): - return OpenAICallable(*args, **kwargs) - if is_static_openai_chat_create_func(llm_api): - return OpenAIChatCallable(*args, **kwargs) - try: import manifest # noqa: F401 # type: ignore @@ -818,28 +517,6 @@ def get_llm_ask( except ImportError: pass - try: - import cohere # noqa: F401 # type: ignore - - if ( - isinstance(getattr(llm_api, "__self__", None), cohere.Client) - and getattr(llm_api, "__name__", None) == "generate" - ) or getattr(llm_api, "__module__", None) == "cohere.client": - return CohereCallable(*args, client_callable=llm_api, **kwargs) - except ImportError: - pass - - try: - import anthropic.resources # noqa: F401 # type: ignore - - if isinstance( - getattr(llm_api, "__self__", None), - anthropic.resources.completions.Completions, - ): - return AnthropicCallable(*args, client_callable=llm_api, **kwargs) - except ImportError: - pass - try: from transformers import ( # noqa: F401 # type: ignore FlaxPreTrainedModel, @@ -919,119 +596,6 @@ async def __call__(self, *args, **kwargs) -> LLMResponse: return result -class AsyncOpenAIModel(AsyncPromptCallableBase): - pass - - -class AsyncOpenAICallable(AsyncOpenAIModel): - async def invoke_llm( - self, - text: str, - engine: str = "text-davinci-003", - instructions: Optional[str] = None, - *args, - **kwargs, - ): - warnings.warn( - "This callable is deprecated in favor of passing " - "no callable and the model argument which utilizes LiteLLM" - "for example guard(model='gpt-4.o', messages=[...], ...)", - DeprecationWarning, - ) - if "api_key" in kwargs: - api_key = kwargs.pop("api_key") - else: - api_key = None - - if "model" in kwargs: - engine = kwargs.pop("model") - - aclient = AsyncOpenAIClient(api_key=api_key) - return await aclient.create_completion( - engine=engine, - prompt=nonchat_prompt(prompt=text, instructions=instructions), - *args, - **kwargs, - ) - - -class AsyncOpenAIChatCallable(AsyncOpenAIModel): - supports_base_model = True - - async def invoke_llm( - self, - text: Optional[str] = None, - model: str = "gpt-3.5-turbo", - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, - base_model: Optional[ - Union[Type[BaseModel], Type[List[Type[BaseModel]]]] - ] = None, - function_call: Optional[Any] = None, - *args, - **kwargs, - ) -> LLMResponse: - """Wrapper for OpenAI chat engines. - - Use Guardrails with OpenAI chat engines by doing - ``` - raw_llm_response, validated_response, *rest = guard( - openai.chat.completions.create, - prompt_params={...}, - text=..., - instructions=..., - msg_history=..., - temperature=..., - ... - ) - ``` - - If `base_model` is passed, the chat engine will be used as a function - on the base model. - """ - warnings.warn( - "This callable is deprecated in favor of passing " - "no callable and the model argument which utilizes LiteLLM" - "for example guard(model='gpt-4.o', messages=[...], ...)", - DeprecationWarning, - ) - if msg_history is None and text is None: - raise PromptCallableException( - "You must pass in either `text` or `msg_history` to `guard.__call__`." - ) - - # TODO: Update this to tools - # Configure function calling if applicable - fn_kwargs = {} - kwargs_tools = kwargs.get("tools", False) - if base_model: - function_params = convert_pydantic_model_to_openai_fn(base_model) - if function_call is None and function_params and not kwargs_tools: - function_call = {"name": function_params["name"]} - fn_kwargs = { - "functions": [function_params], - "function_call": function_call, - } - - # Call OpenAI - if "api_key" in kwargs: - api_key = kwargs.pop("api_key") - else: - api_key = None - - aclient = AsyncOpenAIClient(api_key=api_key) - # FIXME: OpenAI async streaming seems to be broken - return await aclient.create_chat_completion( - model=model, - messages=chat_prompt( - prompt=text, instructions=instructions, msg_history=msg_history - ), - *args, - **fn_kwargs, - **kwargs, - ) - - class AsyncLiteLLMCallable(AsyncPromptCallableBase): async def invoke_llm( self, @@ -1292,15 +856,6 @@ def get_async_llm_ask( except ImportError: pass - # these only work with openai v0 (None otherwise) - # We no longer support OpenAI v0 - # We should drop these checks or update the logic to support - # OpenAI v1 clients instead of just static methods - if is_static_openai_acreate_func(llm_api): - return AsyncOpenAICallable(*args, **kwargs) - if is_static_openai_chat_acreate_func(llm_api): - return AsyncOpenAIChatCallable(*args, **kwargs) - try: import manifest # noqa: F401 # type: ignore @@ -1324,12 +879,7 @@ def model_is_supported_server_side( model = get_llm_ask(llm_api, *args, **kwargs) if asyncio.iscoroutinefunction(llm_api): model = get_async_llm_ask(llm_api, *args, **kwargs) - return ( - issubclass(type(model), OpenAIModel) - or issubclass(type(model), AsyncOpenAIModel) - or isinstance(model, LiteLLMCallable) - or isinstance(model, AsyncLiteLLMCallable) - ) + return isinstance(model, LiteLLMCallable) or isinstance(model, AsyncLiteLLMCallable) # CONTINUOUS FIXME: Update with newly supported LLMs @@ -1338,15 +888,7 @@ def get_llm_api_enum( ) -> Optional[LLMResource]: # TODO: Distinguish between v1 and v2 model = get_llm_ask(llm_api, *args, **kwargs) - if is_static_openai_create_func(llm_api): - return LLMResource.OPENAI_DOT_COMPLETION_DOT_CREATE - elif is_static_openai_chat_create_func(llm_api): - return LLMResource.OPENAI_DOT_CHAT_COMPLETION_DOT_CREATE - elif is_static_openai_acreate_func(llm_api): # This is always False - return LLMResource.OPENAI_DOT_COMPLETION_DOT_ACREATE - elif is_static_openai_chat_acreate_func(llm_api): # This is always False - return LLMResource.OPENAI_DOT_CHAT_COMPLETION_DOT_ACREATE - elif isinstance(model, LiteLLMCallable): + if isinstance(model, LiteLLMCallable): return LLMResource.LITELLM_DOT_COMPLETION elif isinstance(model, AsyncLiteLLMCallable): return LLMResource.LITELLM_DOT_ACOMPLETION diff --git a/guardrails/run/async_runner.py b/guardrails/run/async_runner.py index e71d68b00..771394a35 100644 --- a/guardrails/run/async_runner.py +++ b/guardrails/run/async_runner.py @@ -1,26 +1,22 @@ import copy from functools import partial -from typing import Any, Dict, List, Optional, Tuple, Union, cast +from typing import Any, Dict, List, Optional, Union, cast from guardrails import validator_service from guardrails.classes.execution.guard_execution_options import GuardExecutionOptions from guardrails.classes.history import Call, Inputs, Iteration, Outputs from guardrails.classes.output_type import OutputTypes -from guardrails.constants import fail_status from guardrails.errors import ValidationError from guardrails.llm_providers import AsyncPromptCallableBase, PromptCallableBase from guardrails.logger import set_scope -from guardrails.prompt import Instructions, Prompt from guardrails.run.runner import Runner -from guardrails.run.utils import msg_history_source, msg_history_string +from guardrails.run.utils import messages_source, messages_string from guardrails.schema.validator import schema_validation from guardrails.types.pydantic import ModelOrListOfModels from guardrails.types.validator import ValidatorMap from guardrails.utils.exception_utils import UserFacingException from guardrails.classes.llm.llm_response import LLMResponse -from guardrails.utils.prompt_utils import prompt_uses_xml -from guardrails.run.utils import preprocess_prompt from guardrails.actions.reask import NonParseableReAsk, ReAsk from guardrails.telemetry import trace_async_call, trace_async_step @@ -33,9 +29,7 @@ def __init__( num_reasks: int, validation_map: ValidatorMap, *, - prompt: Optional[str] = None, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, api: Optional[AsyncPromptCallableBase] = None, metadata: Optional[Dict[str, Any]] = None, output: Optional[str] = None, @@ -49,9 +43,7 @@ def __init__( output_schema=output_schema, num_reasks=num_reasks, validation_map=validation_map, - prompt=prompt, - instructions=instructions, - msg_history=msg_history, + messages=messages, api=api, metadata=metadata, output=output, @@ -79,20 +71,11 @@ async def async_run( """ prompt_params = prompt_params or {} try: - # Figure out if we need to include instructions in the prompt. - include_instructions = not ( - self.instructions is None and self.msg_history is None - ) - ( - instructions, - prompt, - msg_history, + messages, output_schema, ) = ( - self.instructions, - self.prompt, - self.msg_history, + self.messages, self.output_schema, ) index = 0 @@ -101,9 +84,7 @@ async def async_run( iteration = await self.async_step( index=index, api=self.api, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, output_schema=output_schema, output=self.output if index == 0 else None, @@ -116,17 +97,14 @@ async def async_run( # Get new prompt and output schema. ( - prompt, - instructions, output_schema, - msg_history, + messages, ) = self.prepare_to_loop( iteration.reasks, output_schema, parsed_output=iteration.outputs.parsed_output, validated_output=call_log.validation_response, prompt_params=prompt_params, - include_instructions=include_instructions, ) # Log how many times we reasked @@ -158,9 +136,7 @@ async def async_step( call_log: Call, *, api: Optional[AsyncPromptCallableBase], - instructions: Optional[Instructions], - prompt: Optional[Prompt], - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, prompt_params: Optional[Dict] = None, output: Optional[str] = None, ) -> Iteration: @@ -169,9 +145,7 @@ async def async_step( inputs = Inputs( llm_api=api, llm_output=output, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, num_reasks=self.num_reasks, metadata=self.metadata, @@ -187,28 +161,20 @@ async def async_step( try: # Prepare: run pre-processing, and input validation. if output is not None: - instructions = None - prompt = None - msg_history = None + messages = None else: - instructions, prompt, msg_history = await self.async_prepare( + messages = await self.async_prepare( call_log, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, api=api, attempt_number=index, ) - iteration.inputs.instructions = instructions - iteration.inputs.prompt = prompt - iteration.inputs.msg_history = msg_history + iteration.inputs.messages = messages # Call: run the API. - llm_response = await self.async_call( - instructions, prompt, msg_history, api, output - ) + llm_response = await self.async_call(messages, api, output) iteration.outputs.llm_response_info = llm_response output = llm_response.output @@ -250,9 +216,7 @@ async def async_step( @trace_async_call async def async_call( self, - instructions: Optional[Instructions], - prompt: Optional[Prompt], - msg_history: Optional[List[Dict]], + messages: Optional[List[Dict]], api: Optional[AsyncPromptCallableBase], output: Optional[str] = None, ) -> LLMResponse: @@ -274,12 +238,8 @@ async def async_call( ) elif api_fn is None: raise ValueError("API or output must be provided.") - elif msg_history: - llm_response = await api_fn(msg_history=msg_history_source(msg_history)) - elif prompt and instructions: - llm_response = await api_fn(prompt.source, instructions=instructions.source) - elif prompt: - llm_response = await api_fn(prompt.source) + elif messages: + llm_response = await api_fn(messages=messages_source(messages)) else: llm_response = await api_fn() return llm_response @@ -328,12 +288,10 @@ async def async_prepare( call_log: Call, attempt_number: int, *, - instructions: Optional[Instructions], - prompt: Optional[Prompt], - msg_history: Optional[List[Dict]], + messages: Optional[List[Dict]], prompt_params: Optional[Dict] = None, api: Optional[Union[PromptCallableBase, AsyncPromptCallableBase]], - ) -> Tuple[Optional[Instructions], Optional[Prompt], Optional[List[Dict]]]: + ) -> Optional[List[Dict]]: """Prepare by running pre-processing and input validation. Returns: @@ -341,32 +299,19 @@ async def async_prepare( """ prompt_params = prompt_params or {} - has_prompt_validation = "prompt" in self.validation_map - has_instructions_validation = "instructions" in self.validation_map - has_msg_history_validation = "msg_history" in self.validation_map - if msg_history: - if has_prompt_validation or has_instructions_validation: - raise UserFacingException( - ValueError( - "Prompt and instructions validation are " - "not supported when using message history." - ) - ) - - prompt, instructions = None, None - - # Runner.prepare_msg_history - formatted_msg_history = [] + if messages: + # Runner.prepare_messages + formatted_messages = [] # Format any variables in the message history with the prompt params. - for msg in msg_history: + for msg in messages: msg_copy = copy.deepcopy(msg) msg_copy["content"] = msg_copy["content"].format(**prompt_params) - formatted_msg_history.append(msg_copy) + formatted_messages.append(msg_copy) - if "msg_history" in self.validation_map: - # Runner.validate_msg_history - msg_str = msg_history_string(formatted_msg_history) + if "messages" in self.validation_map: + # Runner.validate_messages + msg_str = messages_string(formatted_messages) inputs = Inputs( llm_output=msg_str, ) @@ -380,112 +325,21 @@ async def async_prepare( validator_map=self.validation_map, iteration=iteration, disable_tracer=self._disable_tracer, - path="msg_history", + path="messages", ) - validated_msg_history = validator_service.post_process_validation( + validated_messages = validator_service.post_process_validation( value, attempt_number, iteration, OutputTypes.STRING ) - validated_msg_history = cast(str, validated_msg_history) + validated_messages = cast(str, validated_messages) - iteration.outputs.validation_response = validated_msg_history - if isinstance(validated_msg_history, ReAsk): + iteration.outputs.validation_response = validated_messages + if isinstance(validated_messages, ReAsk): raise ValidationError( - f"Message history validation failed: " - f"{validated_msg_history}" - ) - if validated_msg_history != msg_str: - raise ValidationError("Message history validation failed") - elif prompt is not None: - if has_msg_history_validation: - raise UserFacingException( - ValueError( - "Message history validation is " - "not supported when using prompt/instructions." + f"Message validation failed: " f"{validated_messages}" ) - ) - msg_history = None - - use_xml = prompt_uses_xml(prompt._source) - # Runner.prepare_prompt - prompt = prompt.format(**prompt_params) - - # TODO(shreya): should there be any difference - # to parsing params for prompt? - if instructions is not None and isinstance(instructions, Instructions): - instructions = instructions.format(**prompt_params) - - instructions, prompt = preprocess_prompt( - prompt_callable=api, # type: ignore - instructions=instructions, - prompt=prompt, - output_type=self.output_type, - use_xml=use_xml, - ) - - # validate prompt - if "prompt" in self.validation_map and prompt is not None: - # Runner.validate_prompt - inputs = Inputs( - llm_output=prompt.source, - ) - iteration = Iteration( - call_id=call_log.id, index=attempt_number, inputs=inputs - ) - call_log.iterations.insert(0, iteration) - value, _metadata = await validator_service.async_validate( - value=prompt.source, - metadata=self.metadata, - validator_map=self.validation_map, - iteration=iteration, - disable_tracer=self._disable_tracer, - path="prompt", - ) - validated_prompt = validator_service.post_process_validation( - value, attempt_number, iteration, OutputTypes.STRING - ) - - iteration.outputs.validation_response = validated_prompt - if isinstance(validated_prompt, ReAsk): - raise ValidationError( - f"Prompt validation failed: {validated_prompt}" - ) - elif not validated_prompt or iteration.status == fail_status: - raise ValidationError("Prompt validation failed") - prompt = Prompt(cast(str, validated_prompt)) - - # validate instructions - if "instructions" in self.validation_map and instructions is not None: - # Runner.validate_instructions - inputs = Inputs( - llm_output=instructions.source, - ) - iteration = Iteration( - call_id=call_log.id, index=attempt_number, inputs=inputs - ) - call_log.iterations.insert(0, iteration) - value, _metadata = await validator_service.async_validate( - value=instructions.source, - metadata=self.metadata, - validator_map=self.validation_map, - iteration=iteration, - disable_tracer=self._disable_tracer, - path="instructions", - ) - validated_instructions = validator_service.post_process_validation( - value, attempt_number, iteration, OutputTypes.STRING - ) - - iteration.outputs.validation_response = validated_instructions - if isinstance(validated_instructions, ReAsk): - raise ValidationError( - f"Instructions validation failed: {validated_instructions}" - ) - elif not validated_instructions or iteration.status == fail_status: - raise ValidationError("Instructions validation failed") - instructions = Instructions(cast(str, validated_instructions)) + if validated_messages != msg_str: + raise ValidationError("Messages validation failed") else: - raise UserFacingException( - ValueError("'prompt' or 'msg_history' must be provided.") - ) + raise UserFacingException(ValueError("'messages' must be provided.")) - return instructions, prompt, msg_history + return messages diff --git a/guardrails/run/async_stream_runner.py b/guardrails/run/async_stream_runner.py index 5285a9634..0e63a5d95 100644 --- a/guardrails/run/async_stream_runner.py +++ b/guardrails/run/async_stream_runner.py @@ -23,7 +23,6 @@ PromptCallableBase, ) from guardrails.logger import set_scope -from guardrails.prompt import Instructions, Prompt from guardrails.run import StreamRunner from guardrails.run.async_runner import AsyncRunner from guardrails.telemetry import trace_async_stream_step @@ -36,14 +35,10 @@ async def async_run( prompt_params = prompt_params or {} ( - instructions, - prompt, - msg_history, + messages, output_schema, ) = ( - self.instructions, - self.prompt, - self.msg_history, + self.messages, self.output_schema, ) @@ -52,9 +47,7 @@ async def async_run( output_schema, call_log, api=self.api, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, output=self.output, ) @@ -71,9 +64,7 @@ async def async_step( call_log: Call, *, api: Optional[AsyncPromptCallableBase], - instructions: Optional[Instructions], - prompt: Optional[Prompt], - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, prompt_params: Optional[Dict] = None, output: Optional[str] = None, ) -> AsyncIterable[ValidationOutcome]: @@ -81,9 +72,7 @@ async def async_step( inputs = Inputs( llm_api=api, llm_output=output, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, num_reasks=self.num_reasks, metadata=self.metadata, @@ -97,27 +86,19 @@ async def async_step( set_scope(str(id(iteration))) call_log.iterations.push(iteration) if output is not None: - instructions = None - prompt = None - msg_history = None + messages = None else: - instructions, prompt, msg_history = await self.async_prepare( + messages = await self.async_prepare( call_log, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, api=api, attempt_number=index, ) - iteration.inputs.prompt = prompt - iteration.inputs.instructions = instructions - iteration.inputs.msg_history = msg_history + iteration.inputs.messages = messages - llm_response = await self.async_call( - instructions, prompt, msg_history, api, output - ) + llm_response = await self.async_call(messages, api, output) iteration.outputs.llm_response_info = llm_response stream_output = llm_response.async_stream_output if not stream_output: diff --git a/guardrails/run/runner.py b/guardrails/run/runner.py index b62bb64ca..e7ff6782a 100644 --- a/guardrails/run/runner.py +++ b/guardrails/run/runner.py @@ -15,8 +15,8 @@ PromptCallableBase, ) from guardrails.logger import set_scope -from guardrails.prompt import Instructions, Prompt -from guardrails.run.utils import msg_history_source, msg_history_string +from guardrails.prompt import Prompt +from guardrails.run.utils import messages_source, messages_string from guardrails.schema.rail_schema import json_schema_to_rail_output from guardrails.schema.validator import schema_validation from guardrails.types import ModelOrListOfModels, ValidatorMap, MessageHistory @@ -28,10 +28,8 @@ parse_llm_output, prune_extra_keys, ) -from guardrails.run.utils import preprocess_prompt from guardrails.utils.prompt_utils import ( prompt_content_for_schema, - prompt_uses_xml, ) from guardrails.actions.reask import NonParseableReAsk, ReAsk, introspect from guardrails.telemetry import trace_call, trace_step @@ -61,9 +59,7 @@ class Runner: metadata: Dict[str, Any] # LLM Inputs - prompt: Optional[Prompt] = None - instructions: Optional[Instructions] = None - msg_history: Optional[List[Dict[str, Union[Prompt, str]]]] = None + messages: Optional[List[Dict[str, Union[Prompt, str]]]] = None base_model: Optional[ModelOrListOfModels] exec_options: Optional[GuardExecutionOptions] @@ -77,7 +73,7 @@ class Runner: disable_tracer: Optional[bool] = True # QUESTION: Are any of these init args actually necessary for initialization? - # ANSWER: _Maybe_ prompt, instructions, and msg_history for Prompt initialization + # ANSWER: _Maybe_ prompt, instructions, and messages for Prompt initialization # but even that can happen at execution time. # TODO: In versions >=0.6.x, remove this class and just execute a Guard functionally def __init__( @@ -87,9 +83,7 @@ def __init__( num_reasks: int, validation_map: ValidatorMap, *, - prompt: Optional[str] = None, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, api: Optional[PromptCallableBase] = None, metadata: Optional[Dict[str, Any]] = None, output: Optional[str] = None, @@ -113,34 +107,19 @@ def __init__( xml_output_schema = json_schema_to_rail_output( json_schema=output_schema, validator_map=validation_map ) - if prompt: - self.exec_options.prompt = prompt - self.prompt = Prompt( - prompt, - output_schema=stringified_output_schema, - xml_output_schema=xml_output_schema, - ) - - if instructions: - self.exec_options.instructions = instructions - self.instructions = Instructions( - instructions, - output_schema=stringified_output_schema, - xml_output_schema=xml_output_schema, - ) - if msg_history: - self.exec_options.msg_history = msg_history - msg_history_copy = [] - for msg in msg_history: + if messages: + self.exec_options.messages = messages + messages_copy = [] + for msg in messages: msg_copy = copy.deepcopy(msg) msg_copy["content"] = Prompt( msg_copy["content"], output_schema=stringified_output_schema, xml_output_schema=xml_output_schema, ) - msg_history_copy.append(msg_copy) - self.msg_history = msg_history_copy + messages_copy.append(msg_copy) + self.messages = messages_copy self.base_model = base_model @@ -171,23 +150,14 @@ def __call__(self, call_log: Call, prompt_params: Optional[Dict] = None) -> Call """ prompt_params = prompt_params or {} try: - # Figure out if we need to include instructions in the prompt. - include_instructions = not ( - self.instructions is None and self.msg_history is None - ) - # NOTE: At first glance this seems gratuitous, # but these local variables are reassigned after # calling self.prepare_to_loop ( - instructions, - prompt, - msg_history, + messages, output_schema, ) = ( - self.instructions, - self.prompt, - self.msg_history, + self.messages, self.output_schema, ) @@ -197,9 +167,7 @@ def __call__(self, call_log: Call, prompt_params: Optional[Dict] = None) -> Call iteration = self.step( index=index, api=self.api, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, output_schema=output_schema, output=self.output if index == 0 else None, @@ -211,15 +179,12 @@ def __call__(self, call_log: Call, prompt_params: Optional[Dict] = None) -> Call break # Get new prompt and output schema. - (prompt, instructions, output_schema, msg_history) = ( - self.prepare_to_loop( - iteration.reasks, - output_schema, - parsed_output=iteration.outputs.parsed_output, - validated_output=call_log.validation_response, - prompt_params=prompt_params, - include_instructions=include_instructions, - ) + (output_schema, messages) = self.prepare_to_loop( + iteration.reasks, + output_schema, + parsed_output=iteration.outputs.parsed_output, + validated_output=call_log.validation_response, + prompt_params=prompt_params, ) # Log how many times we reasked @@ -250,9 +215,7 @@ def step( call_log: Call, *, api: Optional[PromptCallableBase], - instructions: Optional[Instructions], - prompt: Optional[Prompt], - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, prompt_params: Optional[Dict] = None, output: Optional[str] = None, ) -> Iteration: @@ -261,9 +224,7 @@ def step( inputs = Inputs( llm_api=api, llm_output=output, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, num_reasks=self.num_reasks, metadata=self.metadata, @@ -279,26 +240,20 @@ def step( try: # Prepare: run pre-processing, and input validation. if output is not None: - instructions = None - prompt = None - msg_history = None + messages = None else: - instructions, prompt, msg_history = self.prepare( + messages = self.prepare( call_log, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, api=api, attempt_number=index, ) - iteration.inputs.instructions = instructions - iteration.inputs.prompt = prompt - iteration.inputs.msg_history = msg_history + iteration.inputs.messages = messages # Call: run the API. - llm_response = self.call(instructions, prompt, msg_history, api, output) + llm_response = self.call(messages, api, output) iteration.outputs.llm_response_info = llm_response raw_output = llm_response.output @@ -335,10 +290,10 @@ def step( raise e return iteration - def validate_msg_history( - self, call_log: Call, msg_history: MessageHistory, attempt_number: int + def validate_messages( + self, call_log: Call, messages: MessageHistory, attempt_number: int ) -> None: - msg_str = msg_history_string(msg_history) + msg_str = messages_string(messages) inputs = Inputs( llm_output=msg_str, ) @@ -350,39 +305,39 @@ def validate_msg_history( validator_map=self.validation_map, iteration=iteration, disable_tracer=self._disable_tracer, - path="msg_history", + path="messages", ) - validated_msg_history = validator_service.post_process_validation( + validated_messages = validator_service.post_process_validation( value, attempt_number, iteration, OutputTypes.STRING ) - iteration.outputs.validation_response = validated_msg_history - if isinstance(validated_msg_history, ReAsk): + iteration.outputs.validation_response = validated_messages + if isinstance(validated_messages, ReAsk): raise ValidationError( - f"Message history validation failed: " f"{validated_msg_history}" + f"Message validation failed: " f"{validated_messages}" ) - if validated_msg_history != msg_str: - raise ValidationError("Message history validation failed") + if validated_messages != msg_str: + raise ValidationError("Message validation failed") - def prepare_msg_history( + def prepare_messages( self, call_log: Call, - msg_history: MessageHistory, + messages: MessageHistory, prompt_params: Dict, attempt_number: int, ) -> MessageHistory: - formatted_msg_history: MessageHistory = [] + formatted_messages: MessageHistory = [] # Format any variables in the message history with the prompt params. - for msg in msg_history: + for msg in messages: msg_copy = copy.deepcopy(msg) msg_copy["content"] = msg_copy["content"].format(**prompt_params) - formatted_msg_history.append(msg_copy) + formatted_messages.append(msg_copy) - # validate msg_history - if "msg_history" in self.validation_map: - self.validate_msg_history(call_log, formatted_msg_history, attempt_number) + # validate messages + if "messages" in self.validation_map: + self.validate_messages(call_log, formatted_messages, attempt_number) - return formatted_msg_history + return formatted_messages def validate_prompt(self, call_log: Call, prompt: Prompt, attempt_number: int): inputs = Inputs( @@ -411,128 +366,35 @@ def validate_prompt(self, call_log: Call, prompt: Prompt, attempt_number: int): raise ValidationError("Prompt validation failed") return Prompt(cast(str, validated_prompt)) - def validate_instructions( - self, call_log: Call, instructions: Instructions, attempt_number: int - ): - inputs = Inputs( - llm_output=instructions.source, - ) - iteration = Iteration(call_id=call_log.id, index=attempt_number, inputs=inputs) - call_log.iterations.insert(0, iteration) - value, _metadata = validator_service.validate( - value=instructions.source, - metadata=self.metadata, - validator_map=self.validation_map, - iteration=iteration, - disable_tracer=self._disable_tracer, - path="instructions", - ) - validated_instructions = validator_service.post_process_validation( - value, attempt_number, iteration, OutputTypes.STRING - ) - - iteration.outputs.validation_response = validated_instructions - if isinstance(validated_instructions, ReAsk): - raise ValidationError( - f"Instructions validation failed: {validated_instructions}" - ) - elif not validated_instructions or iteration.status == fail_status: - raise ValidationError("Instructions validation failed") - return Instructions(cast(str, validated_instructions)) - - def prepare_prompt( - self, - call_log: Call, - instructions: Optional[Instructions], - prompt: Prompt, - prompt_params: Dict, - api: Union[PromptCallableBase, AsyncPromptCallableBase], - attempt_number: int, - ): - use_xml = prompt_uses_xml(self.prompt._source) if self.prompt else False - prompt = prompt.format(**prompt_params) - - # TODO(shreya): should there be any difference - # to parsing params for prompt? - if instructions is not None and isinstance(instructions, Instructions): - instructions = instructions.format(**prompt_params) - - instructions, prompt = preprocess_prompt( - prompt_callable=api, - instructions=instructions, - prompt=prompt, - output_type=self.output_type, - use_xml=use_xml, - ) - - # validate prompt - if "prompt" in self.validation_map and prompt is not None: - prompt = self.validate_prompt(call_log, prompt, attempt_number) - - # validate instructions - if "instructions" in self.validation_map and instructions is not None: - instructions = self.validate_instructions( - call_log, instructions, attempt_number - ) - - return instructions, prompt - def prepare( self, call_log: Call, attempt_number: int, *, - instructions: Optional[Instructions], - prompt: Optional[Prompt], - msg_history: Optional[MessageHistory], + messages: Optional[MessageHistory], prompt_params: Optional[Dict] = None, api: Optional[Union[PromptCallableBase, AsyncPromptCallableBase]], - ) -> Tuple[Optional[Instructions], Optional[Prompt], Optional[MessageHistory]]: + ) -> Optional[MessageHistory]: """Prepare by running pre-processing and input validation. Returns: - The instructions, prompt, and message history. + The message history. """ prompt_params = prompt_params or {} if api is None: raise UserFacingException(ValueError("API must be provided.")) - has_prompt_validation = "prompt" in self.validation_map - has_instructions_validation = "instructions" in self.validation_map - has_msg_history_validation = "msg_history" in self.validation_map - if msg_history: - if has_prompt_validation or has_instructions_validation: - raise UserFacingException( - ValueError( - "Prompt and instructions validation are " - "not supported when using message history." - ) - ) - prompt, instructions = None, None - msg_history = self.prepare_msg_history( - call_log, msg_history, prompt_params, attempt_number - ) - elif prompt is not None: - if has_msg_history_validation: - raise UserFacingException( - ValueError( - "Message history validation is " - "not supported when using prompt/instructions." - ) - ) - msg_history = None - instructions, prompt = self.prepare_prompt( - call_log, instructions, prompt, prompt_params, api, attempt_number + if messages: + messages = self.prepare_messages( + call_log, messages, prompt_params, attempt_number ) - return instructions, prompt, msg_history + return messages @trace_call def call( self, - instructions: Optional[Instructions], - prompt: Optional[Prompt], - msg_history: Optional[MessageHistory], + messages: Optional[MessageHistory], api: Optional[PromptCallableBase], output: Optional[str] = None, ) -> LLMResponse: @@ -554,12 +416,8 @@ def call( llm_response = LLMResponse(output=output) elif api_fn is None: raise ValueError("API or output must be provided.") - elif msg_history: - llm_response = api_fn(msg_history=msg_history_source(msg_history)) - elif prompt and instructions: - llm_response = api_fn(prompt.source, instructions=instructions.source) - elif prompt: - llm_response = api_fn(prompt.source) + elif messages: + llm_response = api_fn(messages=messages_source(messages)) else: llm_response = api_fn() @@ -635,16 +493,13 @@ def prepare_to_loop( parsed_output: Optional[Union[str, List, Dict, ReAsk]] = None, validated_output: Optional[Union[str, List, Dict, ReAsk]] = None, prompt_params: Optional[Dict] = None, - include_instructions: bool = False, ) -> Tuple[ - Prompt, - Optional[Instructions], Dict[str, Any], Optional[List[Dict]], ]: """Prepare to loop again.""" prompt_params = prompt_params or {} - output_schema, prompt, instructions = get_reask_setup( + output_schema, messages = get_reask_setup( output_type=self.output_type, output_schema=output_schema, validation_map=self.validation_map, @@ -655,8 +510,6 @@ def prepare_to_loop( prompt_params=prompt_params, exec_options=self.exec_options, ) - if not include_instructions: - instructions = None - # todo add messages support - msg_history = None - return prompt, instructions, output_schema, msg_history + # TODO add messages support + messages = None + return output_schema, messages diff --git a/guardrails/run/stream_runner.py b/guardrails/run/stream_runner.py index 2e041abf4..948904f13 100644 --- a/guardrails/run/stream_runner.py +++ b/guardrails/run/stream_runner.py @@ -10,7 +10,6 @@ OpenAIChatCallable, PromptCallableBase, ) -from guardrails.prompt import Instructions, Prompt from guardrails.run.runner import Runner from guardrails.utils.parsing_utils import ( coerce_types, @@ -42,32 +41,21 @@ def __call__( Returns: The Call log for this run. """ - # This is only used during ReAsks and ReAsks - # are not yet supported for streaming. - # Figure out if we need to include instructions in the prompt. - # include_instructions = not ( - # self.instructions is None and self.msg_history is None - # ) + prompt_params = prompt_params or {} ( - instructions, - prompt, - msg_history, + messages, output_schema, ) = ( - self.instructions, - self.prompt, - self.msg_history, + self.messages, self.output_schema, ) return self.step( index=0, api=self.api, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, output_schema=output_schema, output=self.output, @@ -79,9 +67,7 @@ def step( self, index: int, api: Optional[PromptCallableBase], - instructions: Optional[Instructions], - prompt: Optional[Prompt], - msg_history: Optional[List[Dict]], + messages: Optional[List[Dict]], prompt_params: Dict, output_schema: Dict[str, Any], call_log: Call, @@ -91,9 +77,7 @@ def step( inputs = Inputs( llm_api=api, llm_output=output, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, num_reasks=self.num_reasks, metadata=self.metadata, @@ -108,26 +92,20 @@ def step( # Prepare: run pre-processing, and input validation. if output is not None: - instructions = None - prompt = None - msg_history = None + messages = None else: - instructions, prompt, msg_history = self.prepare( + messages = self.prepare( call_log, index, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, api=api, ) - iteration.inputs.prompt = prompt - iteration.inputs.instructions = instructions - iteration.inputs.msg_history = msg_history + iteration.inputs.messages = messages # Call: run the API that returns a generator wrapped in LLMResponse - llm_response = self.call(instructions, prompt, msg_history, api, output) + llm_response = self.call(messages, api, output) iteration.outputs.llm_response_info = llm_response diff --git a/guardrails/run/utils.py b/guardrails/run/utils.py index 90a22b84f..bcdcfe5b3 100644 --- a/guardrails/run/utils.py +++ b/guardrails/run/utils.py @@ -15,9 +15,9 @@ from guardrails.prompt.instructions import Instructions -def msg_history_source(msg_history: MessageHistory) -> MessageHistory: - msg_history_copy = [] - for msg in msg_history: +def messages_source(messages: MessageHistory) -> MessageHistory: + messages_copy = [] + for msg in messages: msg_copy = copy.deepcopy(msg) content = ( msg["content"].source @@ -25,20 +25,20 @@ def msg_history_source(msg_history: MessageHistory) -> MessageHistory: else msg["content"] ) msg_copy["content"] = content - msg_history_copy.append(cast(Dict[str, str], msg_copy)) - return msg_history_copy + messages_copy.append(cast(Dict[str, str], msg_copy)) + return messages_copy -def msg_history_string(msg_history: MessageHistory) -> str: - msg_history_copy = "" - for msg in msg_history: +def messages_string(messages: MessageHistory) -> str: + messages_copy = "" + for msg in messages: content = ( msg["content"].source if isinstance(msg["content"], Prompt) else msg["content"] ) - msg_history_copy += content - return msg_history_copy + messages_copy += content + return messages_copy def preprocess_prompt_for_string_output( diff --git a/guardrails/schema/rail_schema.py b/guardrails/schema/rail_schema.py index 2aaa04ec4..a2f4e1084 100644 --- a/guardrails/schema/rail_schema.py +++ b/guardrails/schema/rail_schema.py @@ -1,5 +1,4 @@ import jsonref -import warnings from dataclasses import dataclass from string import Template from typing import Any, Callable, Dict, List, Optional, Tuple, cast @@ -22,10 +21,6 @@ ### RAIL to JSON Schema ### STRING_TAGS = [ - "instructions", - "prompt", - "reask_instructions", - "reask_prompt", "messages", "reask_messages", ] @@ -392,49 +387,6 @@ def rail_string_to_schema(rail_string: str) -> ProcessedSchema: ' "string", "object", or "list"' ) - # Parse instructions for the LLM. These are optional but if given, - # LLMs can use them to improve their output. Commonly these are - # prepended to the prompt. - instructions_tag = rail_xml.find("instructions") - if instructions_tag is not None: - parse_element(instructions_tag, processed_schema, "instructions") - processed_schema.exec_opts.instructions = instructions_tag.text - warnings.warn( - "The instructions tag has been deprecated" - " in favor of messages. Please use messages instead.", - DeprecationWarning, - ) - - # Load - prompt_tag = rail_xml.find("prompt") - if prompt_tag is not None: - parse_element(prompt_tag, processed_schema, "prompt") - processed_schema.exec_opts.prompt = prompt_tag.text - warnings.warn( - "The prompt tag has been deprecated" - " in favor of messages. Please use messages instead.", - DeprecationWarning, - ) - - # If reasking prompt and instructions are provided, add them to the schema. - reask_prompt = rail_xml.find("reask_prompt") - if reask_prompt is not None: - processed_schema.exec_opts.reask_prompt = reask_prompt.text - warnings.warn( - "The reask_prompt tag has been deprecated" - " in favor of reask_messages. Please use reask_messages instead.", - DeprecationWarning, - ) - - reask_instructions = rail_xml.find("reask_instructions") - if reask_instructions is not None: - processed_schema.exec_opts.reask_instructions = reask_instructions.text - warnings.warn( - "The reask_instructions tag has been deprecated" - " in favor of reask_messages. Please use reask_messages instead.", - DeprecationWarning, - ) - messages = rail_xml.find("messages") if messages is not None: extracted_messages = [] diff --git a/guardrails/telemetry/guard_tracing.py b/guardrails/telemetry/guard_tracing.py index 57e5a4614..c0eb8ba6d 100644 --- a/guardrails/telemetry/guard_tracing.py +++ b/guardrails/telemetry/guard_tracing.py @@ -39,7 +39,7 @@ def add_guard_attributes( prompt = history.last.compiled_prompt if history.last else "" messages = [] if history.last and history.last.iterations.last: - messages = history.last.iterations.last.inputs.msg_history or [] + messages = history.last.iterations.last.inputs.messages or [] if not instructions: system_messages = [msg for msg in messages if msg["role"] == "system"] system_message = system_messages[-1] if system_messages else {} From 5e0eb15756d9883383c11d9e90fbd6c70339db38 Mon Sep 17 00:00:00 2001 From: David Tam Date: Fri, 20 Sep 2024 16:28:02 -0700 Subject: [PATCH 02/71] tests run and make progress on rewrite, most of unit_tests_passing --- guardrails/async_guard.py | 7 +- guardrails/classes/history/call.py | 7 +- guardrails/classes/history/call_inputs.py | 2 +- guardrails/classes/history/inputs.py | 5 +- guardrails/classes/history/iteration.py | 2 +- guardrails/guard.py | 6 +- guardrails/llm_providers.py | 13 +- guardrails/run/__init__.py | 6 +- guardrails/run/async_stream_runner.py | 14 +- guardrails/run/runner.py | 49 ++- guardrails/run/stream_runner.py | 9 +- guardrails/run/utils.py | 22 +- guardrails/schema/rail_schema.py | 3 +- guardrails/telemetry/guard_tracing.py | 21 +- tests/integration_tests/mock_llm_outputs.py | 59 +-- .../test_assets/entity_extraction/filter.rail | 7 +- .../test_assets/entity_extraction/fix.rail | 7 +- .../entity_extraction/fix_chat_model.rail | 13 +- .../test_assets/entity_extraction/noop.rail | 7 +- .../test_assets/entity_extraction/reask.rail | 6 +- .../entity_extraction/refrain.rail | 7 +- .../entity_extraction/skeleton_reask.rail | 7 +- .../integration_tests/test_data_validation.py | 12 +- tests/integration_tests/test_guard.py | 212 ++-------- tests/integration_tests/test_multi_reask.py | 2 +- tests/integration_tests/test_parsing.py | 3 +- tests/integration_tests/test_pydantic.py | 2 +- tests/integration_tests/test_python_rail.py | 4 +- tests/integration_tests/test_run.py | 42 +- tests/integration_tests/test_streaming.py | 80 +++- tests/unit_tests/classes/history/test_call.py | 60 +-- .../unit_tests/classes/history/test_inputs.py | 31 +- .../classes/history/test_iteration.py | 23 +- tests/unit_tests/test_async_guard.py | 85 ++-- tests/unit_tests/test_llm_providers.py | 177 +------- tests/unit_tests/test_prompt.py | 126 +++--- tests/unit_tests/test_validator_base.py | 385 ++++++------------ 37 files changed, 537 insertions(+), 986 deletions(-) diff --git a/guardrails/async_guard.py b/guardrails/async_guard.py index e7369ae17..eb9370dbe 100644 --- a/guardrails/async_guard.py +++ b/guardrails/async_guard.py @@ -428,7 +428,12 @@ async def __call__( The raw text output from the LLM and the validated output. """ - messages = messages or kwargs.pop("messages", None) or [] + # Retrieve messages from the provided arguments or default options + messages_from_kwargs = kwargs.pop("messages", None) + messages_from_exec_opts = self._exec_opts.messages + + # Determine the final value for messages + messages = messages or messages_from_kwargs or messages_from_exec_opts or [] if messages is not None and not len(messages): raise RuntimeError( diff --git a/guardrails/classes/history/call.py b/guardrails/classes/history/call.py index 08175edc3..2a8de4955 100644 --- a/guardrails/classes/history/call.py +++ b/guardrails/classes/history/call.py @@ -93,7 +93,12 @@ def compiled_messages(self) -> Optional[str]: prompt_params = initial_inputs.prompt_params or {} compiled_messages = [] for message in messages: - compiled_messages.append(message.format(**prompt_params).source) + compiled_messages.append( + { + "role": message["role"], + "content": message["content"].format(**prompt_params), + } + ) return compiled_messages diff --git a/guardrails/classes/history/call_inputs.py b/guardrails/classes/history/call_inputs.py index 0803e42b8..24dbc41ff 100644 --- a/guardrails/classes/history/call_inputs.py +++ b/guardrails/classes/history/call_inputs.py @@ -27,7 +27,7 @@ class CallInputs(Inputs, ICallInputs, ArbitraryModel): "during Guard.__call__ or Guard.parse.", default=None, ) - messages: Optional[dict[str, str]] = Field( + messages: Optional[list[dict[str, str]]] = Field( description="The messages as provided by the user.", default=None ) args: List[Any] = Field( diff --git a/guardrails/classes/history/inputs.py b/guardrails/classes/history/inputs.py index fb7c87b0b..b94a3d11e 100644 --- a/guardrails/classes/history/inputs.py +++ b/guardrails/classes/history/inputs.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List, Optional, Union from pydantic import Field @@ -6,7 +6,6 @@ from guardrails.classes.generic.arbitrary_model import ArbitraryModel from guardrails.classes.llm.prompt_callable import PromptCallableBase from guardrails.prompt.prompt import Prompt -from guardrails.prompt.messages import Messages class Inputs(IInputs, ArbitraryModel): @@ -38,7 +37,7 @@ class Inputs(IInputs, ArbitraryModel): "provided by the user via Guard.parse.", default=None, ) - messages: Optional[List[Messages]] = Field( + messages: Optional[List[Dict[str, Union[str, Prompt]]]] = Field( description="The message history provided by the user for chat model calls.", default=None, ) diff --git a/guardrails/classes/history/iteration.py b/guardrails/classes/history/iteration.py index fcecf8f4c..ae4974f47 100644 --- a/guardrails/classes/history/iteration.py +++ b/guardrails/classes/history/iteration.py @@ -198,7 +198,7 @@ def create_messages_table( table.add_column("Content") for msg in messages: - table.add_row(str(msg["role"]), msg["content"].source) + table.add_row(str(msg["role"]), msg["content"]) return table diff --git a/guardrails/guard.py b/guardrails/guard.py index 6140211b4..013a4fa06 100644 --- a/guardrails/guard.py +++ b/guardrails/guard.py @@ -861,7 +861,7 @@ def __call__( ValidationOutcome """ - messages = messages or [] + messages = messages or self._exec_opts.messages or [] if messages is not None and not len(messages): raise RuntimeError( "You must provide messages. " @@ -1016,8 +1016,6 @@ def use( ) hydrated_validator = get_validator(validator, *args, **kwargs) - if on == "messages": - on = "msg_history" self.__add_validator(hydrated_validator, on=on) self._save() return self @@ -1039,8 +1037,6 @@ def use_many( ) -> "Guard": """Use multiple validators to validate results of an LLM request.""" # Loop through the validators - if on == "messages": - on = "msg_history" for v in validators: hydrated_validator = get_validator(v) self.__add_validator(hydrated_validator, on=on) diff --git a/guardrails/llm_providers.py b/guardrails/llm_providers.py index 4b4096b1d..5040eb7fc 100644 --- a/guardrails/llm_providers.py +++ b/guardrails/llm_providers.py @@ -776,20 +776,11 @@ async def invoke_llm( class AsyncArbitraryCallable(AsyncPromptCallableBase): def __init__(self, llm_api: Callable, *args, **kwargs): llm_api_args = inspect.getfullargspec(llm_api) - if not llm_api_args.args: - raise ValueError( - "Custom LLM callables must accept" - " at least one positional argument for prompt!" - ) if not llm_api_args.varkw: raise ValueError("Custom LLM callables must accept **kwargs!") - if ( - not llm_api_args.kwonlyargs - or "instructions" not in llm_api_args.kwonlyargs - or "msg_history" not in llm_api_args.kwonlyargs - ): + if not llm_api_args.kwonlyargs or "messages" not in llm_api_args.kwonlyargs: warnings.warn( - "We recommend including 'instructions' and 'msg_history'" + "We recommend including 'messages'" " as keyword-only arguments for custom LLM callables." " Doing so ensures these arguments are not uninentionally" " passed through to other calls via **kwargs.", diff --git a/guardrails/run/__init__.py b/guardrails/run/__init__.py index 9893f2124..150ed41ff 100644 --- a/guardrails/run/__init__.py +++ b/guardrails/run/__init__.py @@ -2,13 +2,13 @@ from guardrails.run.runner import Runner from guardrails.run.stream_runner import StreamRunner from guardrails.run.async_stream_runner import AsyncStreamRunner -from guardrails.run.utils import msg_history_source, msg_history_string +from guardrails.run.utils import messages_source, messages_string __all__ = [ "Runner", "AsyncRunner", "StreamRunner", "AsyncStreamRunner", - "msg_history_source", - "msg_history_string", + "messages_source", + "messages_string", ] diff --git a/guardrails/run/async_stream_runner.py b/guardrails/run/async_stream_runner.py index 0e63a5d95..155eb1176 100644 --- a/guardrails/run/async_stream_runner.py +++ b/guardrails/run/async_stream_runner.py @@ -18,8 +18,6 @@ AsyncLiteLLMCallable, AsyncPromptCallableBase, LiteLLMCallable, - OpenAICallable, - OpenAIChatCallable, PromptCallableBase, ) from guardrails.logger import set_scope @@ -201,17 +199,7 @@ async def async_step( def get_chunk_text(self, chunk: Any, api: Union[PromptCallableBase, None]) -> str: """Get the text from a chunk.""" chunk_text = "" - if isinstance(api, OpenAICallable): - finished = chunk.choices[0].finish_reason - content = chunk.choices[0].text - if not finished and content: - chunk_text = content - elif isinstance(api, OpenAIChatCallable): - finished = chunk.choices[0].finish_reason - content = chunk.choices[0].delta.content - if not finished and content: - chunk_text = content - elif isinstance(api, LiteLLMCallable): + if isinstance(api, LiteLLMCallable): finished = chunk.choices[0].finish_reason content = chunk.choices[0].delta.content if not finished and content: diff --git a/guardrails/run/runner.py b/guardrails/run/runner.py index e7ff6782a..05bb3cf2e 100644 --- a/guardrails/run/runner.py +++ b/guardrails/run/runner.py @@ -299,25 +299,40 @@ def validate_messages( ) iteration = Iteration(call_id=call_log.id, index=attempt_number, inputs=inputs) call_log.iterations.insert(0, iteration) - value, _metadata = validator_service.validate( - value=msg_str, - metadata=self.metadata, - validator_map=self.validation_map, - iteration=iteration, - disable_tracer=self._disable_tracer, - path="messages", - ) - validated_messages = validator_service.post_process_validation( - value, attempt_number, iteration, OutputTypes.STRING - ) - iteration.outputs.validation_response = validated_messages - if isinstance(validated_messages, ReAsk): - raise ValidationError( - f"Message validation failed: " f"{validated_messages}" + validated_msgs = "" + + for msg in messages: + content = ( + msg["content"].source + if isinstance(msg["content"], Prompt) + else msg["content"] + ) + + value, _metadata = validator_service.validate( + value=content, + metadata=self.metadata, + validator_map=self.validation_map, + iteration=iteration, + disable_tracer=self._disable_tracer, + path="messages", + ) + + validated_msg = validator_service.post_process_validation( + value, attempt_number, iteration, OutputTypes.STRING ) - if validated_messages != msg_str: - raise ValidationError("Message validation failed") + + if isinstance(validated_msg, ReAsk): + raise ValidationError(f"Message validation failed: {validated_msg}") + elif not validated_msg or iteration.status == fail_status: + raise ValidationError("Message validation failed") + + msg["content"] = cast(str, validated_msg) + validated_msgs += validated_msg + + iteration.outputs.validation_response = validated_msgs + + return messages # type: ignore def prepare_messages( self, diff --git a/guardrails/run/stream_runner.py b/guardrails/run/stream_runner.py index 948904f13..f047627a4 100644 --- a/guardrails/run/stream_runner.py +++ b/guardrails/run/stream_runner.py @@ -6,8 +6,6 @@ from guardrails.classes.validation_outcome import ValidationOutcome from guardrails.llm_providers import ( LiteLLMCallable, - OpenAICallable, - OpenAIChatCallable, PromptCallableBase, ) from guardrails.run.runner import Runner @@ -248,12 +246,7 @@ def is_last_chunk(self, chunk: Any, api: Union[PromptCallableBase, None]) -> boo def get_chunk_text(self, chunk: Any, api: Union[PromptCallableBase, None]) -> str: """Get the text from a chunk.""" chunk_text = "" - if isinstance(api, OpenAICallable): - finished = chunk.choices[0].finish_reason - content = chunk.choices[0].text - if not finished and content: - chunk_text = content - elif isinstance(api, OpenAIChatCallable) or isinstance(api, LiteLLMCallable): + if isinstance(api, LiteLLMCallable): finished = chunk.choices[0].finish_reason content = chunk.choices[0].delta.content if not finished and content: diff --git a/guardrails/run/utils.py b/guardrails/run/utils.py index bcdcfe5b3..8d53dc7c5 100644 --- a/guardrails/run/utils.py +++ b/guardrails/run/utils.py @@ -4,10 +4,8 @@ from guardrails.classes.output_type import OutputTypes from guardrails.llm_providers import ( - AsyncOpenAICallable, - AsyncOpenAIChatCallable, - OpenAICallable, - OpenAIChatCallable, + LiteLLMCallable, + AsyncLiteLLMCallable, PromptCallableBase, ) from guardrails.prompt.prompt import Prompt @@ -46,13 +44,13 @@ def preprocess_prompt_for_string_output( instructions: Optional[Instructions], prompt: Prompt, ) -> Tuple[Optional[Instructions], Prompt]: - if isinstance(prompt_callable, OpenAICallable) or isinstance( - prompt_callable, AsyncOpenAICallable + if isinstance(prompt_callable, LiteLLMCallable) or isinstance( + prompt_callable, AsyncLiteLLMCallable ): prompt.source += "\n\nString Output:\n\n" if ( - isinstance(prompt_callable, OpenAIChatCallable) - or isinstance(prompt_callable, AsyncOpenAIChatCallable) + isinstance(prompt_callable, LiteLLMCallable) + or isinstance(prompt_callable, AsyncLiteLLMCallable) ) and not instructions: instructions = Instructions( "You are a helpful assistant, expressing yourself through a string." @@ -67,13 +65,13 @@ def preprocess_prompt_for_json_output( prompt: Prompt, use_xml: bool, ) -> Tuple[Optional[Instructions], Prompt]: - if isinstance(prompt_callable, OpenAICallable) or isinstance( - prompt_callable, AsyncOpenAICallable + if isinstance(prompt_callable, LiteLLMCallable) or isinstance( + prompt_callable, AsyncLiteLLMCallable ): prompt.source += "\n\nJson Output:\n\n" if ( - isinstance(prompt_callable, OpenAIChatCallable) - or isinstance(prompt_callable, AsyncOpenAIChatCallable) + isinstance(prompt_callable, LiteLLMCallable) + or isinstance(prompt_callable, AsyncLiteLLMCallable) ) and not instructions: schema_type = "XML schemas" if use_xml else "JSON schema" instructions = Instructions( diff --git a/guardrails/schema/rail_schema.py b/guardrails/schema/rail_schema.py index a2f4e1084..566ef5234 100644 --- a/guardrails/schema/rail_schema.py +++ b/guardrails/schema/rail_schema.py @@ -389,6 +389,7 @@ def rail_string_to_schema(rail_string: str) -> ProcessedSchema: messages = rail_xml.find("messages") if messages is not None: + parse_element(messages, processed_schema, "messages") extracted_messages = [] for msg in messages: if msg.tag == "message": @@ -407,7 +408,7 @@ def rail_string_to_schema(rail_string: str) -> ProcessedSchema: role = message.attrib.get("role") content = message.text extracted_reask_messages.append({"role": role, "content": content}) - processed_schema.exec_opts.messages = extracted_reask_messages + processed_schema.exec_opts.reask_messages = extracted_reask_messages return processed_schema diff --git a/guardrails/telemetry/guard_tracing.py b/guardrails/telemetry/guard_tracing.py index c0eb8ba6d..6f7b58a17 100644 --- a/guardrails/telemetry/guard_tracing.py +++ b/guardrails/telemetry/guard_tracing.py @@ -35,22 +35,19 @@ def add_guard_attributes( history: Stack[Call], resp: ValidationOutcome, ): - instructions = history.last.compiled_instructions if history.last else "" - prompt = history.last.compiled_prompt if history.last else "" messages = [] if history.last and history.last.iterations.last: messages = history.last.iterations.last.inputs.messages or [] - if not instructions: - system_messages = [msg for msg in messages if msg["role"] == "system"] - system_message = system_messages[-1] if system_messages else {} - instructions = system_message.get("content", "") - if not prompt: - user_messages = [msg for msg in messages if msg["role"] == "user"] - user_message = user_messages[-1] if user_messages else {} - prompt = user_message.get("content", "") + + system_messages = [msg for msg in messages if msg["role"] == "system"] + system_message = system_messages[-1] if system_messages else {} + + user_messages = [msg for msg in messages if msg["role"] == "user"] + user_message = user_messages[-1] if user_messages else {} + input_value = f""" - {instructions} - {prompt} + {system_message} + {user_message} """ trace_operation( input_mime_type="text/plain", diff --git a/tests/integration_tests/mock_llm_outputs.py b/tests/integration_tests/mock_llm_outputs.py index daa8c4cef..b88c22fa5 100644 --- a/tests/integration_tests/mock_llm_outputs.py +++ b/tests/integration_tests/mock_llm_outputs.py @@ -1,68 +1,21 @@ from guardrails.llm_providers import ( ArbitraryCallable, AsyncArbitraryCallable, - AsyncOpenAICallable, - OpenAICallable, - OpenAIChatCallable, + AsyncLiteLLMCallable, + LiteLLMCallable, ) from guardrails.classes.llm.llm_response import LLMResponse -from .test_assets import entity_extraction, lists_object, pydantic, python_rail, string +from .test_assets import entity_extraction, pydantic, python_rail, string -class MockOpenAICallable(OpenAICallable): - # NOTE: this class normally overrides `llm_providers.OpenAICallable`, - # which compiles instructions and prompt into a single prompt; - # here the instructions are passed into kwargs and ignored - def _invoke_llm(self, prompt, *args, **kwargs): - """Mock the OpenAI API call to Completion.create.""" - - _rail_to_compiled_prompt = { # noqa - entity_extraction.RAIL_SPEC_WITH_REASK: entity_extraction.COMPILED_PROMPT, - } - - mock_llm_responses = { - entity_extraction.COMPILED_PROMPT: entity_extraction.LLM_OUTPUT, - entity_extraction.COMPILED_PROMPT_REASK: entity_extraction.LLM_OUTPUT_REASK, - entity_extraction.COMPILED_PROMPT_FULL_REASK: entity_extraction.LLM_OUTPUT_FULL_REASK, # noqa: E501 - entity_extraction.COMPILED_PROMPT_SKELETON_REASK_1: entity_extraction.LLM_OUTPUT_SKELETON_REASK_1, # noqa: E501 - entity_extraction.COMPILED_PROMPT_SKELETON_REASK_2: entity_extraction.LLM_OUTPUT_SKELETON_REASK_2, # noqa: E501 - pydantic.COMPILED_PROMPT: pydantic.LLM_OUTPUT, - pydantic.COMPILED_PROMPT_REASK_1: pydantic.LLM_OUTPUT_REASK_1, - pydantic.COMPILED_PROMPT_FULL_REASK_1: pydantic.LLM_OUTPUT_FULL_REASK_1, - pydantic.COMPILED_PROMPT_REASK_2: pydantic.LLM_OUTPUT_REASK_2, - pydantic.COMPILED_PROMPT_FULL_REASK_2: pydantic.LLM_OUTPUT_FULL_REASK_2, - pydantic.COMPILED_PROMPT_ENUM: pydantic.LLM_OUTPUT_ENUM, - pydantic.COMPILED_PROMPT_ENUM_2: pydantic.LLM_OUTPUT_ENUM_2, - string.COMPILED_PROMPT: string.LLM_OUTPUT, - string.COMPILED_PROMPT_REASK: string.LLM_OUTPUT_REASK, - string.COMPILED_LIST_PROMPT: string.LIST_LLM_OUTPUT, - python_rail.VALIDATOR_PARALLELISM_PROMPT_1: python_rail.VALIDATOR_PARALLELISM_RESPONSE_1, # noqa: E501 - python_rail.VALIDATOR_PARALLELISM_PROMPT_2: python_rail.VALIDATOR_PARALLELISM_RESPONSE_2, # noqa: E501 - python_rail.VALIDATOR_PARALLELISM_PROMPT_3: python_rail.VALIDATOR_PARALLELISM_RESPONSE_3, # noqa: E501 - lists_object.LIST_PROMPT: lists_object.LIST_OUTPUT, - } - - try: - output = mock_llm_responses[prompt] - return LLMResponse( - output=output, - prompt_token_count=123, - response_token_count=1234, - ) - except KeyError: - print("Unrecognized prompt!") - print(prompt) - raise ValueError("Compiled prompt not found") - - -class MockAsyncOpenAICallable(AsyncOpenAICallable): +class MockAsyncLiteLLMCallable(AsyncLiteLLMCallable): async def invoke_llm(self, prompt, *args, **kwargs): - sync_mock = MockOpenAICallable() + sync_mock = MockLiteLLMCallable() return sync_mock._invoke_llm(prompt, *args, **kwargs) -class MockOpenAIChatCallable(OpenAIChatCallable): +class MockLiteLLMCallable(LiteLLMCallable): def _invoke_llm( self, prompt=None, diff --git a/tests/integration_tests/test_assets/entity_extraction/filter.rail b/tests/integration_tests/test_assets/entity_extraction/filter.rail index c5b17a648..2464e9df0 100644 --- a/tests/integration_tests/test_assets/entity_extraction/filter.rail +++ b/tests/integration_tests/test_assets/entity_extraction/filter.rail @@ -14,8 +14,8 @@ on-fail-two-words="filter"/> - - + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. ${document} @@ -24,6 +24,7 @@ ${gr.xml_prefix_prompt} ${xml_output_schema} -${gr.xml_suffix_prompt_v2_wo_none} +${gr.xml_suffix_prompt_v2_wo_none} + \ No newline at end of file diff --git a/tests/integration_tests/test_assets/entity_extraction/fix.rail b/tests/integration_tests/test_assets/entity_extraction/fix.rail index eb273bdb7..b31e5cb7b 100644 --- a/tests/integration_tests/test_assets/entity_extraction/fix.rail +++ b/tests/integration_tests/test_assets/entity_extraction/fix.rail @@ -13,8 +13,8 @@ - - + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. ${document} @@ -23,6 +23,7 @@ ${gr.xml_prefix_prompt} ${xml_output_schema} -${gr.xml_suffix_prompt_v2_wo_none} +${gr.xml_suffix_prompt_v2_wo_none} + \ No newline at end of file diff --git a/tests/integration_tests/test_assets/entity_extraction/fix_chat_model.rail b/tests/integration_tests/test_assets/entity_extraction/fix_chat_model.rail index b2457c2dd..4afca6c42 100644 --- a/tests/integration_tests/test_assets/entity_extraction/fix_chat_model.rail +++ b/tests/integration_tests/test_assets/entity_extraction/fix_chat_model.rail @@ -13,15 +13,13 @@ - - + + You are a helpful assistant only capable of communicating with valid JSON, and no other text. ${gr.xml_suffix_prompt_examples} - - - - + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter `null`. ${document} @@ -31,6 +29,7 @@ Extract information from this document and return a JSON that follows the correc ${gr.xml_prefix_prompt} ${xml_output_schema} - + + \ No newline at end of file diff --git a/tests/integration_tests/test_assets/entity_extraction/noop.rail b/tests/integration_tests/test_assets/entity_extraction/noop.rail index be2954d4f..49d0e8548 100644 --- a/tests/integration_tests/test_assets/entity_extraction/noop.rail +++ b/tests/integration_tests/test_assets/entity_extraction/noop.rail @@ -13,8 +13,8 @@ - - + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. ${document} @@ -23,6 +23,7 @@ ${gr.xml_prefix_prompt} ${xml_output_schema} -${gr.xml_suffix_prompt_v2_wo_none} +${gr.xml_suffix_prompt_v2_wo_none} + \ No newline at end of file diff --git a/tests/integration_tests/test_assets/entity_extraction/reask.rail b/tests/integration_tests/test_assets/entity_extraction/reask.rail index 6a3bcb071..e8c642721 100644 --- a/tests/integration_tests/test_assets/entity_extraction/reask.rail +++ b/tests/integration_tests/test_assets/entity_extraction/reask.rail @@ -15,7 +15,8 @@ on-fail-two-words="reask"/> - + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. ${document} @@ -24,6 +25,7 @@ ${gr.xml_prefix_prompt} ${xml_output_schema} -${gr.xml_suffix_prompt_v2_wo_none} +${gr.xml_suffix_prompt_v2_wo_none} + \ No newline at end of file diff --git a/tests/integration_tests/test_assets/entity_extraction/refrain.rail b/tests/integration_tests/test_assets/entity_extraction/refrain.rail index 1801b38ba..f020e87d9 100644 --- a/tests/integration_tests/test_assets/entity_extraction/refrain.rail +++ b/tests/integration_tests/test_assets/entity_extraction/refrain.rail @@ -14,7 +14,8 @@ - + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. ${document} @@ -23,6 +24,6 @@ ${gr.xml_prefix_prompt} ${xml_output_schema} -${gr.xml_suffix_prompt_v2_wo_none} - +${gr.xml_suffix_prompt_v2_wo_none} + \ No newline at end of file diff --git a/tests/integration_tests/test_assets/entity_extraction/skeleton_reask.rail b/tests/integration_tests/test_assets/entity_extraction/skeleton_reask.rail index b8cf35448..e9ca3540e 100644 --- a/tests/integration_tests/test_assets/entity_extraction/skeleton_reask.rail +++ b/tests/integration_tests/test_assets/entity_extraction/skeleton_reask.rail @@ -11,8 +11,8 @@ - - + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. @@ -22,6 +22,7 @@ ${gr.xml_prefix_prompt} ${xml_output_schema} -${gr.xml_suffix_prompt_v2_wo_none} +${gr.xml_suffix_prompt_v2_wo_none} + \ No newline at end of file diff --git a/tests/integration_tests/test_data_validation.py b/tests/integration_tests/test_data_validation.py index 8a4c32865..27559a80a 100644 --- a/tests/integration_tests/test_data_validation.py +++ b/tests/integration_tests/test_data_validation.py @@ -60,11 +60,11 @@ def test_choice_validation(llm_output, raises, fails, has_error): - - + + Dummy prompt. - - + + """ guard = Guard.from_rail_string(rail_spec) @@ -117,7 +117,9 @@ class Flight(BaseModel): class Choice(BaseModel): choice: Union[Fight, Flight] = Field(..., discriminator="action") - guard = Guard.from_pydantic(output_class=Choice, prompt="Dummy prompt.") + guard = Guard.from_pydantic( + output_class=Choice, messages=[{"role": "user", "content": "Dummy prompt."}] + ) # If raises is True, then the test should raise an exception. # For our existing test cases this will always be a ValidationError diff --git a/tests/integration_tests/test_guard.py b/tests/integration_tests/test_guard.py index 4038ae18d..5f80c2318 100644 --- a/tests/integration_tests/test_guard.py +++ b/tests/integration_tests/test_guard.py @@ -26,8 +26,7 @@ ) from .mock_llm_outputs import ( - MockOpenAICallable, - MockOpenAIChatCallable, + MockLiteLLMCallable, entity_extraction, lists_object, ) @@ -149,7 +148,7 @@ def test_entity_extraction_with_reask( second time. """ mock_invoke_llm = mocker.patch( - "guardrails.llm_providers.OpenAICallable._invoke_llm" + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" ) second_response = ( entity_extraction.LLM_OUTPUT_FULL_REASK @@ -259,7 +258,7 @@ def test_entity_extraction_with_reask( ) def test_entity_extraction_with_noop(mocker, rail, prompt): """Test that the entity extraction works with re-asking.""" - mocker.patch("guardrails.llm_providers.OpenAICallable", new=MockOpenAICallable) + mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = guard_initializer(rail, prompt) @@ -305,7 +304,7 @@ def test_entity_extraction_with_noop(mocker, rail, prompt): ) def test_entity_extraction_with_filter(mocker, rail, prompt): """Test that the entity extraction works with re-asking.""" - mocker.patch("guardrails.llm_providers.OpenAICallable", new=MockOpenAICallable) + mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = guard_initializer(rail, prompt) @@ -340,7 +339,7 @@ def test_entity_extraction_with_filter(mocker, rail, prompt): ) def test_entity_extraction_with_fix(mocker, rail, prompt): """Test that the entity extraction works with re-asking.""" - mocker.patch("guardrails.llm_providers.OpenAICallable", new=MockOpenAICallable) + mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = guard_initializer(rail, prompt) @@ -376,7 +375,7 @@ def test_entity_extraction_with_fix(mocker, rail, prompt): ) def test_entity_extraction_with_refrain(mocker, rail, prompt): """Test that the entity extraction works with re-asking.""" - mocker.patch("guardrails.llm_providers.OpenAICallable", new=MockOpenAICallable) + mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = guard_initializer(rail, prompt) @@ -557,7 +556,7 @@ def test_entity_extraction_with_reask_with_optional_prompts( mock_openai_invoke_llm = None if llm_api == openai.completions.create: mock_openai_invoke_llm = mocker.patch( - "guardrails.llm_providers.OpenAICallable._invoke_llm" + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" ) else: mock_openai_invoke_llm = mocker.patch( @@ -572,7 +571,7 @@ def test_entity_extraction_with_reask_with_optional_prompts( llm_api=llm_api, prompt=prompt, instructions=instructions, - msg_history=history, + messages=history, prompt_params={"document": content[:6000]}, num_reasks=1, ) @@ -632,7 +631,7 @@ def test_skeleton_reask(mocker): from unittest.mock import patch with patch( - "guardrails.llm_providers.OpenAICallable._invoke_llm", + "guardrails.llm_providers.LiteLLMCallable._invoke_llm", side_effect=[ LLMResponse( output=entity_extraction.LLM_OUTPUT_SKELETON_REASK_1, @@ -705,13 +704,13 @@ def test_string_with_message_history_reask(mocker): reask.""" mocker.patch( "guardrails.llm_providers.OpenAIChatCallable", - new=MockOpenAIChatCallable, + new=MockLiteLLMCallable, ) - guard = gd.Guard.from_rail_string(string.RAIL_SPEC_FOR_MSG_HISTORY) + guard = gd.Guard.from_rail_string(string.RAIL_SPEC_FOR_messages) final_output = guard( llm_api=openai.chat.completions.create, - msg_history=string.MOVIE_MSG_HISTORY, + messages=string.MOVIE_messages, temperature=0.0, model="gpt-3.5-turbo", ) @@ -744,12 +743,12 @@ def test_pydantic_with_message_history_reask(mocker): ) mock_invoke_llm.side_effect = [ LLMResponse( - output=pydantic.MSG_HISTORY_LLM_OUTPUT_INCORRECT, + output=pydantic.messages_LLM_OUTPUT_INCORRECT, prompt_token_count=123, response_token_count=1234, ), LLMResponse( - output=pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT, + output=pydantic.messages_LLM_OUTPUT_CORRECT, prompt_token_count=123, response_token_count=1234, ), @@ -764,17 +763,17 @@ def test_pydantic_with_message_history_reask(mocker): }, ) - guard = gd.Guard.from_pydantic(output_class=pydantic.WITH_MSG_HISTORY) + guard = gd.Guard.from_pydantic(output_class=pydantic.WITH_messages) final_output = guard( llm_api=openai.chat.completions.create, - msg_history=string.MOVIE_MSG_HISTORY, + messages=string.MOVIE_messages, temperature=0.0, model="gpt-3.5-turbo", ) - assert final_output.raw_llm_output == pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT + assert final_output.raw_llm_output == pydantic.messages_LLM_OUTPUT_CORRECT assert final_output.validated_output == json.loads( - pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT + pydantic.messages_LLM_OUTPUT_CORRECT ) call = guard.history.first @@ -784,7 +783,7 @@ def test_pydantic_with_message_history_reask(mocker): assert call.compiled_instructions is None assert call.compiled_prompt is None - assert call.iterations.first.raw_output == pydantic.MSG_HISTORY_LLM_OUTPUT_INCORRECT + assert call.iterations.first.raw_output == pydantic.messages_LLM_OUTPUT_INCORRECT assert ( call.iterations.first.validation_response == pydantic.MSG_VALIDATED_OUTPUT_REASK ) @@ -792,13 +791,13 @@ def test_pydantic_with_message_history_reask(mocker): # For re-asked prompt and output assert call.reask_prompts.last == pydantic.MSG_COMPILED_PROMPT_REASK assert call.reask_instructions.last == pydantic.MSG_COMPILED_INSTRUCTIONS_REASK - assert call.raw_outputs.last == pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT - assert call.guarded_output == json.loads(pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT) + assert call.raw_outputs.last == pydantic.messages_LLM_OUTPUT_CORRECT + assert call.guarded_output == json.loads(pydantic.messages_LLM_OUTPUT_CORRECT) def test_sequential_validator_log_is_not_duplicated(mocker): mocker.patch( - "guardrails.llm_providers.OpenAICallable._invoke_llm", + "guardrails.llm_providers.LiteLLMCallable._invoke_llm", return_value=LLMResponse( output=entity_extraction.LLM_OUTPUT, prompt_token_count=123, @@ -841,7 +840,7 @@ def test_sequential_validator_log_is_not_duplicated(mocker): def test_in_memory_validator_log_is_not_duplicated(mocker): mocker.patch( - "guardrails.llm_providers.OpenAICallable._invoke_llm", + "guardrails.llm_providers.LiteLLMCallable._invoke_llm", return_value=LLMResponse( output=entity_extraction.LLM_OUTPUT, prompt_token_count=123, @@ -892,7 +891,7 @@ def custom_llm( prompt: Optional[str] = None, *args, instructions: Optional[str] = None, - msg_history: Optional[List[Dict[str, str]]] = None, + messages: Optional[List[Dict[str, str]]] = None, **kwargs, ) -> str: nonlocal return_value @@ -939,7 +938,7 @@ def test_guard_with_top_level_list_return_type(mocker, rail, prompt): # Create a Guard with a top level list return type # Mock the LLM - mocker.patch("guardrails.llm_providers.OpenAICallable", new=MockOpenAICallable) + mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) guard = guard_initializer(rail, prompt=prompt) @@ -960,34 +959,34 @@ def test_pydantic_with_lite_llm(mocker): ) mock_invoke_llm.side_effect = [ LLMResponse( - output=pydantic.MSG_HISTORY_LLM_OUTPUT_INCORRECT, + output=pydantic.messages_LLM_OUTPUT_INCORRECT, prompt_token_count=123, response_token_count=1234, ), LLMResponse( - output=pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT, + output=pydantic.messages_LLM_OUTPUT_CORRECT, prompt_token_count=123, response_token_count=1234, ), ] - guard = gd.Guard.from_pydantic(output_class=pydantic.WITH_MSG_HISTORY) + guard = gd.Guard.from_pydantic(output_class=pydantic.WITH_messages) final_output = guard( - messages=string.MOVIE_MSG_HISTORY, model="gpt-3.5-turbo", max_tokens=10 + messages=string.MOVIE_messages, model="gpt-3.5-turbo", max_tokens=10 ) - assert guard.history.last.inputs.msg_history == [ + assert guard.history.last.inputs.messages == [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Can you give me your favorite movie?"}, ] call = guard.history.first assert call.iterations.length == 2 - assert final_output.raw_llm_output == pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT + assert final_output.raw_llm_output == pydantic.messages_LLM_OUTPUT_CORRECT def test_string_output(mocker): """Test single string (non-JSON) generation.""" mock_invoke_llm = mocker.patch( - "guardrails.llm_providers.OpenAICallable._invoke_llm" + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" ) mock_invoke_llm.side_effect = [ LLMResponse( @@ -1082,7 +1081,7 @@ class Tasks(BaseModel): final_output = guard( llm_api=openai.chat.completions.create, - msg_history=[ + messages=[ { "role": "user", "content": "You are a helpful assistant" @@ -1118,7 +1117,7 @@ class Tasks(BaseModel): def test_string_reask(mocker): """Test single string (non-JSON) generation with re-asking.""" mock_invoke_llm = mocker.patch( - "guardrails.llm_providers.OpenAICallable._invoke_llm" + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" ) mock_invoke_llm.side_effect = [ LLMResponse( @@ -1269,7 +1268,7 @@ def test_guard_from_pydantic_with_mock_hf_model(): _ = guard( model.generate, tokenizer=tokenizer, - prompt="Don't care about the output.", + messages=[{"role": "user", "content": "Don't care about the output."}], ) @@ -1459,133 +1458,6 @@ def test_guard_use_many_same_instance_on_two_guards(self, mocker): # With 0.6.0 we can drop the baggage of # the prompt and instructions and just pass in the messages. class TestCustomLLMApi: - def test_with_prompt(self, mocker): - mock_llm = mocker.Mock() - - def custom_llm( - prompt: Optional[str] = None, - *args, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict[str, str]]] = None, - **kwargs, - ) -> str: - mock_llm( - prompt, - *args, - instructions=instructions, - msg_history=msg_history, - **kwargs, - ) - return "Not really, no. I'm just a static function." - - guard = Guard().use( - ValidLength(1, 100), - ) - output = guard( - llm_api=custom_llm, - prompt="Can you generate a list of 10 things that are not food?", - ) - - assert output.validation_passed is True - assert output.validated_output == "Not really, no. I'm just a static function." - mock_llm.assert_called_once_with( - "Can you generate a list of 10 things that are not food?", - instructions=None, - msg_history=None, - temperature=0, - ) - - def test_with_prompt_and_instructions(self, mocker): - mock_llm = mocker.Mock() - - def custom_llm( - prompt: Optional[str] = None, - *args, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict[str, str]]] = None, - **kwargs, - ) -> str: - mock_llm( - prompt, - *args, - instructions=instructions, - msg_history=msg_history, - **kwargs, - ) - return "Not really, no. I'm just a static function." - - guard = Guard().use( - ValidLength(1, 100), - ) - output = guard( - llm_api=custom_llm, - prompt="Can you generate a list of 10 things that are not food?", - instructions="You are a list generator. You can generate a list of things that are not food.", # noqa - ) - - assert output.validation_passed is True - assert output.validated_output == "Not really, no. I'm just a static function." - mock_llm.assert_called_once_with( - "Can you generate a list of 10 things that are not food?", - instructions="You are a list generator. You can generate a list of things that are not food.", # noqa - msg_history=None, - temperature=0, - ) - - def test_with_msg_history(self, mocker): - mock_llm = mocker.Mock() - - def custom_llm( - prompt: Optional[str] = None, - *args, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict[str, str]]] = None, - **kwargs, - ) -> str: - mock_llm( - prompt, - *args, - instructions=instructions, - msg_history=msg_history, - **kwargs, - ) - return "Not really, no. I'm just a static function." - - guard = Guard().use( - ValidLength(1, 100), - ) - output = guard( - llm_api=custom_llm, - msg_history=[ - { - "role": "system", - "content": "You are a list generator. You can generate a list of things that are not food.", # noqa - }, - { - "role": "user", - "content": "Can you generate a list of 10 things that are not food?", # noqa - }, - ], - ) - - assert output.validation_passed is True - assert output.validated_output == "Not really, no. I'm just a static function." - mock_llm.assert_called_once_with( - None, - instructions=None, - msg_history=[ - { - "role": "system", - "content": "You are a list generator. You can generate a list of things that are not food.", # noqa - }, - { - "role": "user", - "content": "Can you generate a list of 10 things that are not food?", # noqa - }, - ], - temperature=0, - ) - def test_with_messages(self, mocker): mock_llm = mocker.Mock() @@ -1593,14 +1465,14 @@ def custom_llm( prompt: Optional[str] = None, *args, instructions: Optional[str] = None, - msg_history: Optional[List[Dict[str, str]]] = None, + messages: Optional[List[Dict[str, str]]] = None, **kwargs, ) -> str: mock_llm( prompt, *args, instructions=instructions, - msg_history=msg_history, + messages=messages, **kwargs, ) return "Not really, no. I'm just a static function." @@ -1627,16 +1499,6 @@ def custom_llm( mock_llm.assert_called_once_with( None, instructions=None, - msg_history=[ - { - "role": "system", - "content": "You are a list generator. You can generate a list of things that are not food.", # noqa - }, - { - "role": "user", - "content": "Can you generate a list of 10 things that are not food?", # noqa - }, - ], messages=[ { "role": "system", diff --git a/tests/integration_tests/test_multi_reask.py b/tests/integration_tests/test_multi_reask.py index e3037b93d..b59a3e362 100644 --- a/tests/integration_tests/test_multi_reask.py +++ b/tests/integration_tests/test_multi_reask.py @@ -10,7 +10,7 @@ def test_multi_reask(mocker): """Test that parallel reasking works.""" mock_invoke_llm = mocker.patch( - "guardrails.llm_providers.OpenAICallable._invoke_llm" + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" ) mock_invoke_llm.side_effect = [ LLMResponse( diff --git a/tests/integration_tests/test_parsing.py b/tests/integration_tests/test_parsing.py index 22eb4dd23..33da4fad2 100644 --- a/tests/integration_tests/test_parsing.py +++ b/tests/integration_tests/test_parsing.py @@ -31,7 +31,8 @@ def test_parsing_reask(mocker): ] guard = gd.Guard.from_pydantic( - output_class=pydantic.PersonalDetails, prompt=pydantic.PARSING_INITIAL_PROMPT + output_class=pydantic.PersonalDetails, + messages=[{"role": "user", "content": pydantic.PARSING_INITIAL_PROMPT}], ) final_output = guard( diff --git a/tests/integration_tests/test_pydantic.py b/tests/integration_tests/test_pydantic.py index 9bc60105a..15610acb1 100644 --- a/tests/integration_tests/test_pydantic.py +++ b/tests/integration_tests/test_pydantic.py @@ -16,7 +16,7 @@ def test_pydantic_with_reask(mocker): """Test that the entity extraction works with re-asking.""" mock_invoke_llm = mocker.patch( - "guardrails.llm_providers.OpenAICallable._invoke_llm" + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" ) mock_invoke_llm.side_effect = [ LLMResponse( diff --git a/tests/integration_tests/test_python_rail.py b/tests/integration_tests/test_python_rail.py index eecfa4738..9c64becf9 100644 --- a/tests/integration_tests/test_python_rail.py +++ b/tests/integration_tests/test_python_rail.py @@ -17,7 +17,7 @@ ) from tests.integration_tests.test_assets.validators import ValidLength, TwoWords -from .mock_llm_outputs import MockOpenAICallable +from .mock_llm_outputs import MockLiteLLMCallable from .test_assets import python_rail, string @@ -176,7 +176,7 @@ def test_python_rail(mocker): def test_python_string(mocker): """Test single string (non-JSON) generation via pydantic with re-asking.""" - mocker.patch("guardrails.llm_providers.OpenAICallable", new=MockOpenAICallable) + mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) validators = [TwoWords(on_fail=OnFailAction.REASK)] description = "Name for the pizza" diff --git a/tests/integration_tests/test_run.py b/tests/integration_tests/test_run.py index 7190151d5..cd7d3af41 100644 --- a/tests/integration_tests/test_run.py +++ b/tests/integration_tests/test_run.py @@ -4,9 +4,7 @@ from guardrails.classes.history.iteration import Iteration from guardrails.classes.llm.llm_response import LLMResponse from guardrails.classes.output_type import OutputTypes -from guardrails.llm_providers import AsyncOpenAICallable, OpenAICallable -from guardrails.prompt.instructions import Instructions -from guardrails.prompt.prompt import Prompt +from guardrails.llm_providers import AsyncLiteLLMCallable, LiteLLMCallable from guardrails.run import AsyncRunner, Runner from guardrails.types.on_fail import OnFailAction @@ -33,10 +31,11 @@ def runner_instance(is_sync: bool): output_schema=OUTPUT_SCHEMA, num_reasks=0, validation_map=validation_map, - prompt=PROMPT, - instructions=INSTRUCTIONS, - msg_history=None, - api=OpenAICallable, + messages=[ + {"role": "system", "content": INSTRUCTIONS}, + {"role": "user", "content": PROMPT}, + ], + api=LiteLLMCallable, ) else: return AsyncRunner( @@ -44,17 +43,18 @@ def runner_instance(is_sync: bool): output_schema=OUTPUT_SCHEMA, num_reasks=0, validation_map=validation_map, - prompt=PROMPT, - instructions=INSTRUCTIONS, - msg_history=None, - api=AsyncOpenAICallable, + messages=[ + {"role": "system", "content": INSTRUCTIONS}, + {"role": "user", "content": PROMPT}, + ], + api=AsyncLiteLLMCallable, ) @pytest.mark.asyncio async def test_sync_async_validate_equivalence(mocker): mock_invoke_llm = mocker.patch( - "guardrails.llm_providers.AsyncOpenAICallable.invoke_llm", + "guardrails.llm_providers.AsyncLiteLLMCallable.invoke_llm", ) mock_invoke_llm.side_effect = [ LLMResponse( @@ -86,7 +86,7 @@ async def test_sync_async_validate_equivalence(mocker): @pytest.mark.asyncio async def test_sync_async_step_equivalence(mocker): mock_invoke_llm = mocker.patch( - "guardrails.llm_providers.AsyncOpenAICallable.invoke_llm", + "guardrails.llm_providers.AsyncLiteLLMCallable.invoke_llm", ) mock_invoke_llm.side_effect = [ LLMResponse( @@ -103,9 +103,11 @@ async def test_sync_async_step_equivalence(mocker): 1, OUTPUT_SCHEMA, call_log, - api=OpenAICallable(**{"temperature": 0}), - instructions=Instructions(INSTRUCTIONS), - prompt=Prompt(PROMPT), + api=LiteLLMCallable(**{"temperature": 0}), + messages=[ + {"role": "system", "content": INSTRUCTIONS}, + {"role": "user", "content": PROMPT}, + ], prompt_params={}, output=OUTPUT, ) @@ -115,9 +117,11 @@ async def test_sync_async_step_equivalence(mocker): 1, OUTPUT_SCHEMA, call_log, - api=AsyncOpenAICallable(**{"temperature": 0}), - instructions=Instructions(INSTRUCTIONS), - prompt=Prompt(PROMPT), + api=AsyncLiteLLMCallable(**{"temperature": 0}), + messages=[ + {"role": "system", "content": INSTRUCTIONS}, + {"role": "user", "content": PROMPT}, + ], prompt_params={}, output=OUTPUT, ) diff --git a/tests/integration_tests/test_streaming.py b/tests/integration_tests/test_streaming.py index acb24518d..c6eac4363 100644 --- a/tests/integration_tests/test_streaming.py +++ b/tests/integration_tests/test_streaming.py @@ -1,5 +1,5 @@ # 3 tests -# 1. Test streaming with OpenAICallable (mock openai.Completion.create) +# 1. Test streaming with LiteLLMCallable (mock openai.Completion.create) # 2. Test streaming with OpenAIChatCallable (mock openai.ChatCompletion.create) # 3. Test string schema streaming # Using the LowerCase Validator, and a custom validator to show new streaming behavior @@ -207,24 +207,38 @@ class MinSentenceLengthNoOp(BaseModel): ' too."}', ] +MESSAGES = [ + { + "role": "user", + "content": PROMPT, + } +] + +STR_MESSAGES = [ + { + "role": "user", + "content": STR_PROMPT, + } +] + @pytest.mark.parametrize( "guard, expected_validated_output", [ ( - gd.Guard.from_pydantic(output_class=LowerCaseNoop, prompt=PROMPT), + gd.Guard.from_pydantic(output_class=LowerCaseNoop, messages=MESSAGES), expected_noop_output, ), ( - gd.Guard.from_pydantic(output_class=LowerCaseFix, prompt=PROMPT), + gd.Guard.from_pydantic(output_class=LowerCaseFix, messages=MESSAGES), expected_fix_output, ), ( - gd.Guard.from_pydantic(output_class=LowerCaseFilter, prompt=PROMPT), + gd.Guard.from_pydantic(output_class=LowerCaseFilter, messages=MESSAGES), expected_filter_refrain_output, ), ( - gd.Guard.from_pydantic(output_class=LowerCaseRefrain, prompt=PROMPT), + gd.Guard.from_pydantic(output_class=LowerCaseRefrain, messages=MESSAGES), expected_filter_refrain_output, ), ], @@ -234,7 +248,7 @@ def test_streaming_with_openai_callable( guard, expected_validated_output, ): - """Test streaming with OpenAICallable. + """Test streaming with LiteLLMCallable. Mocks openai.Completion.create. """ @@ -268,19 +282,19 @@ def test_streaming_with_openai_callable( "guard, expected_validated_output", [ ( - gd.Guard.from_pydantic(output_class=LowerCaseNoop, prompt=PROMPT), + gd.Guard.from_pydantic(output_class=LowerCaseNoop, messages=MESSAGES), expected_noop_output, ), ( - gd.Guard.from_pydantic(output_class=LowerCaseFix, prompt=PROMPT), + gd.Guard.from_pydantic(output_class=LowerCaseFix, messages=MESSAGES), expected_fix_output, ), ( - gd.Guard.from_pydantic(output_class=LowerCaseFilter, prompt=PROMPT), + gd.Guard.from_pydantic(output_class=LowerCaseFilter, messages=MESSAGES), expected_filter_refrain_output, ), ( - gd.Guard.from_pydantic(output_class=LowerCaseRefrain, prompt=PROMPT), + gd.Guard.from_pydantic(output_class=LowerCaseRefrain, messages=MESSAGES), expected_filter_refrain_output, ), ], @@ -345,7 +359,7 @@ def test_streaming_with_openai_chat_callable( validators=[ MinSentenceLengthValidator(26, 30, on_fail=OnFailAction.NOOP) ], - prompt=STR_PROMPT, + messages=STR_MESSAGES, ), # each value is a tuple # first is expected text inside span @@ -437,7 +451,12 @@ def test_noop_behavior_two_validators(mocker): Make every third word all caps.""" gen = guard( llm_api=openai.chat.completions.create, - prompt=prompt, + messages=[ + { + "role": "user", + "content": prompt, + } + ], model="gpt-4", stream=True, ) @@ -475,7 +494,12 @@ def test_fix_behavior_one_validator(mocker): Make every third word all caps.""" gen = guard( llm_api=openai.chat.completions.create, - prompt=prompt, + messages=[ + { + "role": "user", + "content": prompt, + } + ], model="gpt-4", stream=True, ) @@ -518,7 +542,12 @@ def test_fix_behavior_two_validators(mocker): Make every third word all caps.""" gen = guard( llm_api=openai.chat.completions.create, - prompt=prompt, + messages=[ + { + "role": "user", + "content": prompt, + } + ], model="gpt-4", stream=True, ) @@ -571,7 +600,12 @@ def test_fix_behavior_three_validators(mocker): Make every third word all caps.""" gen = guard( llm_api=openai.chat.completions.create, - prompt=prompt, + messages=[ + { + "role": "user", + "content": prompt, + } + ], model="gpt-4", stream=True, ) @@ -626,7 +660,7 @@ def test_fix_behavior_three_validators(mocker): # Make every third word all caps.""" # gen = guard( # llm_api=openai.chat.completions.create, -# prompt=prompt, +# messages=MESSAGES, # model="gpt-4", # stream=True, # ) @@ -671,7 +705,12 @@ def test_refrain_behavior(mocker): Make every third word all caps.""" gen = guard( llm_api=openai.chat.completions.create, - prompt=prompt, + messages=[ + { + "role": "user", + "content": prompt, + } + ], model="gpt-4", stream=True, ) @@ -707,7 +746,12 @@ def test_filter_behavior(mocker): Make every third word all caps.""" gen = guard( llm_api=openai.chat.completions.create, - prompt=prompt, + messages=[ + { + "role": "user", + "content": prompt, + } + ], model="gpt-4", stream=True, ) diff --git a/tests/unit_tests/classes/history/test_call.py b/tests/unit_tests/classes/history/test_call.py index 8002ed65b..d0804ecf1 100644 --- a/tests/unit_tests/classes/history/test_call.py +++ b/tests/unit_tests/classes/history/test_call.py @@ -6,8 +6,6 @@ from guardrails.classes.history.outputs import Outputs from guardrails.constants import not_run_status, pass_status from guardrails.llm_providers import ArbitraryCallable -from guardrails.prompt.instructions import Instructions -from guardrails.prompt.prompt import Prompt from guardrails.classes.llm.llm_response import LLMResponse from guardrails.classes.validation.validator_logs import ValidatorLogs from guardrails.actions.reask import ReAsk @@ -19,13 +17,10 @@ def test_empty_initialization(): assert call.iterations == Stack() assert call.inputs == CallInputs() - assert call.prompt is None + assert call.messages is None assert call.prompt_params is None - assert call.compiled_prompt is None - assert call.reask_prompts == Stack() - assert call.instructions is None - assert call.compiled_instructions is None - assert call.reask_instructions == Stack() + assert call.compiled_messages is None + assert call.reask_messages == [] assert call.logs == Stack() assert call.tokens_consumed is None assert call.prompt_tokens_consumed is None @@ -51,16 +46,23 @@ def custom_llm(prompt, *args, instructions=None, msg_history=None, **kwargs): return "Hello there!" llm_api = custom_llm - prompt = "Respond with a ${greeting_type} greeting." - instructions = "You are a greeting bot." + messages = [ + { + "role": "system", + "content": "You are a greeting bot.", + }, + { + "role": "user", + "content": "Respond with a {greeting_type} greeting.", + }, + ] args = ["arg1"] kwargs = {"kwarg1": 1} prompt_params = {"greeting_type": "friendly"} call_inputs = CallInputs( llm_api=llm_api, - prompt=prompt, - instructions=instructions, + messages=messages, prompt_params=prompt_params, args=args, kwargs=kwargs, @@ -69,8 +71,6 @@ def custom_llm(prompt, *args, instructions=None, msg_history=None, **kwargs): # First Iteration Inputs iter_llm_api = ArbitraryCallable(llm_api=llm_api) llm_output = "Hello there!" - instructions = Instructions(source=instructions) - iter_prompt = Prompt(source=prompt) num_reasks = 0 metadata = {"some_meta_data": "doesn't actually matter"} full_schema_reask = False @@ -78,8 +78,7 @@ def custom_llm(prompt, *args, instructions=None, msg_history=None, **kwargs): inputs = Inputs( llm_api=iter_llm_api, llm_output=llm_output, - instructions=instructions, - prompt=iter_prompt, + messages=messages, prompt_params=prompt_params, num_reasks=num_reasks, metadata=metadata, @@ -121,13 +120,16 @@ def custom_llm(prompt, *args, instructions=None, msg_history=None, **kwargs): call_id="mock-call", index=0, inputs=inputs, outputs=first_outputs ) - second_iter_prompt = Prompt(source="That wasn't quite right. Try again.") - + second_iter_messages = [ + { + "role": "user", + "content": "That wasn't quite right. Try again.", + } + ] second_inputs = Inputs( llm_api=iter_llm_api, llm_output=llm_output, - instructions=instructions, - prompt=second_iter_prompt, + messages=second_iter_messages, num_reasks=num_reasks, metadata=metadata, full_schema_reask=full_schema_reask, @@ -169,13 +171,19 @@ def custom_llm(prompt, *args, instructions=None, msg_history=None, **kwargs): assert isinstance(call.iterations, Stack) is True assert call.inputs == call_inputs - assert call.prompt == prompt + assert call.messages == messages assert call.prompt_params == prompt_params - assert call.compiled_prompt == "Respond with a friendly greeting." - assert call.reask_prompts == Stack(second_iter_prompt.source) - assert call.instructions == instructions.source - assert call.compiled_instructions == instructions.source - assert call.reask_instructions == Stack(instructions.source) + assert call.compiled_messages == [ + { + "role": "system", + "content": "You are a greeting bot.", + }, + { + "role": "user", + "content": "Respond with a friendly greeting.", + }, + ] + assert call.reask_messages == Stack(second_iter_messages) # TODO: Test this in the integration tests assert call.logs == [] diff --git a/tests/unit_tests/classes/history/test_inputs.py b/tests/unit_tests/classes/history/test_inputs.py index 4ef221c48..7b0441dde 100644 --- a/tests/unit_tests/classes/history/test_inputs.py +++ b/tests/unit_tests/classes/history/test_inputs.py @@ -1,7 +1,5 @@ from guardrails.classes.history.inputs import Inputs -from guardrails.llm_providers import OpenAICallable -from guardrails.prompt.instructions import Instructions -from guardrails.prompt.prompt import Prompt +from guardrails.llm_providers import LiteLLMCallable # Guard against regressions in pydantic BaseModel @@ -20,12 +18,17 @@ def test_empty_initialization(): def test_non_empty_initialization(): - llm_api = OpenAICallable(text="Respond with a greeting.") + llm_api = LiteLLMCallable(text="Respond with a greeting.") llm_output = "Hello there!" - instructions = Instructions(source="You are a greeting bot.") - prompt = Prompt(source="Respond with a ${greeting_type} greeting.") - msg_history = [ - {"some_key": "doesn't actually matter because this isn't that strongly typed"} + messages = [ + { + "role": "system", + "content": "You are a greeting bot.", + }, + { + "role": "user", + "content": "Respond with a ${greeting_type} greeting.", + }, ] prompt_params = {"greeting_type": "friendly"} num_reasks = 0 @@ -35,9 +38,7 @@ def test_non_empty_initialization(): inputs = Inputs( llm_api=llm_api, llm_output=llm_output, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, num_reasks=num_reasks, metadata=metadata, @@ -48,12 +49,8 @@ def test_non_empty_initialization(): assert inputs.llm_api == llm_api assert inputs.llm_output is not None assert inputs.llm_output == llm_output - assert inputs.instructions is not None - assert inputs.instructions == instructions - assert inputs.prompt is not None - assert inputs.prompt == prompt - assert inputs.msg_history is not None - assert inputs.msg_history == msg_history + assert inputs.messages is not None + assert inputs.messages == messages assert inputs.prompt_params is not None assert inputs.prompt_params == prompt_params assert inputs.num_reasks is not None diff --git a/tests/unit_tests/classes/history/test_iteration.py b/tests/unit_tests/classes/history/test_iteration.py index 38bc05d73..6bcf1a7e3 100644 --- a/tests/unit_tests/classes/history/test_iteration.py +++ b/tests/unit_tests/classes/history/test_iteration.py @@ -3,9 +3,7 @@ from guardrails.classes.history.iteration import Iteration from guardrails.classes.history.outputs import Outputs from guardrails.constants import error_status, not_run_status -from guardrails.llm_providers import OpenAICallable -from guardrails.prompt.instructions import Instructions -from guardrails.prompt.prompt import Prompt +from guardrails.llm_providers import LiteLLMCallable from guardrails.classes.llm.llm_response import LLMResponse from guardrails.classes.validation.validator_logs import ValidatorLogs from guardrails.actions.reask import FieldReAsk @@ -38,12 +36,17 @@ def test_empty_initialization(): def test_non_empty_initialization(): # Inputs - llm_api = OpenAICallable(text="Respond with a greeting.") + llm_api = LiteLLMCallable(text="Respond with a greeting.") llm_output = "Hello there!" - instructions = Instructions(source="You are a greeting bot.") - prompt = Prompt(source="Respond with a ${greeting_type} greeting.") - msg_history = [ - {"some_key": "doesn't actually matter because this isn't that strongly typed"} + messages = [ + { + "role": "system", + "content": "You are a greeting bot.", + }, + { + "role": "user", + "content": "Respond with a ${greeting_type} greeting.", + }, ] prompt_params = {"greeting_type": "friendly"} num_reasks = 0 @@ -53,9 +56,7 @@ def test_non_empty_initialization(): inputs = Inputs( llm_api=llm_api, llm_output=llm_output, - instructions=instructions, - prompt=prompt, - msg_history=msg_history, + messages=messages, prompt_params=prompt_params, num_reasks=num_reasks, metadata=metadata, diff --git a/tests/unit_tests/test_async_guard.py b/tests/unit_tests/test_async_guard.py index 0fca512da..683d0dd83 100644 --- a/tests/unit_tests/test_async_guard.py +++ b/tests/unit_tests/test_async_guard.py @@ -196,7 +196,7 @@ class TestClass(BaseModel): py_guard.use(EndsWith("a")) assert py_guard._validator_map.get("$") == [EndsWith("a")] - # Use a combination of prompt, instructions, msg_history and output validators + # Use a combination of prompt, instructions, messages and output validators # Should only have the output validators in the guard, # everything else is in the schema guard: AsyncGuard = ( @@ -204,7 +204,7 @@ class TestClass(BaseModel): .use(LowerCase, on="prompt") .use(OneLine, on="prompt") .use(UpperCase, on="instructions") - .use(LowerCase, on="msg_history") + .use(LowerCase, on="messages") .use( EndsWith, end="a", on="output" ) # default on="output", still explicitly set @@ -213,7 +213,7 @@ class TestClass(BaseModel): ) # default on="output", implicitly set ) - # Check schemas for prompt, instructions and msg_history validators + # Check schemas for prompt, instructions and messages validators prompt_validators = guard._validator_map.get("prompt") assert len(prompt_validators) == 2 assert prompt_validators[0].__class__.__name__ == "LowerCase" @@ -223,9 +223,9 @@ class TestClass(BaseModel): assert len(instructions_validators) == 1 assert instructions_validators[0].__class__.__name__ == "UpperCase" - msg_history_validators = guard._validator_map.get("msg_history") - assert len(msg_history_validators) == 1 - assert msg_history_validators[0].__class__.__name__ == "LowerCase" + messages_validators = guard._validator_map.get("messages") + assert len(messages_validators) == 1 + assert messages_validators[0].__class__.__name__ == "LowerCase" # Check guard for output validators assert len(guard._validators) == 6 # 2 + 1 + 1 + 2 = 6 @@ -352,16 +352,16 @@ class TestClass(BaseModel): assert instructions_validators[2].__class__.__name__ == "TwoWords" assert len(guard._validators) == 3 - # Test with explicitly setting the "on" parameter = "msg_history" + # Test with explicitly setting the "on" parameter = "messages" guard: AsyncGuard = AsyncGuard().use_many( - OneLine(), LowerCase(), TwoWords(on_fail=OnFailAction.REASK), on="msg_history" + OneLine(), LowerCase(), TwoWords(on_fail=OnFailAction.REASK), on="messages" ) - msg_history_validators = guard._validator_map.get("msg_history") - assert len(msg_history_validators) == 3 - assert msg_history_validators[0].__class__.__name__ == "OneLine" - assert msg_history_validators[1].__class__.__name__ == "LowerCase" - assert msg_history_validators[2].__class__.__name__ == "TwoWords" + messages_validators = guard._validator_map.get("messages") + assert len(messages_validators) == 3 + assert messages_validators[0].__class__.__name__ == "OneLine" + assert messages_validators[1].__class__.__name__ == "LowerCase" + assert messages_validators[2].__class__.__name__ == "TwoWords" assert len(guard._validators) == 3 # Test with an unrecognized "on" parameter, should warn with a UserWarning @@ -486,13 +486,13 @@ async def test_output_only_failure(self): @pytest.mark.asyncio async def test_on_many_success(self): # Test with a combination of prompt, output, - # instructions and msg_history validators + # instructions and messages validators # Should still only use the output validators to validate the output guard: AsyncGuard = ( AsyncGuard() - .use(OneLine, on="prompt") - .use(LowerCase, on="instructions") - .use(UpperCase, on="msg_history") + .use(OneLine, on="messages") + .use(LowerCase, on="messages") + .use(UpperCase, on="messages") .use(LowerCase, on="output", on_fail=OnFailAction.FIX) .use(TwoWords) .use(ValidLength, 0, 12, on_fail=OnFailAction.REFRAIN) @@ -509,9 +509,9 @@ async def test_on_many_success(self): async def test_on_many_failure(self): guard: AsyncGuard = ( AsyncGuard() - .use(OneLine, on="prompt") - .use(LowerCase, on="instructions") - .use(UpperCase, on="msg_history") + .use(OneLine, on="messages") + .use(LowerCase, on="messages") + .use(UpperCase, on="messages") .use(LowerCase, on="output", on_fail=OnFailAction.FIX) .use(TwoWords) .use(ValidLength, 0, 12, on_fail=OnFailAction.REFRAIN) @@ -528,9 +528,7 @@ async def test_on_many_failure(self): def test_use_and_use_many(): guard: AsyncGuard = ( AsyncGuard() - .use_many(OneLine(), LowerCase(), on="prompt") - .use(UpperCase, on="instructions") - .use(LowerCase, on="msg_history") + .use(UpperCase, on="messages") .use_many( TwoWords(on_fail=OnFailAction.REASK), ValidLength(0, 12, on_fail=OnFailAction.REFRAIN), @@ -538,42 +536,37 @@ def test_use_and_use_many(): ) ) - # Check schemas for prompt, instructions and msg_history validators - prompt_validators = guard._validator_map.get("prompt") - assert len(prompt_validators) == 2 - assert prompt_validators[0].__class__.__name__ == "OneLine" - assert prompt_validators[1].__class__.__name__ == "LowerCase" + # Check schemas for prompt, instructions and messages validators + output_validators = guard._validator_map.get("$") - instructions_validators = guard._validator_map.get("instructions") - assert len(instructions_validators) == 1 - assert instructions_validators[0].__class__.__name__ == "UpperCase" + assert len(output_validators) == 2 + assert output_validators[0].__class__.__name__ == "TwoWords" + assert output_validators[1].__class__.__name__ == "ValidLength" - msg_history_validators = guard._validator_map.get("msg_history") - assert len(msg_history_validators) == 1 - assert msg_history_validators[0].__class__.__name__ == "LowerCase" + messages_validators = guard._validator_map.get("messages") + assert len(messages_validators) == 1 + assert messages_validators[0].__class__.__name__ == "UpperCase" # Check guard for output validators - assert len(guard._validators) == 6 # 2 + 1 + 1 + 2 = 6 + assert len(guard._validators) == 3 # 2 + 1 + 1 + 2 = 6 - assert isinstance(guard._validators[4], TwoWords) - assert guard._validators[4].on_fail_descriptor == OnFailAction.REASK # bc we set it + assert isinstance(guard._validators[1], TwoWords) + assert guard._validators[1].on_fail_descriptor == OnFailAction.REASK # bc we set it - assert isinstance(guard._validators[5], ValidLength) - assert guard._validators[5]._min == 0 - assert guard._validators[5]._kwargs["min"] == 0 - assert guard._validators[5]._max == 12 - assert guard._validators[5]._kwargs["max"] == 12 + assert isinstance(guard._validators[2], ValidLength) + assert guard._validators[2]._min == 0 + assert guard._validators[2]._kwargs["min"] == 0 + assert guard._validators[2]._max == 12 + assert guard._validators[2]._kwargs["max"] == 12 assert ( - guard._validators[5].on_fail_descriptor == OnFailAction.REFRAIN + guard._validators[2].on_fail_descriptor == OnFailAction.REFRAIN ) # bc we set it # Test with an unrecognized "on" parameter, should warn with a UserWarning with pytest.warns(UserWarning): guard: AsyncGuard = ( AsyncGuard() - .use_many(OneLine(), LowerCase(), on="prompt") - .use(UpperCase, on="instructions") - .use(LowerCase, on="msg_history") + .use(LowerCase, on="messages") .use_many( TwoWords(on_fail=OnFailAction.REASK), ValidLength(0, 12, on_fail=OnFailAction.REFRAIN), diff --git a/tests/unit_tests/test_llm_providers.py b/tests/unit_tests/test_llm_providers.py index 9d3d453ee..db57c8aaf 100644 --- a/tests/unit_tests/test_llm_providers.py +++ b/tests/unit_tests/test_llm_providers.py @@ -1,11 +1,10 @@ import importlib.util import os from dataclasses import dataclass -from typing import Any, Callable, Dict, Iterable, List +from typing import Any, Callable, Dict, List from unittest.mock import MagicMock import pytest -from pydantic import BaseModel from guardrails.llm_providers import ( ArbitraryCallable, @@ -155,100 +154,6 @@ def gen(): return gen() -def test_openai_callable(mocker, openai_mock): - mocker.patch("openai.resources.Completions.create", return_value=openai_mock) - - from guardrails.llm_providers import OpenAICallable - - openai_callable = OpenAICallable() - - response = openai_callable(text="Hello") - - assert isinstance(response, LLMResponse) is True - assert response.output == "Mocked LLM output" - assert response.prompt_token_count == 10 - assert response.response_token_count == 20 - - -def test_openai_stream_callable(mocker, openai_stream_mock): - mocker.patch("openai.resources.Completions.create", return_value=openai_stream_mock) - - from guardrails.llm_providers import OpenAICallable - - openai_callable = OpenAICallable() - response = openai_callable(text="1,2,3,", stream=True) - - assert isinstance(response, LLMResponse) is True - assert isinstance(response.stream_output, Iterable) is True - - actual_op = None - i = 4 - for fragment in response.stream_output: - actual_op = fragment["choices"][0]["text"] - assert actual_op == f"{i}," - i += 1 - - -def test_openai_chat_callable(mocker, openai_chat_mock): - mocker.patch( - "openai.resources.chat.completions.Completions.create", - return_value=openai_chat_mock, - ) - from guardrails.llm_providers import OpenAIChatCallable - - openai_chat_callable = OpenAIChatCallable() - response = openai_chat_callable(text="Hello") - - assert isinstance(response, LLMResponse) is True - assert response.output == "Mocked LLM output" - assert response.prompt_token_count == 10 - assert response.response_token_count == 20 - - -def test_openai_chat_stream_callable(mocker, openai_chat_stream_mock): - mocker.patch( - "openai.resources.chat.completions.Completions.create", - return_value=openai_chat_stream_mock, - ) - from guardrails.llm_providers import OpenAIChatCallable - - openai_chat_callable = OpenAIChatCallable() - response = openai_chat_callable(text="1,2,3,", stream=True) - - assert isinstance(response, LLMResponse) is True - assert isinstance(response.stream_output, Iterable) is True - - actual_op = None - i = 4 - for fragment in response.stream_output: - actual_op = fragment["choices"][0]["delta"]["content"] - assert actual_op == f"{i}," - i += 1 - - -def test_openai_chat_model_callable(mocker, openai_chat_mock): - mocker.patch( - "openai.resources.chat.completions.Completions.create", - return_value=openai_chat_mock, - ) - - from guardrails.llm_providers import OpenAIChatCallable - - class MyModel(BaseModel): - a: str - - openai_chat_model_callable = OpenAIChatCallable() - response = openai_chat_model_callable( - text="Hello", - base_model=MyModel, - ) - - assert isinstance(response, LLMResponse) is True - assert response.output == "Mocked LLM output" - assert response.prompt_token_count == 10 - assert response.response_token_count == 20 - - @pytest.mark.skipif( not importlib.util.find_spec("manifest"), reason="manifest-ml is not installed", @@ -421,38 +326,6 @@ def test_get_llm_ask_temperature(llm_api, args, kwargs, expected_temperature): assert result.init_kwargs["temperature"] == expected_temperature -@pytest.mark.skipif( - not importlib.util.find_spec("openai"), - reason="openai is not installed", -) -def test_get_llm_ask_openai_completion(): - import openai - - from guardrails.llm_providers import OpenAICallable - - completion_create = None - completion_create = openai.completions.create - prompt_callable = get_llm_ask(completion_create) - - assert isinstance(prompt_callable, OpenAICallable) - - -@pytest.mark.skipif( - not importlib.util.find_spec("openai"), - reason="openai is not installed", -) -def test_get_llm_ask_openai_chat(): - import openai - - from guardrails.llm_providers import OpenAIChatCallable - - chat_completion_create = openai.chat.completions.create - - prompt_callable = get_llm_ask(chat_completion_create) - - assert isinstance(prompt_callable, OpenAIChatCallable) - - @pytest.mark.skipif( not importlib.util.find_spec("manifest"), reason="manifest is not installed", @@ -476,54 +349,6 @@ def mock_os_environ_get(key, *args): assert isinstance(prompt_callable, ManifestCallable) -@pytest.mark.skipif( - not importlib.util.find_spec("cohere"), - reason="cohere is not installed", -) -def test_get_llm_ask_cohere(): - from cohere import Client - - from guardrails.llm_providers import CohereCallable - - cohere_client = Client(api_key="mock_api_key") - - prompt_callable = get_llm_ask(cohere_client.chat) - - assert isinstance(prompt_callable, CohereCallable) - - -@pytest.mark.skipif( - not importlib.util.find_spec("cohere"), - reason="cohere is not installed", -) -def test_get_llm_ask_cohere_legacy(): - from cohere import Client - - from guardrails.llm_providers import CohereCallable - - cohere_client = Client(api_key="mock_api_key") - - prompt_callable = get_llm_ask(cohere_client.generate) - - assert isinstance(prompt_callable, CohereCallable) - - -@pytest.mark.skipif( - not importlib.util.find_spec("anthropic"), - reason="anthropic is not installed", -) -def test_get_llm_ask_anthropic(): - if importlib.util.find_spec("anthropic"): - from anthropic import Anthropic - - from guardrails.llm_providers import AnthropicCallable - - anthropic_client = Anthropic(api_key="my_api_key") - prompt_callable = get_llm_ask(anthropic_client.completions.create) - - assert isinstance(prompt_callable, AnthropicCallable) - - @pytest.mark.skipif( not importlib.util.find_spec("transformers"), reason="transformers is not installed", diff --git a/tests/unit_tests/test_prompt.py b/tests/unit_tests/test_prompt.py index 7c933ecea..dbef98cc3 100644 --- a/tests/unit_tests/test_prompt.py +++ b/tests/unit_tests/test_prompt.py @@ -26,17 +26,18 @@ - + + {INSTRUCTIONS} - - - + + {PROMPT} - + + """ @@ -46,17 +47,18 @@ - + + ${user_instructions} - - - + + ${user_prompt} - + + """ @@ -66,18 +68,19 @@ - + + You are a helpful bot, who answers only with valid JSON - - - + + Extract a string from the text ${gr.complete_json_suffix_v2} - + + """ @@ -86,67 +89,76 @@ - + + You are a helpful bot, who answers only with valid JSON - - - + + Extract a string from the text @gr.complete_json_suffix_v2 - + + """ -RAIL_WITH_REASK_PROMPT = """ +RAIL_WITH_REASK_MESSAGES_USER = """ - + + You are a helpful bot, who answers only with valid JSON - - - + + ${gr.complete_json_suffix_v2} - - + + + + + Please try that again, extract a string from the text ${xml_output_schema} ${previous_response} - + + """ -RAIL_WITH_REASK_INSTRUCTIONS = """ +RAIL_WITH_REASK_MESSAGES_USER_AND_SYSTEM = """ - + + You are a helpful bot, who answers only with valid JSON - - - + + Extract a string from the text ${gr.complete_json_suffix_v2} - - + + + + + Please try that again, extract a string from the text ${xml_output_schema} ${previous_response} - - + + You are a helpful bot, who answers only with valid JSON - + + """ @@ -156,9 +168,9 @@ def test_parse_prompt(): guard = gd.Guard.from_rail_string(SIMPLE_RAIL_SPEC) # Strip both, raw and parsed, to be safe - instructions = Instructions(guard._exec_opts.instructions) + instructions = Instructions(guard._exec_opts.messages[0]["content"]) assert instructions.format().source.strip() == INSTRUCTIONS.strip() - prompt = Prompt(guard._exec_opts.prompt) + prompt = Prompt(guard._exec_opts.messages[1]["content"]) assert prompt.format().source.strip() == PROMPT.strip() @@ -169,12 +181,12 @@ def test_instructions_with_params(): user_instructions = "A useful system message." user_prompt = "A useful prompt." - instructions = Instructions(guard._exec_opts.instructions) + instructions = Instructions(guard._exec_opts.messages[0]["content"]) assert ( instructions.format(user_instructions=user_instructions).source.strip() == user_instructions.strip() ) - prompt = Prompt(guard._exec_opts.prompt) + prompt = Prompt(guard._exec_opts.messages[1]["content"]) assert prompt.format(user_prompt=user_prompt).source.strip() == user_prompt.strip() @@ -189,7 +201,7 @@ def test_variable_names(rail, var_names): """Test extracting variable names from a prompt.""" guard = gd.Guard.from_rail_string(rail) - prompt = Prompt(guard._exec_opts.prompt) + prompt = Prompt(guard._exec_opts.messages[1]["content"]) assert prompt.variable_names == var_names @@ -210,18 +222,20 @@ def test_format_instructions(): .safe_substitute(output_schema=output_schema) .rstrip() ) - prompt = Prompt(guard._exec_opts.prompt, output_schema=output_schema) + prompt = Prompt( + guard._exec_opts.messages[1]["content"], output_schema=output_schema + ) assert prompt.format_instructions.rstrip() == expected_instructions -def test_reask_prompt(): - guard = gd.Guard.from_rail_string(RAIL_WITH_REASK_PROMPT) - assert guard._exec_opts.reask_prompt == REASK_PROMPT +def test_reask_messages_user(): + guard = gd.Guard.from_rail_string(RAIL_WITH_REASK_MESSAGES_USER) + assert guard._exec_opts.reask_messages[0]["content"] == REASK_PROMPT -def test_reask_instructions(): - guard = gd.Guard.from_rail_string(RAIL_WITH_REASK_INSTRUCTIONS) - assert guard._exec_opts.reask_instructions == INSTRUCTIONS +def test_reask_messages_user_and_system(): + guard = gd.Guard.from_rail_string(RAIL_WITH_REASK_MESSAGES_USER_AND_SYSTEM) + assert guard._exec_opts.reask_messages[1]["content"] == INSTRUCTIONS @pytest.mark.parametrize( @@ -247,9 +261,15 @@ class TestResponse(BaseModel): def test_gr_prefixed_prompt_item_passes(): # From pydantic: prompt = """Give me a response to ${grade}""" - - guard = gd.Guard.from_pydantic(output_class=TestResponse, prompt=prompt) - prompt = Prompt(guard._exec_opts.prompt) + messages = [ + { + "role": "user", + "content": prompt, + } + ] + + guard = gd.Guard.from_pydantic(output_class=TestResponse, messages=messages) + prompt = Prompt(guard._exec_opts.messages[0]["content"]) assert len(prompt.variable_names) == 1 diff --git a/tests/unit_tests/test_validator_base.py b/tests/unit_tests/test_validator_base.py index 6a8459822..01e97a2cd 100644 --- a/tests/unit_tests/test_validator_base.py +++ b/tests/unit_tests/test_validator_base.py @@ -238,7 +238,12 @@ def test_deprecated_on_fail_handler(self): ${gr.complete_json_suffix_v2} """ - + messages = [ + { + "role": "user", + "content": prompt, + } + ] output = """ { "pet_type": "dog", @@ -261,7 +266,7 @@ class Pet(BaseModel): pet_type: str = Field(description="Species of pet", validators=[validator]) name: str = Field(description="a unique pet name") - guard = Guard.from_pydantic(output_class=Pet, prompt=prompt) + guard = Guard.from_pydantic(output_class=Pet, messages=messages) response = guard.parse(output, num_reasks=0) assert response.validation_passed is True @@ -273,7 +278,12 @@ def test_custom_fix(self): ${gr.complete_json_suffix_v2} """ - + messages = [ + { + "role": "user", + "content": prompt, + } + ] output = """ { "pet_type": "dog", @@ -288,7 +298,7 @@ class Pet(BaseModel): pet_type: str = Field(description="Species of pet", validators=[validator]) name: str = Field(description="a unique pet name") - guard = Guard.from_pydantic(output_class=Pet, prompt=prompt) + guard = Guard.from_pydantic(output_class=Pet, messages=messages) response = guard.parse(output, num_reasks=0) assert response.validation_passed is True @@ -300,7 +310,12 @@ def test_custom_reask(self): ${gr.complete_json_suffix_v2} """ - + messages = [ + { + "role": "user", + "content": prompt, + } + ] output = """ { "pet_type": "dog", @@ -324,7 +339,7 @@ class Pet(BaseModel): pet_type: str = Field(description="Species of pet", validators=[validator]) name: str = Field(description="a unique pet name") - guard = Guard.from_pydantic(output_class=Pet, prompt=prompt) + guard = Guard.from_pydantic(output_class=Pet, messages=messages) response = guard.parse(output, num_reasks=0) @@ -339,7 +354,12 @@ def test_custom_exception(self): ${gr.complete_json_suffix_v2} """ - + messages = [ + { + "role": "user", + "content": prompt, + } + ] output = """ { "pet_type": "dog", @@ -353,7 +373,7 @@ class Pet(BaseModel): pet_type: str = Field(description="Species of pet", validators=[validator]) name: str = Field(description="a unique pet name") - guard = Guard.from_pydantic(output_class=Pet, prompt=prompt) + guard = Guard.from_pydantic(output_class=Pet, messages=messages) with pytest.raises(ValidationError) as excinfo: guard.parse(output, num_reasks=0) @@ -365,7 +385,12 @@ def test_custom_filter(self): ${gr.complete_json_suffix_v2} """ - + messages = [ + { + "role": "user", + "content": prompt, + } + ] output = """ { "pet_type": "dog", @@ -379,7 +404,7 @@ class Pet(BaseModel): pet_type: str = Field(description="Species of pet", validators=[validator]) name: str = Field(description="a unique pet name") - guard = Guard.from_pydantic(output_class=Pet, prompt=prompt) + guard = Guard.from_pydantic(output_class=Pet, messages=messages) response = guard.parse(output, num_reasks=0) @@ -394,7 +419,12 @@ def test_custom_refrain(self): ${gr.complete_json_suffix_v2} """ - + messages = [ + { + "role": "user", + "content": prompt, + } + ] output = """ { "pet_type": "dog", @@ -408,7 +438,7 @@ class Pet(BaseModel): pet_type: str = Field(description="Species of pet", validators=[validator]) name: str = Field(description="a unique pet name") - guard = Guard.from_pydantic(output_class=Pet, prompt=prompt) + guard = Guard.from_pydantic(output_class=Pet, messages=messages) response = guard.parse(output, num_reasks=0) @@ -421,16 +451,21 @@ class Pet(BaseModel): def test_input_validation_fix(mocker): - def mock_llm_api(prompt, *args, instructions=None, msg_history=None, **kwargs): + def mock_llm_api(prompt, *args, instructions=None, messages=None, **kwargs): return json.dumps({"name": "Fluffy"}) # fix returns an amended value for prompt/instructions validation, guard = Guard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=OnFailAction.FIX), on="prompt") + guard.use(TwoWords(on_fail=OnFailAction.FIX), on="messages") guard( mock_llm_api, - prompt="What kind of pet should I get?", + messages=[ + { + "role": "user", + "content": "What kind of pet should I get?", + } + ], ) assert ( guard.history.first.iterations.first.outputs.validation_response == "What kind" @@ -448,14 +483,14 @@ def mock_llm_api(prompt, *args, instructions=None, msg_history=None, **kwargs): == "But really," ) - # but raises for msg_history validation + # but raises for messages validation guard = Guard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=OnFailAction.FIX), on="msg_history") + guard.use(TwoWords(on_fail=OnFailAction.FIX), on="messages") with pytest.raises(ValidationError) as excinfo: guard( mock_llm_api, - msg_history=[ + messages=[ { "role": "user", "content": "What kind of pet should I get?", @@ -513,45 +548,52 @@ def mock_llm_api(prompt, *args, instructions=None, msg_history=None, **kwargs): @pytest.mark.asyncio -async def test_async_input_validation_fix(mocker): - async def mock_llm_api( - prompt, *args, instructions=None, msg_history=None, **kwargs - ) -> str: +async def test_async_messages_validation_fix(mocker): + async def mock_llm_api(*args, instructions=None, messages=None, **kwargs) -> str: return json.dumps({"name": "Fluffy"}) # fix returns an amended value for prompt/instructions validation, guard = AsyncGuard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=OnFailAction.FIX), on="prompt") + guard.use(TwoWords(on_fail=OnFailAction.FIX), on="messages") await guard( mock_llm_api, - prompt="What kind of pet should I get?", + messages=[ + { + "role": "user", + "content": "What kind of pet should I get?", + } + ], ) assert ( guard.history.first.iterations.first.outputs.validation_response == "What kind" ) guard = AsyncGuard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=OnFailAction.FIX), on="instructions") + guard.use(TwoWords(on_fail=OnFailAction.FIX), on="messages") await guard( mock_llm_api, - prompt="What kind of pet should I get and what should I name it?", - instructions="But really, what kind of pet should I get?", + messages=[ + { + "role": "user", + "content": "But really, what kind of pet should I get?", + } + ], ) assert ( guard.history.first.iterations.first.outputs.validation_response == "But really," ) - # but raises for msg_history validation + # but raises for messages validation guard = AsyncGuard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=OnFailAction.FIX), on="msg_history") + guard.use(TwoWords(on_fail=OnFailAction.FIX), on="messages") with pytest.raises(ValidationError) as excinfo: await guard( mock_llm_api, - msg_history=[ + messages=[ { "role": "user", "content": "What kind of pet should I get?", @@ -566,12 +608,12 @@ async def mock_llm_api( guard = AsyncGuard.from_rail_string( """ - -This is not two words - +This is not two words + @@ -582,131 +624,62 @@ async def mock_llm_api( ) assert guard.history.first.iterations.first.outputs.validation_response == "This is" - # rail instructions validation - guard = AsyncGuard.from_rail_string( - """ - - -This is not two words - - -This also is not two words - - - - -""" - ) - await guard( - mock_llm_api, - ) - assert ( - guard.history.first.iterations.first.outputs.validation_response == "This also" - ) - @pytest.mark.parametrize( - "on_fail," - "structured_prompt_error," - "structured_instructions_error," - "structured_message_history_error," - "unstructured_prompt_error," - "unstructured_instructions_error", + "on_fail," "structured_messages_error," "unstructured_messages_error,", [ ( OnFailAction.REASK, - "Prompt validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa - "Instructions validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa - "Message history validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa - "Prompt validation failed: incorrect_value='\\nThis is not two words\\n' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='This is', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa - "Instructions validation failed: incorrect_value='\\nThis also is not two words\\n' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='This also', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa + "Message validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa + "Message validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa ), ( OnFailAction.FILTER, - "Prompt validation failed", - "Instructions validation failed", - "Message history validation failed", - "Prompt validation failed", - "Instructions validation failed", + "Message validation failed", + "Message validation failed", ), ( OnFailAction.REFRAIN, - "Prompt validation failed", - "Instructions validation failed", - "Message history validation failed", - "Prompt validation failed", - "Instructions validation failed", + "Message validation failed", + "Message validation failed", ), ( OnFailAction.EXCEPTION, "Validation failed for field with errors: must be exactly two words", "Validation failed for field with errors: must be exactly two words", - "Validation failed for field with errors: must be exactly two words", - "Validation failed for field with errors: must be exactly two words", - "Validation failed for field with errors: must be exactly two words", ), ], ) def test_input_validation_fail( on_fail, - structured_prompt_error, - structured_instructions_error, - structured_message_history_error, - unstructured_prompt_error, - unstructured_instructions_error, + structured_messages_error, + unstructured_messages_error, ): # With Prompt Validation guard = Guard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=on_fail), on="prompt") + guard.use(TwoWords(on_fail=on_fail), on="messages") - def custom_llm(prompt, *args, instructions=None, msg_history=None, **kwargs): + def custom_llm(prompt, *args, instructions=None, messages=None, **kwargs): raise Exception( "LLM was called when it should not have been!" "Input Validation did not raise as expected!" ) - with pytest.raises(ValidationError) as excinfo: - guard( - custom_llm, - prompt="What kind of pet should I get?", - ) - assert str(excinfo.value) == structured_prompt_error - assert isinstance(guard.history.last.exception, ValidationError) - assert guard.history.last.exception == excinfo.value - - # With Instructions Validation - guard = Guard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=on_fail), on="instructions") - - with pytest.raises(ValidationError) as excinfo: - guard( - custom_llm, - prompt="What kind of pet should I get and what should I name it?", - instructions="What kind of pet should I get?", - ) - - assert str(excinfo.value) == structured_instructions_error - assert isinstance(guard.history.last.exception, ValidationError) - assert guard.history.last.exception == excinfo.value - - # With Msg History Validation + # With messages Validation guard = Guard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=on_fail), on="msg_history") + guard.use(TwoWords(on_fail=on_fail), on="messages") with pytest.raises(ValidationError) as excinfo: guard( custom_llm, - msg_history=[ + messages=[ { "role": "user", "content": "What kind of pet should I get?", } ], ) - assert str(excinfo.value) == structured_message_history_error + assert str(excinfo.value) == structured_messages_error assert isinstance(guard.history.last.exception, ValidationError) assert guard.history.last.exception == excinfo.value @@ -714,12 +687,12 @@ def custom_llm(prompt, *args, instructions=None, msg_history=None, **kwargs): guard = Guard.from_rail_string( f""" - -This is not two words - +What kind of pet should I get? + @@ -729,76 +702,33 @@ def custom_llm(prompt, *args, instructions=None, msg_history=None, **kwargs): guard( custom_llm, ) - assert str(excinfo.value) == unstructured_prompt_error - assert isinstance(guard.history.last.exception, ValidationError) - assert guard.history.last.exception == excinfo.value - - # Rail Instructions Validation - guard = Guard.from_rail_string( - f""" - - -This is not two words - - -This also is not two words - - - - -""" - ) - with pytest.raises(ValidationError) as excinfo: - guard( - custom_llm, - ) - assert str(excinfo.value) == unstructured_instructions_error + assert str(excinfo.value) == unstructured_messages_error assert isinstance(guard.history.last.exception, ValidationError) assert guard.history.last.exception == excinfo.value @pytest.mark.parametrize( - "on_fail," - "structured_prompt_error," - "structured_instructions_error," - "structured_message_history_error," - "unstructured_prompt_error," - "unstructured_instructions_error", + "on_fail," "structured_messages_error," "unstructured_messages_error,", [ ( OnFailAction.REASK, - "Prompt validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa - "Instructions validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa - "Message history validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa - "Prompt validation failed: incorrect_value='\\nThis is not two words\\n' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='This is', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa - "Instructions validation failed: incorrect_value='\\nThis also is not two words\\n' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='This also', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa + "Message validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa + "Message validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa ), ( OnFailAction.FILTER, - "Prompt validation failed", - "Instructions validation failed", - "Message history validation failed", - "Prompt validation failed", - "Instructions validation failed", + "Messages validation failed", + "Messages validation failed", ), ( OnFailAction.REFRAIN, - "Prompt validation failed", - "Instructions validation failed", - "Message history validation failed", - "Prompt validation failed", - "Instructions validation failed", + "Messages validation failed", + "Messages validation failed", ), ( OnFailAction.EXCEPTION, "Validation failed for field with errors: must be exactly two words", "Validation failed for field with errors: must be exactly two words", - "Validation failed for field with errors: must be exactly two words", - "Validation failed for field with errors: must be exactly two words", - "Validation failed for field with errors: must be exactly two words", ), ], ) @@ -806,62 +736,30 @@ def custom_llm(prompt, *args, instructions=None, msg_history=None, **kwargs): async def test_input_validation_fail_async( mocker, on_fail, - structured_prompt_error, - structured_instructions_error, - structured_message_history_error, - unstructured_prompt_error, - unstructured_instructions_error, + structured_messages_error, + unstructured_messages_error, ): - async def custom_llm( - prompt, *args, instructions=None, msg_history=None, **kwargs - ) -> str: + async def custom_llm(*args, messages=None, **kwargs) -> str: raise Exception( "LLM was called when it should not have been!" "Input Validation did not raise as expected!" ) - # with_prompt_validation - guard = AsyncGuard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=on_fail), on="prompt") - - with pytest.raises(ValidationError) as excinfo: - await guard( - custom_llm, - prompt="What kind of pet should I get?", - ) - assert str(excinfo.value) == structured_prompt_error - assert isinstance(guard.history.last.exception, ValidationError) - assert guard.history.last.exception == excinfo.value - - # with_instructions_validation - guard = AsyncGuard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=on_fail), on="instructions") - - with pytest.raises(ValidationError) as excinfo: - await guard( - custom_llm, - prompt="What kind of pet should I get and what should I name it?", - instructions="What kind of pet should I get?", - ) - assert str(excinfo.value) == structured_instructions_error - assert isinstance(guard.history.last.exception, ValidationError) - assert guard.history.last.exception == excinfo.value - - # with_msg_history_validation + # with_messages_validation guard = AsyncGuard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=on_fail), on="msg_history") + guard.use(TwoWords(on_fail=on_fail), on="messages") with pytest.raises(ValidationError) as excinfo: await guard( custom_llm, - msg_history=[ + messages=[ { "role": "user", "content": "What kind of pet should I get?", } ], ) - assert str(excinfo.value) == structured_message_history_error + assert str(excinfo.value) == structured_messages_error assert isinstance(guard.history.last.exception, ValidationError) assert guard.history.last.exception == excinfo.value @@ -879,7 +777,7 @@ async def custom_llm( } ], ) - assert str(excinfo.value) == structured_message_history_error + assert str(excinfo.value) == structured_messages_error assert isinstance(guard.history.last.exception, ValidationError) assert guard.history.last.exception == excinfo.value @@ -887,38 +785,12 @@ async def custom_llm( guard = AsyncGuard.from_rail_string( f""" - -This is not two words - - - - -""" - ) - with pytest.raises(ValidationError) as excinfo: - await guard( - custom_llm, - ) - assert str(excinfo.value) == unstructured_prompt_error - assert isinstance(guard.history.last.exception, ValidationError) - assert guard.history.last.exception == excinfo.value - - # rail instructions validation - guard = AsyncGuard.from_rail_string( - f""" - - -This is not two words - - -This also is not two words - +What kind of pet should I get? + @@ -928,48 +800,23 @@ async def custom_llm( await guard( custom_llm, ) - assert str(excinfo.value) == unstructured_instructions_error + assert str(excinfo.value) == unstructured_messages_error assert isinstance(guard.history.last.exception, ValidationError) assert guard.history.last.exception == excinfo.value def test_input_validation_mismatch_raise(): - # prompt validation, msg_history argument + # messages validation, prompt argument guard = Guard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=OnFailAction.FIX), on="prompt") + guard.use(TwoWords(on_fail=OnFailAction.FIX), on="messages") with pytest.raises(ValueError): guard( openai.completions.create, - msg_history=[ - { - "role": "user", - "content": "What kind of pet should I get?", - } - ], - ) - - # instructions validation, msg_history argument - guard = Guard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=OnFailAction.FIX), on="instructions") - - with pytest.raises(ValueError): - guard( - openai.completions.create, - msg_history=[ + messages=[ { "role": "user", "content": "What kind of pet should I get?", } ], ) - - # msg_history validation, prompt argument - guard = Guard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=OnFailAction.FIX), on="msg_history") - - with pytest.raises(ValueError): - guard( - openai.completions.create, - prompt="What kind of pet should I get?", - ) From a11c4ee4781c276db2e39f05b313d45bee8491e7 Mon Sep 17 00:00:00 2001 From: David Tam Date: Tue, 24 Sep 2024 10:45:35 -0700 Subject: [PATCH 03/71] migrate more tests partially --- guardrails/actions/reask.py | 8 +-- guardrails/llm_providers.py | 15 ++---- tests/integration_tests/mock_llm_outputs.py | 48 ++++++++++++++++- .../test_assets/custom_llm.py | 8 +-- .../test_assets/entity_extraction/__init__.py | 2 + .../test_assets/string/string.rail | 13 ++--- .../test_assets/string/string_reask.rail | 12 ++--- tests/integration_tests/test_guard.py | 26 ++++++---- tests/integration_tests/test_litellm.py | 8 +-- tests/integration_tests/test_parsing.py | 2 +- tests/integration_tests/test_python_rail.py | 6 ++- tests/unit_tests/actions/test_reask.py | 7 ++- tests/unit_tests/classes/history/test_call.py | 2 +- .../classes/history/test_call_inputs.py | 17 +++--- .../unit_tests/classes/history/test_inputs.py | 4 +- tests/unit_tests/mocks/mock_custom_llm.py | 24 +++------ tests/unit_tests/test_assets/simple.rail | 11 ++-- tests/unit_tests/test_guard.py | 30 +++-------- tests/unit_tests/test_llm_providers.py | 20 +++---- tests/unit_tests/test_rail.py | 33 ++++++------ tests/unit_tests/test_validator_base.py | 52 ++++++------------- 21 files changed, 168 insertions(+), 180 deletions(-) diff --git a/guardrails/actions/reask.py b/guardrails/actions/reask.py index 04ef70643..6a35e0714 100644 --- a/guardrails/actions/reask.py +++ b/guardrails/actions/reask.py @@ -314,16 +314,16 @@ def get_reask_setup_for_string( def get_original_prompt(exec_options: Optional[GuardExecutionOptions] = None) -> str: exec_options = exec_options or GuardExecutionOptions() - original_msg_history = exec_options.msg_history or [] - msg_history_prompt = next( + original_messages = exec_options.messages or [] + messages_prompt = next( ( h.get("content") - for h in original_msg_history + for h in original_messages if isinstance(h, dict) and h.get("role") == "user" ), "", ) - original_prompt = exec_options.prompt or msg_history_prompt or "" + original_prompt = exec_options.prompt or messages_prompt or "" return original_prompt diff --git a/guardrails/llm_providers.py b/guardrails/llm_providers.py index 5040eb7fc..37300c5a6 100644 --- a/guardrails/llm_providers.py +++ b/guardrails/llm_providers.py @@ -417,22 +417,13 @@ def _invoke_llm(self, prompt: str, pipeline: Any, *args, **kwargs) -> LLMRespons class ArbitraryCallable(PromptCallableBase): def __init__(self, llm_api: Optional[Callable] = None, *args, **kwargs): llm_api_args = inspect.getfullargspec(llm_api) - if not llm_api_args.args: - raise ValueError( - "Custom LLM callables must accept" - " at least one positional argument for prompt!" - ) if not llm_api_args.varkw: raise ValueError("Custom LLM callables must accept **kwargs!") - if ( - not llm_api_args.kwonlyargs - or "instructions" not in llm_api_args.kwonlyargs - or "msg_history" not in llm_api_args.kwonlyargs - ): + if not llm_api_args.kwonlyargs or "messages" not in llm_api_args.kwonlyargs: warnings.warn( - "We recommend including 'instructions' and 'msg_history'" + "We recommend including 'messages'" " as keyword-only arguments for custom LLM callables." - " Doing so ensures these arguments are not uninentionally" + " Doing so ensures these arguments are not unintentionally" " passed through to other calls via **kwargs.", UserWarning, ) diff --git a/tests/integration_tests/mock_llm_outputs.py b/tests/integration_tests/mock_llm_outputs.py index b88c22fa5..1f5ba0975 100644 --- a/tests/integration_tests/mock_llm_outputs.py +++ b/tests/integration_tests/mock_llm_outputs.py @@ -6,7 +6,53 @@ ) from guardrails.classes.llm.llm_response import LLMResponse -from .test_assets import entity_extraction, pydantic, python_rail, string +from .test_assets import entity_extraction, lists_object, pydantic, python_rail, string + + +class MockLiteLLMCallableOther(LiteLLMCallable): + # NOTE: this class normally overrides `llm_providers.LiteLLMCallable`, + # which compiles instructions and prompt into a single prompt; + # here the instructions are passed into kwargs and ignored + def _invoke_llm(self, prompt, *args, **kwargs): + """Mock the OpenAI API call to Completion.create.""" + + _rail_to_compiled_prompt = { # noqa + entity_extraction.RAIL_SPEC_WITH_REASK: entity_extraction.COMPILED_PROMPT, + } + + mock_llm_responses = { + entity_extraction.COMPILED_PROMPT: entity_extraction.LLM_OUTPUT, + entity_extraction.COMPILED_PROMPT_REASK: entity_extraction.LLM_OUTPUT_REASK, + entity_extraction.COMPILED_PROMPT_FULL_REASK: entity_extraction.LLM_OUTPUT_FULL_REASK, # noqa: E501 + entity_extraction.COMPILED_PROMPT_SKELETON_REASK_1: entity_extraction.LLM_OUTPUT_SKELETON_REASK_1, # noqa: E501 + entity_extraction.COMPILED_PROMPT_SKELETON_REASK_2: entity_extraction.LLM_OUTPUT_SKELETON_REASK_2, # noqa: E501 + pydantic.COMPILED_PROMPT: pydantic.LLM_OUTPUT, + pydantic.COMPILED_PROMPT_REASK_1: pydantic.LLM_OUTPUT_REASK_1, + pydantic.COMPILED_PROMPT_FULL_REASK_1: pydantic.LLM_OUTPUT_FULL_REASK_1, + pydantic.COMPILED_PROMPT_REASK_2: pydantic.LLM_OUTPUT_REASK_2, + pydantic.COMPILED_PROMPT_FULL_REASK_2: pydantic.LLM_OUTPUT_FULL_REASK_2, + pydantic.COMPILED_PROMPT_ENUM: pydantic.LLM_OUTPUT_ENUM, + pydantic.COMPILED_PROMPT_ENUM_2: pydantic.LLM_OUTPUT_ENUM_2, + string.COMPILED_PROMPT: string.LLM_OUTPUT, + string.COMPILED_PROMPT_REASK: string.LLM_OUTPUT_REASK, + string.COMPILED_LIST_PROMPT: string.LIST_LLM_OUTPUT, + python_rail.VALIDATOR_PARALLELISM_PROMPT_1: python_rail.VALIDATOR_PARALLELISM_RESPONSE_1, # noqa: E501 + python_rail.VALIDATOR_PARALLELISM_PROMPT_2: python_rail.VALIDATOR_PARALLELISM_RESPONSE_2, # noqa: E501 + python_rail.VALIDATOR_PARALLELISM_PROMPT_3: python_rail.VALIDATOR_PARALLELISM_RESPONSE_3, # noqa: E501 + lists_object.LIST_PROMPT: lists_object.LIST_OUTPUT, + } + + try: + output = mock_llm_responses[prompt] + return LLMResponse( + output=output, + prompt_token_count=123, + response_token_count=1234, + ) + except KeyError: + print("Unrecognized prompt!") + print(prompt) + raise ValueError("Compiled prompt not found") class MockAsyncLiteLLMCallable(AsyncLiteLLMCallable): diff --git a/tests/integration_tests/test_assets/custom_llm.py b/tests/integration_tests/test_assets/custom_llm.py index 643d0278f..7c4890683 100644 --- a/tests/integration_tests/test_assets/custom_llm.py +++ b/tests/integration_tests/test_assets/custom_llm.py @@ -2,20 +2,16 @@ def mock_llm( - prompt: Optional[str] = None, *args, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict[str, str]]] = None, + messages: Optional[List[Dict[str, str]]] = None, **kwargs, ) -> str: return "" async def mock_async_llm( - prompt: Optional[str] = None, *args, - instructions: Optional[str] = None, - msg_history: Optional[List[Dict[str, str]]] = None, + messages: Optional[List[Dict[str, str]]] = None, **kwargs, ) -> str: return "" diff --git a/tests/integration_tests/test_assets/entity_extraction/__init__.py b/tests/integration_tests/test_assets/entity_extraction/__init__.py index e9cc75457..972ca4ed5 100644 --- a/tests/integration_tests/test_assets/entity_extraction/__init__.py +++ b/tests/integration_tests/test_assets/entity_extraction/__init__.py @@ -95,6 +95,8 @@ "COMPILED_MSG_HISTORY_PROMPT", "LLM_OUTPUT", "LLM_OUTPUT_REASK", + "PYDANTIC_INSTRUCTIONS", + "PYDANTIC_PROMPT", "RAIL_SPEC_WITH_FILTER", "RAIL_SPEC_WITH_FIX", "RAIL_SPEC_WITH_FIX_CHAT_MODEL", diff --git a/tests/integration_tests/test_assets/string/string.rail b/tests/integration_tests/test_assets/string/string.rail index 7f20dd9e0..da29cafae 100644 --- a/tests/integration_tests/test_assets/string/string.rail +++ b/tests/integration_tests/test_assets/string/string.rail @@ -3,17 +3,18 @@ type="string" description="Name for the pizza" /> - - + + You are a helpful assistant, and you are helping me come up with a name for a pizza. ${complete_string_suffix} - - - + + Given the following ingredients, what would you call this pizza? ${ingredients} - + + \ No newline at end of file diff --git a/tests/integration_tests/test_assets/string/string_reask.rail b/tests/integration_tests/test_assets/string/string_reask.rail index 64d4b59be..2960439b4 100644 --- a/tests/integration_tests/test_assets/string/string_reask.rail +++ b/tests/integration_tests/test_assets/string/string_reask.rail @@ -5,17 +5,17 @@ validators="two-words" on-fail-two-words="reask" /> - - + + You are a helpful assistant, and you are helping me come up with a name for a pizza. ${gr.complete_string_suffix} - - - + + Given the following ingredients, what would you call this pizza? ${ingredients} - + + \ No newline at end of file diff --git a/tests/integration_tests/test_guard.py b/tests/integration_tests/test_guard.py index 5f80c2318..f46762774 100644 --- a/tests/integration_tests/test_guard.py +++ b/tests/integration_tests/test_guard.py @@ -103,15 +103,13 @@ def validated_output(): } -def guard_initializer( - rail: Union[str, BaseModel], prompt: str, instructions: Optional[str] = None -) -> Guard: +def guard_initializer(rail: Union[str, BaseModel], messages=None) -> Guard: """Helper function to initialize a Guard using the correct method.""" if isinstance(rail, str): return Guard.from_rail_string(rail) else: - return Guard.from_pydantic(rail, prompt=prompt, instructions=instructions) + return Guard.from_pydantic(rail, messages=messages) '''def test_rail_spec_output_parse(rail_spec, llm_output, validated_output): @@ -400,17 +398,25 @@ def test_entity_extraction_with_refrain(mocker, rail, prompt): @pytest.mark.parametrize( - "rail,prompt,instructions", + "rail,messages", [ - (entity_extraction.RAIL_SPEC_WITH_FIX_CHAT_MODEL, None, None), + (entity_extraction.RAIL_SPEC_WITH_FIX_CHAT_MODEL, None), ( entity_extraction.PYDANTIC_RAIL_WITH_FIX, - entity_extraction.PYDANTIC_PROMPT_CHAT_MODEL, - entity_extraction.PYDANTIC_INSTRUCTIONS_CHAT_MODEL, + [ + { + "role": "system", + "content": entity_extraction.PYDANTIC_INSTRUCTIONS_CHAT_MODEL, + }, + { + "role": "user", + "content": entity_extraction.PYDANTIC_PROMPT_CHAT_MODEL, + }, + ], ), ], ) -def test_entity_extraction_with_fix_chat_models(mocker, rail, prompt, instructions): +def test_entity_extraction_with_fix_chat_models(mocker, rail, messages): """Test that the entity extraction works with fix for chat models.""" mock_invoke_llm = mocker.patch( "guardrails.llm_providers.OpenAIChatCallable._invoke_llm", @@ -424,7 +430,7 @@ def test_entity_extraction_with_fix_chat_models(mocker, rail, prompt, instructio ] content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") - guard = guard_initializer(rail, prompt, instructions) + guard = guard_initializer(rail, messages) final_output = guard( llm_api=openai.chat.completions.create, prompt_params={"document": content[:6000]}, diff --git a/tests/integration_tests/test_litellm.py b/tests/integration_tests/test_litellm.py index 47514cba8..dbc226e54 100644 --- a/tests/integration_tests/test_litellm.py +++ b/tests/integration_tests/test_litellm.py @@ -40,9 +40,7 @@ class Fruits(BaseModel): guard = gd.Guard.from_pydantic(Fruits) res = guard( model="gpt-4o", - msg_history=[ - {"role": "user", "content": "Name 10 unique fruits, lowercase only"} - ], + messages=[{"role": "user", "content": "Name 10 unique fruits, lowercase only"}], tools=guard.json_function_calling_tool([]), tool_choice="required", ) @@ -64,9 +62,7 @@ def test_litellm_openai(): res = guard( llm_api=litellm.completion, model="gpt-3.5-turbo", - msg_history=[ - {"role": "user", "content": "Name 10 unique fruits, lowercase only"} - ], + messages=[{"role": "user", "content": "Name 10 unique fruits, lowercase only"}], ) assert res.validated_output res = guard( diff --git a/tests/integration_tests/test_parsing.py b/tests/integration_tests/test_parsing.py index 33da4fad2..9a1216ce4 100644 --- a/tests/integration_tests/test_parsing.py +++ b/tests/integration_tests/test_parsing.py @@ -145,7 +145,7 @@ def always_fail(value: str, metadata: Dict) -> ValidationResult: guard.parse( llm_output="Tomato Cheese Pizza", llm_api=openai.chat.completions.create, - msg_history=[ + messages=[ {"role": "system", "content": "Some content"}, {"role": "user", "content": "Some prompt"}, ], diff --git a/tests/integration_tests/test_python_rail.py b/tests/integration_tests/test_python_rail.py index 9c64becf9..305b9446c 100644 --- a/tests/integration_tests/test_python_rail.py +++ b/tests/integration_tests/test_python_rail.py @@ -195,8 +195,10 @@ def test_python_string(mocker): guard = gd.Guard.from_string( validators, string_description=description, - prompt=prompt, - instructions=instructions, + messages=[ + {"role": "system", "content": instructions}, + {"role": "user", "content": prompt}, + ], ) final_output = guard( llm_api=openai.completions.create, diff --git a/tests/unit_tests/actions/test_reask.py b/tests/unit_tests/actions/test_reask.py index ccf6e77d7..7e8f05998 100644 --- a/tests/unit_tests/actions/test_reask.py +++ b/tests/unit_tests/actions/test_reask.py @@ -542,7 +542,12 @@ def test_get_reask_prompt( output_schema = processed_schema.json_schema exec_options = GuardExecutionOptions( # Use an XML constant to make existing test cases pass - prompt="${gr.complete_xml_suffix_v3}" + messages=[ + { + "role": "user", + "content": "${gr.complete_xml_suffix_v3}", + } + ] ) ( diff --git a/tests/unit_tests/classes/history/test_call.py b/tests/unit_tests/classes/history/test_call.py index d0804ecf1..a5719f0dc 100644 --- a/tests/unit_tests/classes/history/test_call.py +++ b/tests/unit_tests/classes/history/test_call.py @@ -42,7 +42,7 @@ def test_empty_initialization(): def test_non_empty_initialization(): # Call input - def custom_llm(prompt, *args, instructions=None, msg_history=None, **kwargs): + def custom_llm(*args, messages=None, **kwargs): return "Hello there!" llm_api = custom_llm diff --git a/tests/unit_tests/classes/history/test_call_inputs.py b/tests/unit_tests/classes/history/test_call_inputs.py index 74191683f..754d2572f 100644 --- a/tests/unit_tests/classes/history/test_call_inputs.py +++ b/tests/unit_tests/classes/history/test_call_inputs.py @@ -6,14 +6,12 @@ def test_empty_initialization(): # Overrides and additional properties assert call_inputs.llm_api is None - assert call_inputs.prompt is None - assert call_inputs.instructions is None + assert call_inputs.messages is None assert call_inputs.args == [] assert call_inputs.kwargs == {} # Inherited properties assert call_inputs.llm_output is None - assert call_inputs.msg_history is None assert call_inputs.prompt_params is None assert call_inputs.num_reasks is None assert call_inputs.metadata is None @@ -25,15 +23,17 @@ def custom_llm(): return "Hello there!" llm_api = custom_llm - prompt = "Respond with a friendly greeting." - instructions = "You are a greeting bot." + messages = [ + {"role": "system", "content": "You are a greeting bot."}, + {"role": "user", "content": "Respond with a friendly greeting."}, + ] + args = ["arg1"] kwargs = {"kwarg1": 1} call_inputs = CallInputs( llm_api=llm_api, - prompt=prompt, - instructions=instructions, + messages=messages, args=args, kwargs=kwargs, ) @@ -41,7 +41,6 @@ def custom_llm(): # We only care about overrides and additional props # because the others were tested in test_inputs.py assert call_inputs.llm_api == llm_api - assert call_inputs.prompt == prompt - assert call_inputs.instructions == instructions + assert call_inputs.messages == messages assert call_inputs.args == args assert call_inputs.kwargs == kwargs diff --git a/tests/unit_tests/classes/history/test_inputs.py b/tests/unit_tests/classes/history/test_inputs.py index 7b0441dde..19d9fb74f 100644 --- a/tests/unit_tests/classes/history/test_inputs.py +++ b/tests/unit_tests/classes/history/test_inputs.py @@ -8,9 +8,7 @@ def test_empty_initialization(): assert inputs.llm_api is None assert inputs.llm_output is None - assert inputs.instructions is None - assert inputs.prompt is None - assert inputs.msg_history is None + assert inputs.messages is None assert inputs.prompt_params is None assert inputs.num_reasks is None assert inputs.metadata is None diff --git a/tests/unit_tests/mocks/mock_custom_llm.py b/tests/unit_tests/mocks/mock_custom_llm.py index 3f62044bf..fce6ddac5 100644 --- a/tests/unit_tests/mocks/mock_custom_llm.py +++ b/tests/unit_tests/mocks/mock_custom_llm.py @@ -6,22 +6,16 @@ def __init__(self, times_called=0, response="Hello world!"): self.times_called = times_called self.response = response - def fail_retryable( - self, prompt: str, *args, instructions=None, msg_history=None, **kwargs - ) -> str: + def fail_retryable(self, *args, messages=None, **kwargs) -> str: if self.times_called == 0: self.times_called = self.times_called + 1 raise OpenAIServiceUnavailableError("ServiceUnavailableError") return self.response - def fail_non_retryable( - self, prompt: str, *args, instructions=None, msg_history=None, **kwargs - ) -> str: + def fail_non_retryable(self, *args, messages=None, **kwargs) -> str: raise Exception("Non-Retryable Error!") - def succeed( - self, prompt: str, *args, instructions=None, msg_history=None, **kwargs - ) -> str: + def succeed(self, *args, messages=None, **kwargs) -> str: return self.response @@ -30,20 +24,14 @@ def __init__(self, times_called=0, response="Hello world!"): self.times_called = times_called self.response = response - async def fail_retryable( - self, prompt: str, *args, instructions=None, msg_history=None, **kwargs - ) -> str: + async def fail_retryable(self, *args, messages=None, **kwargs) -> str: if self.times_called == 0: self.times_called = self.times_called + 1 raise OpenAIServiceUnavailableError("ServiceUnavailableError") return self.response - async def fail_non_retryable( - self, prompt: str, *args, instructions=None, msg_history=None, **kwargs - ) -> str: + async def fail_non_retryable(self, *args, messages=None, **kwargs) -> str: raise Exception("Non-Retryable Error!") - async def succeed( - self, prompt: str, *args, instructions=None, msg_history=None, **kwargs - ) -> str: + async def succeed(self, *args, messages=None, **kwargs) -> str: return self.response diff --git a/tests/unit_tests/test_assets/simple.rail b/tests/unit_tests/test_assets/simple.rail index 951e40854..bc58f1838 100644 --- a/tests/unit_tests/test_assets/simple.rail +++ b/tests/unit_tests/test_assets/simple.rail @@ -2,15 +2,16 @@ - + + You are a helpful bot, who answers only with valid JSON - - - + + Extract a string from the text - + + \ No newline at end of file diff --git a/tests/unit_tests/test_guard.py b/tests/unit_tests/test_guard.py index aad985d78..199b5ea50 100644 --- a/tests/unit_tests/test_guard.py +++ b/tests/unit_tests/test_guard.py @@ -249,10 +249,8 @@ class TestClass(BaseModel): # everything else is in the schema guard: Guard = ( Guard() - .use(LowerCase, on="prompt") - .use(OneLine, on="prompt") - .use(UpperCase, on="instructions") - .use(LowerCase, on="msg_history") + .use(LowerCase, on="messages") + .use(OneLine, on="messages") .use( EndsWith, end="a", on="output" ) # default on="output", still explicitly set @@ -261,20 +259,12 @@ class TestClass(BaseModel): ) # default on="output", implicitly set ) - # Check schemas for prompt, instructions and msg_history validators - prompt_validators = guard._validator_map.get("prompt", []) + # Check schemas for messages validators + prompt_validators = guard._validator_map.get("messages", []) assert len(prompt_validators) == 2 assert prompt_validators[0].__class__.__name__ == "LowerCase" assert prompt_validators[1].__class__.__name__ == "OneLine" - instructions_validators = guard._validator_map.get("instructions", []) - assert len(instructions_validators) == 1 - assert instructions_validators[0].__class__.__name__ == "UpperCase" - - msg_history_validators = guard._validator_map.get("msg_history", []) - assert len(msg_history_validators) == 1 - assert msg_history_validators[0].__class__.__name__ == "LowerCase" - # Check guard for output validators assert len(guard._validators) == 6 @@ -554,9 +544,7 @@ def test_on_many_success(self): def test_on_many_failure(self): guard: Guard = ( Guard() - .use(OneLine, on="prompt") - .use(LowerCase, on="instructions") - .use(UpperCase, on="msg_history") + .use(OneLine, on="messages") .use(LowerCase, on="output", on_fail=OnFailAction.FIX) .use(TwoWords) .use(ValidLength, 0, 12, on_fail=OnFailAction.REFRAIN) @@ -573,9 +561,7 @@ def test_on_many_failure(self): def test_use_and_use_many(): guard: Guard = ( Guard() - .use_many(OneLine(), LowerCase(), on="prompt") - .use(UpperCase, on="instructions") - .use(LowerCase, on="msg_history") + .use_many(OneLine(), LowerCase(), on="messages") .use_many( TwoWords(on_fail=OnFailAction.REASK), ValidLength(0, 12, on_fail=OnFailAction.REFRAIN), @@ -616,9 +602,7 @@ def test_use_and_use_many(): with pytest.warns(UserWarning): guard: Guard = ( Guard() - .use_many(OneLine(), LowerCase(), on="prompt") - .use(UpperCase, on="instructions") - .use(LowerCase, on="msg_history") + .use_many(OneLine(), LowerCase(), on="messages") .use_many( TwoWords(on_fail=OnFailAction.REASK), ValidLength(0, 12, on_fail=OnFailAction.REFRAIN), diff --git a/tests/unit_tests/test_llm_providers.py b/tests/unit_tests/test_llm_providers.py index db57c8aaf..18613f424 100644 --- a/tests/unit_tests/test_llm_providers.py +++ b/tests/unit_tests/test_llm_providers.py @@ -307,9 +307,7 @@ def create() -> MockResponse: class ReturnTempCallable(Callable): - def __call__( - self, prompt: str, *args, instructions=None, msg_history=None, **kwargs - ) -> Any: + def __call__(self, *args, messages=None, **kwargs) -> Any: return "" @@ -422,7 +420,7 @@ def test_get_llm_ask_litellm(): def test_get_llm_ask_custom_llm(): from guardrails.llm_providers import ArbitraryCallable - def my_llm(prompt: str, *, instructions=None, msg_history=None, **kwargs) -> str: + def my_llm(prompt: str, *, messages=None, **kwargs) -> str: return f"Hello {prompt}!" prompt_callable = get_llm_ask(my_llm) @@ -439,9 +437,9 @@ def my_llm(prompt: str, **kwargs) -> str: with pytest.warns( UserWarning, match=( - "We recommend including 'instructions' and 'msg_history'" + "We recommend including 'messages'" " as keyword-only arguments for custom LLM callables." - " Doing so ensures these arguments are not uninentionally" + " Doing so ensures these arguments are not unintentionally" " passed through to other calls via \\*\\*kwargs." ), ): @@ -474,9 +472,7 @@ def my_llm(prompt: str) -> str: def test_get_async_llm_ask_custom_llm(): from guardrails.llm_providers import AsyncArbitraryCallable - async def my_llm( - prompt: str, *, instructions=None, msg_history=None, **kwargs - ) -> str: + async def my_llm(prompt: str, *, messages=None, **kwargs) -> str: return f"Hello {prompt}!" prompt_callable = get_async_llm_ask(my_llm) @@ -493,9 +489,9 @@ async def my_llm(prompt: str, **kwargs) -> str: with pytest.warns( UserWarning, match=( - "We recommend including 'instructions' and 'msg_history'" + "We recommend including 'messages'" " as keyword-only arguments for custom LLM callables." - " Doing so ensures these arguments are not uninentionally" + " Doing so ensures these arguments are not unintentionally" " passed through to other calls via \\*\\*kwargs." ), ): @@ -526,6 +522,6 @@ def my_llm(prompt: str) -> str: def test_chat_prompt(): - # raises when neither msg_history or prompt are provided + # raises when messages are not provided with pytest.raises(PromptCallableException): chat_prompt(None) diff --git a/tests/unit_tests/test_rail.py b/tests/unit_tests/test_rail.py index 077d7c393..aa44f9885 100644 --- a/tests/unit_tests/test_rail.py +++ b/tests/unit_tests/test_rail.py @@ -8,13 +8,13 @@ def test_rail_scalar_string(): - + + Hello world - - - + + Hello world - + """ @@ -32,13 +32,13 @@ def test_rail_object_with_scalar(): - + + Hello world - - - + + Hello world - + """ rail_string_to_schema(rail_spec) @@ -174,15 +174,14 @@ def test_format_not_read_as_validators(): - - + + Hello world - - - + + Hello world - - + + """ # Declaring Validators in the format field was dropped in 0.5.x diff --git a/tests/unit_tests/test_validator_base.py b/tests/unit_tests/test_validator_base.py index 01e97a2cd..a4b5cb322 100644 --- a/tests/unit_tests/test_validator_base.py +++ b/tests/unit_tests/test_validator_base.py @@ -485,7 +485,7 @@ def mock_llm_api(prompt, *args, instructions=None, messages=None, **kwargs): # but raises for messages validation guard = Guard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=OnFailAction.FIX), on="messages") + guard.use(TwoWords(on_fail=OnFailAction.EXCEPTION), on="messages") with pytest.raises(ValidationError) as excinfo: guard( @@ -501,41 +501,19 @@ def mock_llm_api(prompt, *args, instructions=None, messages=None, **kwargs): assert isinstance(guard.history.first.exception, ValidationError) assert guard.history.first.exception == excinfo.value - # rail prompt validation - guard = Guard.from_rail_string( - """ - - -This is not two words - - - - -""" - ) - guard( - mock_llm_api, - ) - assert guard.history.first.iterations.first.outputs.validation_response == "This is" - - # rail instructions validation + # rail messages validation guard = Guard.from_rail_string( """ - -This is not two words - - -This also is not two words - - - + + This is not two words + This also is not two words + + + """ ) @@ -549,10 +527,10 @@ def mock_llm_api(prompt, *args, instructions=None, messages=None, **kwargs): @pytest.mark.asyncio async def test_async_messages_validation_fix(mocker): - async def mock_llm_api(*args, instructions=None, messages=None, **kwargs) -> str: + async def mock_llm_api(*args, messages=None, **kwargs) -> str: return json.dumps({"name": "Fluffy"}) - # fix returns an amended value for prompt/instructions validation, + # fix returns an amended value for messages validation, guard = AsyncGuard.from_pydantic(output_class=Pet) guard.use(TwoWords(on_fail=OnFailAction.FIX), on="messages") @@ -600,7 +578,7 @@ async def mock_llm_api(*args, instructions=None, messages=None, **kwargs) -> str } ], ) - assert str(excinfo.value) == "Message history validation failed" + assert str(excinfo.value) == "Messages validation failed" assert isinstance(guard.history.first.exception, ValidationError) assert guard.history.first.exception == excinfo.value @@ -659,7 +637,7 @@ def test_input_validation_fail( guard = Guard.from_pydantic(output_class=Pet) guard.use(TwoWords(on_fail=on_fail), on="messages") - def custom_llm(prompt, *args, instructions=None, messages=None, **kwargs): + def custom_llm(*args, messages=None, **kwargs): raise Exception( "LLM was called when it should not have been!" "Input Validation did not raise as expected!" From b97caa2aab085b38a9be536c92e55c800f16a4a9 Mon Sep 17 00:00:00 2001 From: David Tam Date: Tue, 24 Sep 2024 15:19:25 -0700 Subject: [PATCH 04/71] some progress --- guardrails/actions/reask.py | 65 +++++++++---------- guardrails/async_guard.py | 2 +- guardrails/classes/history/inputs.py | 5 +- guardrails/hub_telemetry/hub_tracing.py | 4 -- guardrails/prompt/messages.py | 16 +++++ guardrails/run/async_runner.py | 32 +-------- guardrails/run/runner.py | 3 +- .../entity_extraction/refrain.rail | 2 +- tests/integration_tests/test_async.py | 30 ++++----- tests/unit_tests/actions/test_reask.py | 7 +- tests/unit_tests/test_guard.py | 42 +++++------- tests/unit_tests/test_llm_providers.py | 15 +---- tests/unit_tests/test_rail.py | 3 +- 13 files changed, 92 insertions(+), 134 deletions(-) diff --git a/guardrails/actions/reask.py b/guardrails/actions/reask.py index 6a35e0714..eced6ce47 100644 --- a/guardrails/actions/reask.py +++ b/guardrails/actions/reask.py @@ -247,7 +247,7 @@ def get_reask_setup_for_string( validation_response: Optional[Union[str, List, Dict, ReAsk]] = None, prompt_params: Optional[Dict[str, Any]] = None, exec_options: Optional[GuardExecutionOptions] = None, -) -> Tuple[Dict[str, Any], Prompt, Instructions]: +) -> Tuple[Dict[str, Any], Messages]: prompt_params = prompt_params or {} exec_options = exec_options or GuardExecutionOptions() @@ -259,13 +259,11 @@ def get_reask_setup_for_string( ) reask_prompt_template = None - if exec_options.reask_prompt: - reask_prompt_template = Prompt(exec_options.reask_prompt) - else: - reask_prompt_template = Prompt( - constants["high_level_string_reask_prompt"] - + constants["complete_string_suffix"] - ) + + reask_prompt_template = Prompt( + constants["high_level_string_reask_prompt"] + + constants["complete_string_suffix"] + ) error_messages = "\n".join( [ @@ -298,9 +296,12 @@ def get_reask_setup_for_string( messages = None if exec_options.reask_messages: messages = Messages(exec_options.reask_messages) + if messages is None: messages = Messages( - [{"role": "system", "content": "You are a helpful assistant."}] + [ + {"role": "system", "content": instructions}, + {"role": "user", "content": prompt}] ) messages = messages.format( @@ -309,7 +310,7 @@ def get_reask_setup_for_string( **prompt_params, ) - return output_schema, prompt, instructions + return output_schema, messages def get_original_prompt(exec_options: Optional[GuardExecutionOptions] = None) -> str: @@ -323,7 +324,7 @@ def get_original_prompt(exec_options: Optional[GuardExecutionOptions] = None) -> ), "", ) - original_prompt = exec_options.prompt or messages_prompt or "" + original_prompt = messages_prompt or "" return original_prompt @@ -338,7 +339,7 @@ def get_reask_setup_for_json( use_full_schema: Optional[bool] = False, prompt_params: Optional[Dict[str, Any]] = None, exec_options: Optional[GuardExecutionOptions] = None, -) -> Tuple[Dict[str, Any], Prompt, Instructions]: +) -> Tuple[Dict[str, Any], Messages]: reask_schema = output_schema is_skeleton_reask = not any(isinstance(reask, FieldReAsk) for reask in reasks) is_nonparseable_reask = any( @@ -351,8 +352,6 @@ def get_reask_setup_for_json( use_xml = prompt_uses_xml(original_prompt) reask_prompt_template = None - if exec_options.reask_prompt: - reask_prompt_template = Prompt(exec_options.reask_prompt) if is_nonparseable_reask: if reask_prompt_template is None: @@ -462,30 +461,26 @@ def reask_decoder(obj: ReAsk): ) instructions = None - if exec_options.reask_instructions: - instructions = Instructions(exec_options.reask_instructions) + instructions_const = ( + constants["high_level_xml_instructions"] + if use_xml + else constants["high_level_json_instructions"] + ) + instructions = Instructions(instructions_const) + instructions = instructions.format(**prompt_params) + + messages = None + if exec_options.reask_messages: + messages = Messages(exec_options.reask_messages) else: - instructions_const = ( - constants["high_level_xml_instructions"] - if use_xml - else constants["high_level_json_instructions"] + messages = Messages( + [ + {"role": "system", "content": instructions}, + {"role": "user", "content": prompt}, + ] ) - instructions = Instructions(instructions_const) - instructions = instructions.format(**prompt_params) - # TODO: enable this in 0.6.0 - # messages = None - # if exec_options.reask_messages: - # messages = Messages(exec_options.reask_messages) - # else: - # messages = Messages( - # [ - # {"role": "system", "content": instructions}, - # {"role": "user", "content": prompt}, - # ] - # ) - - return reask_schema, prompt, instructions + return reask_schema, messages def get_reask_setup( diff --git a/guardrails/async_guard.py b/guardrails/async_guard.py index a60a2d562..6683f5b88 100644 --- a/guardrails/async_guard.py +++ b/guardrails/async_guard.py @@ -408,7 +408,7 @@ async def __call__( # Determine the final value for messages messages = messages or messages_from_kwargs or messages_from_exec_opts or [] - + print("===== messages is", messages) if messages is not None and not len(messages): raise RuntimeError( "You must provide a prompt if messages is empty. " diff --git a/guardrails/classes/history/inputs.py b/guardrails/classes/history/inputs.py index b94a3d11e..7dcf68cd8 100644 --- a/guardrails/classes/history/inputs.py +++ b/guardrails/classes/history/inputs.py @@ -6,7 +6,8 @@ from guardrails.classes.generic.arbitrary_model import ArbitraryModel from guardrails.classes.llm.prompt_callable import PromptCallableBase from guardrails.prompt.prompt import Prompt - +from guardrails.prompt.messages import Messages +from guardrails.prompt.instructions import Instructions class Inputs(IInputs, ArbitraryModel): """Inputs represent the input data that is passed into the validation loop. @@ -37,7 +38,7 @@ class Inputs(IInputs, ArbitraryModel): "provided by the user via Guard.parse.", default=None, ) - messages: Optional[List[Dict[str, Union[str, Prompt]]]] = Field( + messages: Optional[Union[List[Dict[str, Union[str, Prompt, Instructions]]], Messages]] = Field( description="The message history provided by the user for chat model calls.", default=None, ) diff --git a/guardrails/hub_telemetry/hub_tracing.py b/guardrails/hub_telemetry/hub_tracing.py index a02b1b688..fa8cf619c 100644 --- a/guardrails/hub_telemetry/hub_tracing.py +++ b/guardrails/hub_telemetry/hub_tracing.py @@ -24,10 +24,6 @@ def get_guard_call_attributes( if guard_self is not None: attrs["guard_id"] = guard_self.id attrs["user_id"] = guard_self._user_id - attrs["custom_reask_prompt"] = guard_self._exec_opts.reask_prompt is not None - attrs["custom_reask_instructions"] = ( - guard_self._exec_opts.reask_instructions is not None - ) attrs["custom_reask_messages"] = ( guard_self._exec_opts.reask_messages is not None ) diff --git a/guardrails/prompt/messages.py b/guardrails/prompt/messages.py index a7adec457..16b8c84cd 100644 --- a/guardrails/prompt/messages.py +++ b/guardrails/prompt/messages.py @@ -39,6 +39,22 @@ def __init__( else: self.source = source + # Ensure self.source is iterable + self.source = list(self._source) + self._index = 0 + + def __iter__(self): + self._index = 0 + return self + + def __next__(self): + if self._index < len(self.source): + result = self.source[self._index] + self._index += 1 + return result + else: + raise StopIteration + def format( self, **kwargs, diff --git a/guardrails/run/async_runner.py b/guardrails/run/async_runner.py index cb90fe303..4e57b50ff 100644 --- a/guardrails/run/async_runner.py +++ b/guardrails/run/async_runner.py @@ -298,21 +298,8 @@ async def async_prepare( prompt_params = prompt_params or {} if api is None: raise UserFacingException(ValueError("API must be provided.")) - - has_prompt_validation = "prompt" in self.validation_map - has_instructions_validation = "instructions" in self.validation_map - has_messages_validation = "messages" in self.validation_map + print("===== runner messages are", messages) if messages: - if has_prompt_validation or has_instructions_validation: - raise UserFacingException( - ValueError( - "Prompt and instructions validation are " - "not supported when using message history." - ) - ) - - prompt, instructions = None, None - # Runner.prepare_messages messages = await self.prepare_messages( call_log=call_log, @@ -320,19 +307,6 @@ async def async_prepare( prompt_params=prompt_params, attempt_number=attempt_number, ) - elif prompt is not None: - if has_messages_validation: - raise UserFacingException( - ValueError( - "Message history validation is " - "not supported when using prompt/instructions." - ) - ) - messages = None - - instructions, prompt = await self.prepare_prompt( - call_log, instructions, prompt, prompt_params, api, attempt_number - ) else: raise UserFacingException(ValueError("'messages' must be provided.")) @@ -387,7 +361,7 @@ async def validate_messages( iteration.outputs.validation_response = validated_messages if isinstance(validated_messages, ReAsk): raise ValidationError( - f"Message history validation failed: " f"{validated_messages}" + f"Messages validation failed: " f"{validated_messages}" ) if validated_messages != msg_str: - raise ValidationError("Message history validation failed") + raise ValidationError("Messages validation failed") diff --git a/guardrails/run/runner.py b/guardrails/run/runner.py index 09e0c6b6c..d4bf82505 100644 --- a/guardrails/run/runner.py +++ b/guardrails/run/runner.py @@ -523,6 +523,5 @@ def prepare_to_loop( prompt_params=prompt_params, exec_options=self.exec_options, ) - # TODO add messages support - messages = None + return output_schema, messages diff --git a/tests/integration_tests/test_assets/entity_extraction/refrain.rail b/tests/integration_tests/test_assets/entity_extraction/refrain.rail index f020e87d9..17d5abf07 100644 --- a/tests/integration_tests/test_assets/entity_extraction/refrain.rail +++ b/tests/integration_tests/test_assets/entity_extraction/refrain.rail @@ -15,7 +15,7 @@ - + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. ${document} diff --git a/tests/integration_tests/test_async.py b/tests/integration_tests/test_async.py index 9766a1322..41981ac0c 100644 --- a/tests/integration_tests/test_async.py +++ b/tests/integration_tests/test_async.py @@ -37,19 +37,12 @@ async def test_entity_extraction_with_reask(mocker): content = docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = AsyncGuard.from_rail_string(entity_extraction.RAIL_SPEC_WITH_REASK) - from guardrails.run import async_runner - - preprocess_prompt_spy = mocker.spy(async_runner, "preprocess_prompt") - final_output = await guard( llm_api=mock_async_llm, prompt_params={"document": content[:6000]}, num_reasks=1, ) - # Check that the preprocess_prompt method was called. - preprocess_prompt_spy.assert_called() - # Assertions are made on the guard state object. assert final_output.validation_passed is True assert final_output.validated_output == entity_extraction.VALIDATED_OUTPUT_REASK_2 @@ -64,9 +57,9 @@ async def test_entity_extraction_with_reask(mocker): # For orginal prompt and output first = call.iterations.first - assert first.inputs.prompt == Prompt(entity_extraction.NON_OPENAI_COMPILED_PROMPT) + assert first.inputs.messages[0]["content"] == Prompt(entity_extraction.NON_OPENAI_COMPILED_PROMPT) # Same as above - assert call.compiled_prompt == entity_extraction.NON_OPENAI_COMPILED_PROMPT + assert call.compiled_messages[0]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT assert first.prompt_tokens_consumed == 123 assert first.completion_tokens_consumed == 1234 assert first.raw_output == entity_extraction.LLM_OUTPUT @@ -74,11 +67,11 @@ async def test_entity_extraction_with_reask(mocker): # For re-asked prompt and output final = call.iterations.last - assert final.inputs.prompt == Prompt( + assert final.inputs.messages[1]["content"] == Prompt( entity_extraction.NON_OPENAI_COMPILED_PROMPT_REASK ) # Same as above - assert call.reask_prompts.last == entity_extraction.NON_OPENAI_COMPILED_PROMPT_REASK + assert call.reask_messages[0][1]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT_REASK # TODO: Re-enable once field level reasking is supported # assert final.raw_output == entity_extraction.LLM_OUTPUT_REASK @@ -125,7 +118,7 @@ async def test_entity_extraction_with_noop(mocker): assert call.iterations.length == 1 # For orginal prompt and output - assert call.compiled_prompt == entity_extraction.NON_OPENAI_COMPILED_PROMPT + assert call.compiled_messages[0]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.validation_response == entity_extraction.VALIDATED_OUTPUT_NOOP @@ -145,7 +138,10 @@ async def test_entity_extraction_with_noop_pydantic(mocker): content = docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = AsyncGuard.from_pydantic( entity_extraction.PYDANTIC_RAIL_WITH_NOOP, - prompt=entity_extraction.PYDANTIC_PROMPT, + messages=[{ + "role":"user", + "content": entity_extraction.PYDANTIC_PROMPT, + }], ) final_output = await guard( llm_api=mock_async_llm, @@ -167,7 +163,7 @@ async def test_entity_extraction_with_noop_pydantic(mocker): assert call.iterations.length == 1 # For orginal prompt and output - assert call.compiled_prompt == entity_extraction.NON_OPENAI_COMPILED_PROMPT + assert call.compiled_messages[0]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.validation_response == entity_extraction.VALIDATED_OUTPUT_NOOP @@ -205,7 +201,7 @@ async def test_entity_extraction_with_filter(mocker): assert call.iterations.length == 1 # For orginal prompt and output - assert call.compiled_prompt == entity_extraction.NON_OPENAI_COMPILED_PROMPT + assert call.compiled_messages[0]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.validation_response == entity_extraction.VALIDATED_OUTPUT_FILTER assert call.guarded_output is None @@ -244,7 +240,7 @@ async def test_entity_extraction_with_fix(mocker): assert guard.history.length == 1 # For orginal prompt and output - assert call.compiled_prompt == entity_extraction.NON_OPENAI_COMPILED_PROMPT + assert call.compiled_messages[0]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.guarded_output == entity_extraction.VALIDATED_OUTPUT_FIX @@ -281,7 +277,7 @@ async def test_entity_extraction_with_refrain(mocker): assert guard.history.length == 1 # For orginal prompt and output - assert call.compiled_prompt == entity_extraction.NON_OPENAI_COMPILED_PROMPT + assert call.compiled_messages[0]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.guarded_output == entity_extraction.VALIDATED_OUTPUT_REFRAIN diff --git a/tests/unit_tests/actions/test_reask.py b/tests/unit_tests/actions/test_reask.py index 7e8f05998..1e1e20cee 100644 --- a/tests/unit_tests/actions/test_reask.py +++ b/tests/unit_tests/actions/test_reask.py @@ -552,8 +552,7 @@ def test_get_reask_prompt( ( reask_schema, - reask_prompt, - reask_instructions, + reask_messages ) = get_reask_setup( output_type, output_schema, @@ -574,9 +573,9 @@ def test_get_reask_prompt( # json.dumps(json_example, indent=2), ) - assert reask_prompt.source == expected_prompt + assert reask_messages.source[1]["content"].source == expected_prompt - assert reask_instructions.source == expected_instructions + assert reask_messages.source[0]["content"].source == expected_instructions ### FIXME: Implement once Field Level ReAsk is implemented w/ JSON schema ### diff --git a/tests/unit_tests/test_guard.py b/tests/unit_tests/test_guard.py index 199b5ea50..7ed15d116 100644 --- a/tests/unit_tests/test_guard.py +++ b/tests/unit_tests/test_guard.py @@ -266,16 +266,16 @@ class TestClass(BaseModel): assert prompt_validators[1].__class__.__name__ == "OneLine" # Check guard for output validators - assert len(guard._validators) == 6 + assert len(guard._validators) == 4 - assert isinstance(guard._validators[4], EndsWith) - assert guard._validators[4]._kwargs["end"] == "a" + assert isinstance(guard._validators[2], EndsWith) + assert guard._validators[2]._kwargs["end"] == "a" assert ( - guard._validators[4].on_fail_descriptor == OnFailAction.FIX + guard._validators[2].on_fail_descriptor == OnFailAction.FIX ) # bc this is the default - assert isinstance(guard._validators[5], TwoWords) - assert guard._validators[5].on_fail_descriptor == OnFailAction.REASK # bc we set it + assert isinstance(guard._validators[3], TwoWords) + assert guard._validators[3].on_fail_descriptor == OnFailAction.REASK # bc we set it # Test with an unrecognized "on" parameter, should warn with a UserWarning with pytest.warns(UserWarning): @@ -569,33 +569,25 @@ def test_use_and_use_many(): ) ) - # Check schemas for prompt, instructions and msg_history validators - prompt_validators = guard._validator_map.get("prompt", []) + # Check schemas for messages validators + prompt_validators = guard._validator_map.get("messages", []) assert len(prompt_validators) == 2 assert prompt_validators[0].__class__.__name__ == "OneLine" assert prompt_validators[1].__class__.__name__ == "LowerCase" - instructions_validators = guard._validator_map.get("instructions", []) - assert len(instructions_validators) == 1 - assert instructions_validators[0].__class__.__name__ == "UpperCase" - - msg_history_validators = guard._validator_map.get("msg_history", []) - assert len(msg_history_validators) == 1 - assert msg_history_validators[0].__class__.__name__ == "LowerCase" - # Check guard for validators - assert len(guard._validators) == 6 + assert len(guard._validators) == 4 - assert isinstance(guard._validators[4], TwoWords) - assert guard._validators[4].on_fail_descriptor == OnFailAction.REASK # bc we set it + assert isinstance(guard._validators[2], TwoWords) + assert guard._validators[2].on_fail_descriptor == OnFailAction.REASK # bc we set it - assert isinstance(guard._validators[5], ValidLength) - assert guard._validators[5]._min == 0 - assert guard._validators[5]._kwargs["min"] == 0 - assert guard._validators[5]._max == 12 - assert guard._validators[5]._kwargs["max"] == 12 + assert isinstance(guard._validators[3], ValidLength) + assert guard._validators[3]._min == 0 + assert guard._validators[3]._kwargs["min"] == 0 + assert guard._validators[3]._max == 12 + assert guard._validators[3]._kwargs["max"] == 12 assert ( - guard._validators[5].on_fail_descriptor == OnFailAction.REFRAIN + guard._validators[3].on_fail_descriptor == OnFailAction.REFRAIN ) # bc we set it # Test with an unrecognized "on" parameter, should warn with a UserWarning diff --git a/tests/unit_tests/test_llm_providers.py b/tests/unit_tests/test_llm_providers.py index 18613f424..30e1c7702 100644 --- a/tests/unit_tests/test_llm_providers.py +++ b/tests/unit_tests/test_llm_providers.py @@ -483,8 +483,8 @@ async def my_llm(prompt: str, *, messages=None, **kwargs) -> str: def test_get_async_llm_ask_custom_llm_warning(): from guardrails.llm_providers import AsyncArbitraryCallable - async def my_llm(prompt: str, **kwargs) -> str: - return f"Hello {prompt}!" + async def my_llm(messages: str, **kwargs) -> str: + return f"Hello {messages}!" with pytest.warns( UserWarning, @@ -500,17 +500,6 @@ async def my_llm(prompt: str, **kwargs) -> str: assert isinstance(prompt_callable, AsyncArbitraryCallable) -def test_get_async_llm_ask_custom_llm_must_accept_prompt(): - async def my_llm() -> str: - return "Hello!" - - with pytest.raises( - ValueError, - match="Custom LLM callables must accept at least one positional argument for prompt!", # noqa - ): - get_async_llm_ask(my_llm) - - def test_get_async_llm_ask_custom_llm_must_accept_kwargs(): def my_llm(prompt: str) -> str: return f"Hello {prompt}!" diff --git a/tests/unit_tests/test_rail.py b/tests/unit_tests/test_rail.py index aa44f9885..b7fede276 100644 --- a/tests/unit_tests/test_rail.py +++ b/tests/unit_tests/test_rail.py @@ -15,7 +15,7 @@ def test_rail_scalar_string(): Hello world - + """ rail_string_to_schema(rail_spec) @@ -39,6 +39,7 @@ def test_rail_object_with_scalar(): Hello world + """ rail_string_to_schema(rail_spec) From e684739e6d9d77719e2d728cf76e1fa38aaca07e Mon Sep 17 00:00:00 2001 From: David Tam Date: Tue, 24 Sep 2024 16:52:07 -0700 Subject: [PATCH 05/71] more progress --- guardrails/formatters/json_formatter.py | 12 +++- guardrails/guard.py | 14 ++-- guardrails/llm_providers.py | 29 ++++---- guardrails/run/async_runner.py | 58 ++++++++------- guardrails/run/runner.py | 24 +++---- tests/integration_tests/mock_llm_outputs.py | 5 ++ tests/integration_tests/test_formatters.py | 4 +- tests/integration_tests/test_parsing.py | 19 ++--- tests/integration_tests/test_pydantic.py | 24 ++++--- tests/integration_tests/test_python_rail.py | 34 +++++---- tests/unit_tests/test_validator_base.py | 80 +++++++-------------- 11 files changed, 150 insertions(+), 153 deletions(-) diff --git a/guardrails/formatters/json_formatter.py b/guardrails/formatters/json_formatter.py index 1c771ae61..e71b718ae 100644 --- a/guardrails/formatters/json_formatter.py +++ b/guardrails/formatters/json_formatter.py @@ -105,12 +105,16 @@ def fn( messages: Optional[List[Dict[str, str]]] = None, **kwargs, ) -> str: + prompt = "" + for msg in messages: + prompt += msg["content"] + return json.dumps( Jsonformer( model=model.model, tokenizer=model.tokenizer, json_schema=self.output_schema, - messages=messages, + prompt=prompt )() ) @@ -127,12 +131,16 @@ def fn( messages: Optional[List[Dict[str, str]]] = None, **kwargs, ) -> str: + prompt = "" + for msg in messages: + prompt += msg["content"] + return json.dumps( Jsonformer( model=model, tokenizer=tokenizer, json_schema=self.output_schema, - messages=messages, + prompt=prompt )() ) diff --git a/guardrails/guard.py b/guardrails/guard.py index f5c1243b8..c73f15465 100644 --- a/guardrails/guard.py +++ b/guardrails/guard.py @@ -647,8 +647,8 @@ def _execute( reask_messages=reask_messages, ) metadata = metadata or {} - if not llm_output and llm_api and not (messages): - raise RuntimeError("'messages' must be provided in order to call an LLM!") + # if not llm_output and llm_api and not (messages): + # raise RuntimeError("'messages' must be provided in order to call an LLM!") # check if validator requirements are fulfilled missing_keys = verify_metadata_requirements(metadata, self._validators) @@ -841,11 +841,11 @@ def __call__( """ messages = messages or self._exec_opts.messages or [] - if messages is not None and not len(messages): - raise RuntimeError( - "You must provide messages. " - "Alternatively, you can provide a prompt in the Schema constructor." - ) + # if messages is not None and not len(messages): + # raise RuntimeError( + # "You must provide messages. " + # "Alternatively, you can provide a prompt in the Schema constructor." + # ) return trace_guard_execution( self.name, self.history, diff --git a/guardrails/llm_providers.py b/guardrails/llm_providers.py index 368518737..2a57b5caf 100644 --- a/guardrails/llm_providers.py +++ b/guardrails/llm_providers.py @@ -43,14 +43,14 @@ def nonchat_prompt(prompt: str, instructions: Optional[str] = None) -> str: def chat_prompt( prompt: Optional[str], instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, ) -> List[Dict[str, str]]: """Prepare final prompt for chat engine.""" - if msg_history: - return msg_history + if messages: + return messages if prompt is None: raise PromptCallableException( - "You must pass in either `text` or `msg_history` to `guard.__call__`." + "You must pass in either `text` or `messages` to `guard.__call__`." ) if not instructions: @@ -65,14 +65,14 @@ def chat_prompt( def litellm_messages( prompt: Optional[str], instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, ) -> List[Dict[str, str]]: """Prepare messages for LiteLLM.""" - if msg_history: - return msg_history + if messages: + return messages if prompt is None: raise PromptCallableException( - "Either `text` or `msg_history` required for `guard.__call__`." + "Either `text` or `messages` required for `guard.__call__`." ) if instructions: @@ -143,8 +143,7 @@ def _invoke_llm( self, text: Optional[str] = None, model: str = "gpt-3.5-turbo", - instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, *args, **kwargs, ) -> LLMResponse: @@ -170,9 +169,9 @@ def _invoke_llm( "The `litellm` package is not installed. " "Install with `pip install litellm`" ) from e - if text is not None or instructions is not None or msg_history is not None: + if messages is not None: messages = litellm_messages( - prompt=text, instructions=instructions, msg_history=msg_history + prompt=text, messages=messages ) kwargs["messages"] = messages @@ -592,7 +591,7 @@ async def invoke_llm( self, text: Optional[str] = None, instructions: Optional[str] = None, - msg_history: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, *args, **kwargs, ): @@ -619,11 +618,11 @@ async def invoke_llm( "Install with `pip install litellm`" ) from e - if text is not None or instructions is not None or msg_history is not None: + if text is not None or instructions is not None or messages is not None: messages = litellm_messages( prompt=text, instructions=instructions, - msg_history=msg_history, + messages=messages, ) kwargs["messages"] = messages diff --git a/guardrails/run/async_runner.py b/guardrails/run/async_runner.py index 4e57b50ff..962d8cac9 100644 --- a/guardrails/run/async_runner.py +++ b/guardrails/run/async_runner.py @@ -22,6 +22,8 @@ from guardrails.actions.reask import NonParseableReAsk, ReAsk from guardrails.telemetry import trace_async_call, trace_async_step +from guardrails.constants import fail_status +from guardrails.prompt import Prompt class AsyncRunner(Runner): def __init__( @@ -339,29 +341,37 @@ async def prepare_messages( async def validate_messages( self, call_log: Call, messages: MessageHistory, attempt_number: int ): - msg_str = messages_string(messages) - inputs = Inputs( - llm_output=msg_str, - ) - iteration = Iteration(call_id=call_log.id, index=attempt_number, inputs=inputs) - call_log.iterations.insert(0, iteration) - value, _metadata = await validator_service.async_validate( - value=msg_str, - metadata=self.metadata, - validator_map=self.validation_map, - iteration=iteration, - disable_tracer=self._disable_tracer, - path="messages", - ) - validated_messages = validator_service.post_process_validation( - value, attempt_number, iteration, OutputTypes.STRING - ) - validated_messages = cast(str, validated_messages) + for msg in messages: + content = ( + msg["content"].source + if isinstance(msg["content"], Prompt) + else msg["content"] + ) + inputs = Inputs( + llm_output=content, + ) + iteration = Iteration(call_id=call_log.id, index=attempt_number, inputs=inputs) + call_log.iterations.insert(0, iteration) + value, _metadata = await validator_service.async_validate( + value=content, + metadata=self.metadata, + validator_map=self.validation_map, + iteration=iteration, + disable_tracer=self._disable_tracer, + path="messages", + ) - iteration.outputs.validation_response = validated_messages - if isinstance(validated_messages, ReAsk): - raise ValidationError( - f"Messages validation failed: " f"{validated_messages}" + validated_msg = validator_service.post_process_validation( + value, attempt_number, iteration, OutputTypes.STRING ) - if validated_messages != msg_str: - raise ValidationError("Messages validation failed") + + iteration.outputs.validation_response = validated_msg + + if isinstance(validated_msg, ReAsk): + raise ValidationError(f"Messages validation failed: {validated_msg}") + elif not validated_msg or iteration.status == fail_status: + raise ValidationError("Messages validation failed") + + msg["content"] = cast(str, validated_msg) + + return messages # type: ignore \ No newline at end of file diff --git a/guardrails/run/runner.py b/guardrails/run/runner.py index d4bf82505..7e666b876 100644 --- a/guardrails/run/runner.py +++ b/guardrails/run/runner.py @@ -287,22 +287,17 @@ def step( def validate_messages( self, call_log: Call, messages: MessageHistory, attempt_number: int ) -> None: - msg_str = messages_string(messages) - inputs = Inputs( - llm_output=msg_str, - ) - iteration = Iteration(call_id=call_log.id, index=attempt_number, inputs=inputs) - call_log.iterations.insert(0, iteration) - - validated_msgs = "" - for msg in messages: content = ( msg["content"].source if isinstance(msg["content"], Prompt) else msg["content"] ) - + inputs = Inputs( + llm_output=content, + ) + iteration = Iteration(call_id=call_log.id, index=attempt_number, inputs=inputs) + call_log.iterations.insert(0, iteration) value, _metadata = validator_service.validate( value=content, metadata=self.metadata, @@ -315,16 +310,15 @@ def validate_messages( validated_msg = validator_service.post_process_validation( value, attempt_number, iteration, OutputTypes.STRING ) + + iteration.outputs.validation_response = validated_msg if isinstance(validated_msg, ReAsk): - raise ValidationError(f"Message validation failed: {validated_msg}") + raise ValidationError(f"Messages validation failed: {validated_msg}") elif not validated_msg or iteration.status == fail_status: - raise ValidationError("Message validation failed") + raise ValidationError("Messages validation failed") msg["content"] = cast(str, validated_msg) - validated_msgs += validated_msg - - iteration.outputs.validation_response = validated_msgs return messages # type: ignore diff --git a/tests/integration_tests/mock_llm_outputs.py b/tests/integration_tests/mock_llm_outputs.py index 1f5ba0975..f292451b3 100644 --- a/tests/integration_tests/mock_llm_outputs.py +++ b/tests/integration_tests/mock_llm_outputs.py @@ -128,6 +128,11 @@ def _invoke_llm( } try: + if msg_history: + key = (msg_history[0]["content"], msg_history[1]["content"]) + print("=========trying key", key) + out_text = mock_llm_responses[key] + print("========found out text", out_text) if prompt and instructions and not msg_history: out_text = mock_llm_responses[(prompt, instructions)] elif msg_history and not prompt and not instructions: diff --git a/tests/integration_tests/test_formatters.py b/tests/integration_tests/test_formatters.py index 48f9628b8..b6c3f341a 100644 --- a/tests/integration_tests/test_formatters.py +++ b/tests/integration_tests/test_formatters.py @@ -25,7 +25,7 @@ class Foo(BaseModel): bez: List[str] g = Guard.from_pydantic(Foo, output_formatter="jsonformer") - response = g(model.generate, tokenizer=tokenizer, prompt="test") + response = g(model.generate, tokenizer=tokenizer, messages=[{"content": "test","role": "user"}]) validated_output = response.validated_output assert isinstance(validated_output, dict) assert "bar" in validated_output @@ -45,7 +45,7 @@ class Foo(BaseModel): bez: List[str] g = Guard.from_pydantic(Foo, output_formatter="jsonformer") - response = g(model, prompt="Sample:") + response = g(model, messages=[{"content": "Sample:","role": "user"}]) validated_output = response.validated_output assert isinstance(validated_output, dict) assert "bar" in validated_output diff --git a/tests/integration_tests/test_parsing.py b/tests/integration_tests/test_parsing.py index 9a1216ce4..3397b3b3e 100644 --- a/tests/integration_tests/test_parsing.py +++ b/tests/integration_tests/test_parsing.py @@ -49,16 +49,16 @@ def test_parsing_reask(mocker): assert call.iterations.length == 2 # For orginal prompt and output - assert call.compiled_prompt == pydantic.PARSING_COMPILED_PROMPT + assert call.compiled_messages[0]["content"]._source == pydantic.PARSING_COMPILED_PROMPT assert call.iterations.first.raw_output == pydantic.PARSING_UNPARSEABLE_LLM_OUTPUT assert call.iterations.first.guarded_output is None # For re-asked prompt and output - assert call.iterations.last.inputs.prompt == gd.Prompt( + assert call.iterations.last.inputs.messages[1]["content"] == gd.Prompt( pydantic.PARSING_COMPILED_REASK ) # Same as above - assert call.reask_prompts.last == pydantic.PARSING_COMPILED_REASK + assert call.reask_messages[0][1]["content"]._source == pydantic.PARSING_COMPILED_REASK assert call.raw_outputs.last == pydantic.PARSING_EXPECTED_LLM_OUTPUT assert call.guarded_output == pydantic.PARSING_EXPECTED_OUTPUT @@ -83,7 +83,8 @@ async def test_async_parsing_reask(mocker): ] guard = gd.AsyncGuard.from_pydantic( - output_class=pydantic.PersonalDetails, prompt=pydantic.PARSING_INITIAL_PROMPT + output_class=pydantic.PersonalDetails, + messages=[{"role": "user", "content": pydantic.PARSING_INITIAL_PROMPT}], ) final_output = await guard( @@ -100,17 +101,17 @@ async def test_async_parsing_reask(mocker): assert call.iterations.length == 2 # For orginal prompt and output - assert call.compiled_prompt == pydantic.PARSING_COMPILED_PROMPT + assert call.compiled_messages[0]["content"]._source == pydantic.PARSING_COMPILED_PROMPT assert call.iterations.first.raw_output == pydantic.PARSING_UNPARSEABLE_LLM_OUTPUT assert call.iterations.first.guarded_output is None # For re-asked prompt and output - assert call.iterations.last.inputs.prompt == gd.Prompt( + assert call.iterations.last.inputs.messages[1]["content"] == gd.Prompt( pydantic.PARSING_COMPILED_REASK ) # Same as above - assert call.reask_prompts.last == pydantic.PARSING_COMPILED_REASK + assert call.reask_messages[0][1]["content"]._source == pydantic.PARSING_COMPILED_REASK assert call.raw_outputs.last == pydantic.PARSING_EXPECTED_LLM_OUTPUT assert call.guarded_output == pydantic.PARSING_EXPECTED_OUTPUT @@ -123,7 +124,7 @@ def test_reask_prompt_instructions(mocker): """ mocker.patch( - "guardrails.llm_providers.OpenAIChatCallable._invoke_llm", + "guardrails.llm_providers.LiteLLMCallable._invoke_llm", return_value=LLMResponse( output=string.MSG_LLM_OUTPUT_CORRECT, prompt_token_count=123, @@ -144,7 +145,7 @@ def always_fail(value: str, metadata: Dict) -> ValidationResult: guard.parse( llm_output="Tomato Cheese Pizza", - llm_api=openai.chat.completions.create, + model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "Some content"}, {"role": "user", "content": "Some prompt"}, diff --git a/tests/integration_tests/test_pydantic.py b/tests/integration_tests/test_pydantic.py index 15610acb1..47ee05992 100644 --- a/tests/integration_tests/test_pydantic.py +++ b/tests/integration_tests/test_pydantic.py @@ -36,10 +36,12 @@ def test_pydantic_with_reask(mocker): ), ] - guard = gd.Guard.from_pydantic(ListOfPeople, prompt=VALIDATED_RESPONSE_REASK_PROMPT) + guard = gd.Guard.from_pydantic(ListOfPeople, + messages=[{ + "role": "user", + "content": VALIDATED_RESPONSE_REASK_PROMPT}]) final_output = guard( - openai.completions.create, - engine="text-davinci-003", + model="text-davinci-003", max_tokens=512, temperature=0.5, num_reasks=2, @@ -55,8 +57,8 @@ def test_pydantic_with_reask(mocker): # Check that the guard state object has the correct number of re-asks. assert call.iterations.length == 3 - # For orginal prompt and output - assert call.compiled_prompt == pydantic.COMPILED_PROMPT + # For original prompt and output + assert call.compiled_messages[0]["content"]._source == pydantic.COMPILED_PROMPT assert call.iterations.first.raw_output == pydantic.LLM_OUTPUT assert ( call.iterations.first.validation_response == pydantic.VALIDATED_OUTPUT_REASK_1 @@ -102,7 +104,7 @@ def test_pydantic_with_reask(mocker): def test_pydantic_with_full_schema_reask(mocker): """Test that the entity extraction works with re-asking.""" mock_invoke_llm = mocker.patch( - "guardrails.llm_providers.OpenAIChatCallable._invoke_llm" + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" ) mock_invoke_llm.side_effect = [ LLMResponse( @@ -122,9 +124,11 @@ def test_pydantic_with_full_schema_reask(mocker): ), ] - guard = gd.Guard.from_pydantic(ListOfPeople, prompt=VALIDATED_RESPONSE_REASK_PROMPT) + guard = gd.Guard.from_pydantic(ListOfPeople, messages=[{ + "content": VALIDATED_RESPONSE_REASK_PROMPT, + "role": "user", + }]) final_output = guard( - openai.chat.completions.create, model="gpt-3.5-turbo", max_tokens=512, temperature=0.5, @@ -142,8 +146,8 @@ def test_pydantic_with_full_schema_reask(mocker): assert call.iterations.length == 3 # For orginal prompt and output - assert call.compiled_prompt == pydantic.COMPILED_PROMPT_CHAT - assert call.compiled_instructions == pydantic.COMPILED_INSTRUCTIONS_CHAT + assert call.compiled_messages[0]["content"]._source == pydantic.COMPILED_PROMPT_CHAT + assert call.compiled_messages[1]["content"] == pydantic.COMPILED_INSTRUCTIONS_CHAT assert call.iterations.first.raw_output == pydantic.LLM_OUTPUT assert ( call.iterations.first.validation_response == pydantic.VALIDATED_OUTPUT_REASK_1 diff --git a/tests/integration_tests/test_python_rail.py b/tests/integration_tests/test_python_rail.py index 305b9446c..662fbfd92 100644 --- a/tests/integration_tests/test_python_rail.py +++ b/tests/integration_tests/test_python_rail.py @@ -99,7 +99,7 @@ class Director(BaseModel): def test_python_rail(mocker): mock_invoke_llm = mocker.patch( - "guardrails.llm_providers.OpenAIChatCallable._invoke_llm" + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" ) mock_invoke_llm.side_effect = [ LLMResponse( @@ -116,19 +116,25 @@ def test_python_rail(mocker): guard = gd.Guard.from_pydantic( output_class=Director, - prompt=( - "Provide detailed information about the top 5 grossing movies from" - " ${director} including release date, duration, budget, whether " - "it's a sequel, website, and contact email.\n" - "${gr.xml_suffix_without_examples}" - ), - instructions="\nYou are a helpful assistant only capable of communicating" - " with valid JSON, and no other text.\n${gr.xml_suffix_prompt_examples}", + messages=[ + { + "role": "system", + "content": "\nYou are a helpful assistant only capable of communicating" + " with valid JSON, and no other text.\n${gr.xml_suffix_prompt_examples}", + }, + { + "role": "user", + "content":"Provide detailed information about the top 5 grossing movies from" + " ${director} including release date, duration, budget, whether " + "it's a sequel, website, and contact email.\n" + "${gr.xml_suffix_without_examples}", + }, + ], ) # Guardrails runs validation and fixes the first failing output through reasking final_output = guard( - openai.chat.completions.create, + model="gpt-3.5-turbo", prompt_params={"director": "Christopher Nolan"}, num_reasks=2, full_schema_reask=False, @@ -146,7 +152,7 @@ def test_python_rail(mocker): assert call.iterations.length == 2 assert ( - call.compiled_prompt + call.compiled_messages[1]["content"]._source == python_rail.COMPILED_PROMPT_1_PYDANTIC_2_WITHOUT_INSTRUCTIONS ) @@ -155,11 +161,11 @@ def test_python_rail(mocker): == python_rail.LLM_OUTPUT_1_FAIL_GUARDRAILS_VALIDATION ) - assert call.iterations.last.inputs.prompt == gd.Prompt( + assert call.iterations.last.inputs.messages[1]["content"] == gd.Prompt( python_rail.COMPILED_PROMPT_2_WITHOUT_INSTRUCTIONS ) # Same as above - assert call.reask_prompts.last == python_rail.COMPILED_PROMPT_2_WITHOUT_INSTRUCTIONS + assert call.reask_messages[0][1]["content"]._source == python_rail.COMPILED_PROMPT_2_WITHOUT_INSTRUCTIONS assert ( call.raw_outputs.last == python_rail.LLM_OUTPUT_2_SUCCEED_GUARDRAILS_BUT_FAIL_PYDANTIC_VALIDATION @@ -201,7 +207,7 @@ def test_python_string(mocker): ], ) final_output = guard( - llm_api=openai.completions.create, + model="gpt-3.5-turbo", prompt_params={"ingredients": "tomato, cheese, sour cream"}, num_reasks=1, max_tokens=100, diff --git a/tests/unit_tests/test_validator_base.py b/tests/unit_tests/test_validator_base.py index a4b5cb322..b3c5dcaa7 100644 --- a/tests/unit_tests/test_validator_base.py +++ b/tests/unit_tests/test_validator_base.py @@ -1,7 +1,6 @@ import json import re from typing import Any, Dict, List -import openai import pytest from pydantic import BaseModel, Field @@ -451,7 +450,7 @@ class Pet(BaseModel): def test_input_validation_fix(mocker): - def mock_llm_api(prompt, *args, instructions=None, messages=None, **kwargs): + def mock_llm_api(*args, messages=None, **kwargs): return json.dumps({"name": "Fluffy"}) # fix returns an amended value for prompt/instructions validation, @@ -467,20 +466,9 @@ def mock_llm_api(prompt, *args, instructions=None, messages=None, **kwargs): } ], ) - assert ( - guard.history.first.iterations.first.outputs.validation_response == "What kind" - ) - guard = Guard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=OnFailAction.FIX), on="instructions") - guard( - mock_llm_api, - prompt="What kind of pet should I get and what should I name it?", - instructions="But really, what kind of pet should I get?", - ) assert ( - guard.history.first.iterations.first.outputs.validation_response - == "But really," + guard.history.first.iterations.first.outputs.validation_response == "What kind" ) # but raises for messages validation @@ -497,7 +485,7 @@ def mock_llm_api(prompt, *args, instructions=None, messages=None, **kwargs): } ], ) - assert str(excinfo.value) == "Message history validation failed" + assert str(excinfo.value) == "Validation failed for field with errors: must be exactly two words" assert isinstance(guard.history.first.exception, ValidationError) assert guard.history.first.exception == excinfo.value @@ -509,8 +497,8 @@ def mock_llm_api(prompt, *args, instructions=None, messages=None, **kwargs): validators="two-words" on-fail-two-words="fix" > - This is not two words - This also is not two words + This is not two words + This also is not two words @@ -568,19 +556,17 @@ async def mock_llm_api(*args, messages=None, **kwargs) -> str: guard = AsyncGuard.from_pydantic(output_class=Pet) guard.use(TwoWords(on_fail=OnFailAction.FIX), on="messages") - with pytest.raises(ValidationError) as excinfo: - await guard( - mock_llm_api, - messages=[ - { - "role": "user", - "content": "What kind of pet should I get?", - } - ], - ) - assert str(excinfo.value) == "Messages validation failed" - assert isinstance(guard.history.first.exception, ValidationError) - assert guard.history.first.exception == excinfo.value + await guard( + mock_llm_api, + messages=[ + { + "role": "user", + "content": "What kind of pet should I get?", + } + ], + ) + + assert guard.history.first.iterations.first.outputs.validation_response == "What kind" # rail prompt validation guard = AsyncGuard.from_rail_string( @@ -590,7 +576,7 @@ async def mock_llm_api(*args, messages=None, **kwargs) -> str: validators="two-words" on-fail-two-words="fix" > -This is not two words +This is not two words @@ -608,18 +594,18 @@ async def mock_llm_api(*args, messages=None, **kwargs) -> str: [ ( OnFailAction.REASK, - "Message validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa - "Message validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa + "Messages validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa + "Messages validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa ), ( OnFailAction.FILTER, - "Message validation failed", - "Message validation failed", + "Messages validation failed", + "Messages validation failed", ), ( OnFailAction.REFRAIN, - "Message validation failed", - "Message validation failed", + "Messages validation failed", + "Messages validation failed", ), ( OnFailAction.EXCEPTION, @@ -690,8 +676,8 @@ def custom_llm(*args, messages=None, **kwargs): [ ( OnFailAction.REASK, - "Message validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa - "Message validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa + "Messages validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa + "Messages validation failed: incorrect_value='What kind of pet should I get?' fail_results=[FailResult(outcome='fail', error_message='must be exactly two words', fix_value='What kind', error_spans=None, metadata=None, validated_chunk=None)] additional_properties={} path=None", # noqa ), ( OnFailAction.FILTER, @@ -782,19 +768,3 @@ async def custom_llm(*args, messages=None, **kwargs) -> str: assert isinstance(guard.history.last.exception, ValidationError) assert guard.history.last.exception == excinfo.value - -def test_input_validation_mismatch_raise(): - # messages validation, prompt argument - guard = Guard.from_pydantic(output_class=Pet) - guard.use(TwoWords(on_fail=OnFailAction.FIX), on="messages") - - with pytest.raises(ValueError): - guard( - openai.completions.create, - messages=[ - { - "role": "user", - "content": "What kind of pet should I get?", - } - ], - ) From 18591b73756467ff9fcb5b86dfd428fbd9c2177f Mon Sep 17 00:00:00 2001 From: David Tam Date: Wed, 25 Sep 2024 13:17:46 -0700 Subject: [PATCH 06/71] fix some more tests --- guardrails/async_guard.py | 2 +- guardrails/run/async_runner.py | 2 +- guardrails/run/async_stream_runner.py | 31 +++++++++++++-------------- guardrails/run/stream_runner.py | 25 ++++++++++++--------- 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/guardrails/async_guard.py b/guardrails/async_guard.py index 6683f5b88..a60a2d562 100644 --- a/guardrails/async_guard.py +++ b/guardrails/async_guard.py @@ -408,7 +408,7 @@ async def __call__( # Determine the final value for messages messages = messages or messages_from_kwargs or messages_from_exec_opts or [] - print("===== messages is", messages) + if messages is not None and not len(messages): raise RuntimeError( "You must provide a prompt if messages is empty. " diff --git a/guardrails/run/async_runner.py b/guardrails/run/async_runner.py index 962d8cac9..03a75a755 100644 --- a/guardrails/run/async_runner.py +++ b/guardrails/run/async_runner.py @@ -300,7 +300,7 @@ async def async_prepare( prompt_params = prompt_params or {} if api is None: raise UserFacingException(ValueError("API must be provided.")) - print("===== runner messages are", messages) + if messages: # Runner.prepare_messages messages = await self.prepare_messages( diff --git a/guardrails/run/async_stream_runner.py b/guardrails/run/async_stream_runner.py index 3a13a3022..db4fb24c7 100644 --- a/guardrails/run/async_stream_runner.py +++ b/guardrails/run/async_stream_runner.py @@ -15,9 +15,7 @@ from guardrails.classes.output_type import OutputTypes from guardrails.constants import pass_status from guardrails.llm_providers import ( - AsyncLiteLLMCallable, AsyncPromptCallableBase, - LiteLLMCallable, PromptCallableBase, ) from guardrails.logger import set_scope @@ -202,23 +200,24 @@ async def async_step( def get_chunk_text(self, chunk: Any, api: Union[PromptCallableBase, None]) -> str: """Get the text from a chunk.""" chunk_text = "" - if isinstance(api, LiteLLMCallable): + try: finished = chunk.choices[0].finish_reason - content = chunk.choices[0].delta.content + content = chunk.choices[0].text if not finished and content: chunk_text = content - elif isinstance(api, AsyncLiteLLMCallable): - finished = chunk.choices[0].finish_reason - content = chunk.choices[0].delta.content - if not finished and content: - chunk_text = content - else: + except Exception as e: try: - chunk_text = chunk + finished = chunk.choices[0].finish_reason + content = chunk.choices[0].delta.content + if not finished and content: + chunk_text = content except Exception as e: - raise ValueError( - f"Error getting chunk from stream: {e}. " - "Non-OpenAI API callables expected to return " - "a generator of strings." - ) from e + try: + chunk_text = chunk + except Exception as e: + raise ValueError( + f"Error getting chunk from stream: {e}. " + "Non-OpenAI API callables expected to return " + "a generator of strings." + ) from e return chunk_text diff --git a/guardrails/run/stream_runner.py b/guardrails/run/stream_runner.py index e7c7bd4b7..f09d0df64 100644 --- a/guardrails/run/stream_runner.py +++ b/guardrails/run/stream_runner.py @@ -5,7 +5,6 @@ from guardrails.classes.output_type import OT, OutputTypes from guardrails.classes.validation_outcome import ValidationOutcome from guardrails.llm_providers import ( - LiteLLMCallable, PromptCallableBase, ) from guardrails.run.runner import Runner @@ -249,20 +248,26 @@ def is_last_chunk(self, chunk: Any, api: Union[PromptCallableBase, None]) -> boo def get_chunk_text(self, chunk: Any, api: Union[PromptCallableBase, None]) -> str: """Get the text from a chunk.""" chunk_text = "" - if isinstance(api, LiteLLMCallable): + try: finished = chunk.choices[0].finish_reason - content = chunk.choices[0].delta.content + content = chunk.choices[0].text if not finished and content: chunk_text = content - else: + except Exception as e: try: - chunk_text = chunk + finished = chunk.choices[0].finish_reason + content = chunk.choices[0].delta.content + if not finished and content: + chunk_text = content except Exception as e: - raise ValueError( - f"Error getting chunk from stream: {e}. " - "Non-OpenAI API callables expected to return " - "a generator of strings." - ) from e + try: + chunk_text = chunk + except Exception as e: + raise ValueError( + f"Error getting chunk from stream: {e}. " + "Non-OpenAI API callables expected to return " + "a generator of strings." + ) from e return chunk_text def parse( From a1f7893c0bad7341dffeb33f03d3f2790feceb28 Mon Sep 17 00:00:00 2001 From: David Tam Date: Wed, 25 Sep 2024 13:18:12 -0700 Subject: [PATCH 07/71] fix some more tests --- guardrails/run/async_runner.py | 21 +++++++++++---------- guardrails/run/async_stream_runner.py | 4 ++-- guardrails/run/stream_runner.py | 4 ++-- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/guardrails/run/async_runner.py b/guardrails/run/async_runner.py index 03a75a755..64cc43b51 100644 --- a/guardrails/run/async_runner.py +++ b/guardrails/run/async_runner.py @@ -1,6 +1,6 @@ import copy from functools import partial -from typing import Any, Dict, List, Optional, Union, cast +from typing import Any, Dict, List, Optional, cast from guardrails import validator_service @@ -11,7 +11,7 @@ from guardrails.llm_providers import AsyncPromptCallableBase from guardrails.logger import set_scope from guardrails.run.runner import Runner -from guardrails.run.utils import messages_source, messages_string +from guardrails.run.utils import messages_source from guardrails.schema.validator import schema_validation from guardrails.hub_telemetry.hub_tracing import async_trace from guardrails.types.inputs import MessageHistory @@ -25,6 +25,7 @@ from guardrails.constants import fail_status from guardrails.prompt import Prompt + class AsyncRunner(Runner): def __init__( self, @@ -331,9 +332,7 @@ async def prepare_messages( formatted_messages.append(msg_copy) if "messages" in self.validation_map: - await self.validate_messages( - call_log, formatted_messages, attempt_number - ) + await self.validate_messages(call_log, formatted_messages, attempt_number) return formatted_messages @@ -348,9 +347,11 @@ async def validate_messages( else msg["content"] ) inputs = Inputs( - llm_output=content, - ) - iteration = Iteration(call_id=call_log.id, index=attempt_number, inputs=inputs) + llm_output=content, + ) + iteration = Iteration( + call_id=call_log.id, index=attempt_number, inputs=inputs + ) call_log.iterations.insert(0, iteration) value, _metadata = await validator_service.async_validate( value=content, @@ -364,7 +365,7 @@ async def validate_messages( validated_msg = validator_service.post_process_validation( value, attempt_number, iteration, OutputTypes.STRING ) - + iteration.outputs.validation_response = validated_msg if isinstance(validated_msg, ReAsk): @@ -374,4 +375,4 @@ async def validate_messages( msg["content"] = cast(str, validated_msg) - return messages # type: ignore \ No newline at end of file + return messages # type: ignore diff --git a/guardrails/run/async_stream_runner.py b/guardrails/run/async_stream_runner.py index db4fb24c7..af0d33610 100644 --- a/guardrails/run/async_stream_runner.py +++ b/guardrails/run/async_stream_runner.py @@ -205,13 +205,13 @@ def get_chunk_text(self, chunk: Any, api: Union[PromptCallableBase, None]) -> st content = chunk.choices[0].text if not finished and content: chunk_text = content - except Exception as e: + except Exception: try: finished = chunk.choices[0].finish_reason content = chunk.choices[0].delta.content if not finished and content: chunk_text = content - except Exception as e: + except Exception: try: chunk_text = chunk except Exception as e: diff --git a/guardrails/run/stream_runner.py b/guardrails/run/stream_runner.py index f09d0df64..b848914db 100644 --- a/guardrails/run/stream_runner.py +++ b/guardrails/run/stream_runner.py @@ -253,13 +253,13 @@ def get_chunk_text(self, chunk: Any, api: Union[PromptCallableBase, None]) -> st content = chunk.choices[0].text if not finished and content: chunk_text = content - except Exception as e: + except Exception: try: finished = chunk.choices[0].finish_reason content = chunk.choices[0].delta.content if not finished and content: chunk_text = content - except Exception as e: + except Exception: try: chunk_text = chunk except Exception as e: From 67feff464465c86870832746f8ffe7e232a093ea Mon Sep 17 00:00:00 2001 From: David Tam Date: Wed, 25 Sep 2024 16:58:28 -0700 Subject: [PATCH 08/71] more progress --- guardrails/actions/reask.py | 5 +- guardrails/guard.py | 1 + guardrails/llm_providers.py | 26 ++++------ guardrails/prompt/messages.py | 8 +++- guardrails/run/async_stream_runner.py | 5 +- guardrails/run/runner.py | 1 - guardrails/run/stream_runner.py | 5 +- tests/integration_tests/mock_llm_outputs.py | 24 +++++----- .../test_assets/custom_llm.py | 4 +- .../test_assets/string/compiled_prompt.txt | 4 -- .../string/compiled_prompt_reask.txt | 4 -- .../integration_tests/test_data_validation.py | 2 +- tests/integration_tests/test_guard.py | 47 +++++++++---------- tests/integration_tests/test_pydantic.py | 12 ++--- tests/integration_tests/test_python_rail.py | 26 +++++++--- tests/integration_tests/test_streaming.py | 4 +- .../integration_tests/test_validator_base.py | 1 - tests/unit_tests/classes/history/test_call.py | 2 +- tests/unit_tests/mocks/mock_custom_llm.py | 12 ++--- tests/unit_tests/test_llm_providers.py | 12 ++--- tests/unit_tests/test_validator_base.py | 8 ++-- 21 files changed, 104 insertions(+), 109 deletions(-) diff --git a/guardrails/actions/reask.py b/guardrails/actions/reask.py index eced6ce47..037db446e 100644 --- a/guardrails/actions/reask.py +++ b/guardrails/actions/reask.py @@ -284,10 +284,7 @@ def get_reask_setup_for_string( ) instructions = None - if exec_options.reask_instructions: - instructions = Instructions(exec_options.reask_instructions) - if instructions is None: - instructions = Instructions("You are a helpful assistant.") + instructions = Instructions("You are a helpful assistant.") instructions = instructions.format( output_schema=schema_prompt_content, xml_output_schema=xml_output_schema, diff --git a/guardrails/guard.py b/guardrails/guard.py index c73f15465..52f9c3093 100644 --- a/guardrails/guard.py +++ b/guardrails/guard.py @@ -841,6 +841,7 @@ def __call__( """ messages = messages or self._exec_opts.messages or [] + print("==== messages is", messages) # if messages is not None and not len(messages): # raise RuntimeError( # "You must provide messages. " diff --git a/guardrails/llm_providers.py b/guardrails/llm_providers.py index 2a57b5caf..73ba3f4b6 100644 --- a/guardrails/llm_providers.py +++ b/guardrails/llm_providers.py @@ -416,16 +416,13 @@ def _invoke_llm(self, prompt: str, pipeline: Any, *args, **kwargs) -> LLMRespons class ArbitraryCallable(PromptCallableBase): def __init__(self, llm_api: Optional[Callable] = None, *args, **kwargs): llm_api_args = inspect.getfullargspec(llm_api) + if not llm_api_args.args: + raise ValueError( + "Custom LLM callables must accept" + " at least one positional argument for messages!" + ) if not llm_api_args.varkw: raise ValueError("Custom LLM callables must accept **kwargs!") - if not llm_api_args.kwonlyargs or "messages" not in llm_api_args.kwonlyargs: - warnings.warn( - "We recommend including 'messages'" - " as keyword-only arguments for custom LLM callables." - " Doing so ensures these arguments are not unintentionally" - " passed through to other calls via **kwargs.", - UserWarning, - ) self.llm_api = llm_api super().__init__(*args, **kwargs) @@ -766,16 +763,13 @@ async def invoke_llm( class AsyncArbitraryCallable(AsyncPromptCallableBase): def __init__(self, llm_api: Callable, *args, **kwargs): llm_api_args = inspect.getfullargspec(llm_api) + if not llm_api_args.args: + raise ValueError( + "Custom LLM callables must accept" + " at least one positional argument for messages!" + ) if not llm_api_args.varkw: raise ValueError("Custom LLM callables must accept **kwargs!") - if not llm_api_args.kwonlyargs or "messages" not in llm_api_args.kwonlyargs: - warnings.warn( - "We recommend including 'messages'" - " as keyword-only arguments for custom LLM callables." - " Doing so ensures these arguments are not uninentionally" - " passed through to other calls via **kwargs.", - UserWarning, - ) self.llm_api = llm_api super().__init__(*args, **kwargs) diff --git a/guardrails/prompt/messages.py b/guardrails/prompt/messages.py index 16b8c84cd..3e77e56be 100644 --- a/guardrails/prompt/messages.py +++ b/guardrails/prompt/messages.py @@ -62,12 +62,16 @@ def format( """Format the messages using the given keyword arguments.""" formatted_messages = [] for message in self.source: + if isinstance(message["content"], str): + msg_str = message["content"] + else: + msg_str = message["content"]._source # Only use the keyword arguments that are present in the message. - vars = get_template_variables(message["content"]) + vars = get_template_variables(msg_str) filtered_kwargs = {k: v for k, v in kwargs.items() if k in vars} # Return another instance of the class with the formatted message. - formatted_message = Template(message["content"]).safe_substitute( + formatted_message = Template(msg_str).safe_substitute( **filtered_kwargs ) formatted_messages.append( diff --git a/guardrails/run/async_stream_runner.py b/guardrails/run/async_stream_runner.py index af0d33610..5a3aecc58 100644 --- a/guardrails/run/async_stream_runner.py +++ b/guardrails/run/async_stream_runner.py @@ -200,15 +200,16 @@ async def async_step( def get_chunk_text(self, chunk: Any, api: Union[PromptCallableBase, None]) -> str: """Get the text from a chunk.""" chunk_text = "" + try: finished = chunk.choices[0].finish_reason - content = chunk.choices[0].text + content = chunk.choices[0].delta.content if not finished and content: chunk_text = content except Exception: try: finished = chunk.choices[0].finish_reason - content = chunk.choices[0].delta.content + content = chunk.choices[0].text if not finished and content: chunk_text = content except Exception: diff --git a/guardrails/run/runner.py b/guardrails/run/runner.py index 7e666b876..dd50a806c 100644 --- a/guardrails/run/runner.py +++ b/guardrails/run/runner.py @@ -35,7 +35,6 @@ from guardrails.actions.reask import NonParseableReAsk, ReAsk, introspect from guardrails.telemetry import trace_call, trace_step - class Runner: """Runner class that calls an LLM API with a prompt, and performs input and output validation. diff --git a/guardrails/run/stream_runner.py b/guardrails/run/stream_runner.py index b848914db..38e6fbd65 100644 --- a/guardrails/run/stream_runner.py +++ b/guardrails/run/stream_runner.py @@ -5,6 +5,7 @@ from guardrails.classes.output_type import OT, OutputTypes from guardrails.classes.validation_outcome import ValidationOutcome from guardrails.llm_providers import ( + LiteLLMCallable, PromptCallableBase, ) from guardrails.run.runner import Runner @@ -250,13 +251,13 @@ def get_chunk_text(self, chunk: Any, api: Union[PromptCallableBase, None]) -> st chunk_text = "" try: finished = chunk.choices[0].finish_reason - content = chunk.choices[0].text + content = chunk.choices[0].delta.content if not finished and content: chunk_text = content except Exception: try: finished = chunk.choices[0].finish_reason - content = chunk.choices[0].delta.content + content = chunk.choices[0].text if not finished and content: chunk_text = content except Exception: diff --git a/tests/integration_tests/mock_llm_outputs.py b/tests/integration_tests/mock_llm_outputs.py index f292451b3..b2d755dfc 100644 --- a/tests/integration_tests/mock_llm_outputs.py +++ b/tests/integration_tests/mock_llm_outputs.py @@ -66,7 +66,7 @@ def _invoke_llm( self, prompt=None, instructions=None, - msg_history=None, + messages=None, base_model=None, *args, **kwargs, @@ -128,28 +128,26 @@ def _invoke_llm( } try: - if msg_history: - key = (msg_history[0]["content"], msg_history[1]["content"]) - print("=========trying key", key) + if messages: + key = (messages[0]["content"], messages[1]["content"]) out_text = mock_llm_responses[key] - print("========found out text", out_text) - if prompt and instructions and not msg_history: + if prompt and instructions and not messages: out_text = mock_llm_responses[(prompt, instructions)] - elif msg_history and not prompt and not instructions: - if msg_history == entity_extraction.COMPILED_MSG_HISTORY: + elif messages and not prompt and not instructions: + if messages == entity_extraction.COMPILED_MSG_HISTORY: out_text = entity_extraction.LLM_OUTPUT elif ( - msg_history == string.MOVIE_MSG_HISTORY + messages == string.MOVIE_MSG_HISTORY and base_model == pydantic.WITH_MSG_HISTORY ): out_text = pydantic.MSG_HISTORY_LLM_OUTPUT_INCORRECT - elif msg_history == string.MOVIE_MSG_HISTORY: + elif messages == string.MOVIE_MSG_HISTORY: out_text = string.MSG_LLM_OUTPUT_INCORRECT else: - raise ValueError("msg_history not found") + raise ValueError("messages not found") else: raise ValueError( - "specify either prompt and instructions " "or msg_history" + "specify either prompt and instructions " "or messages" ) return LLMResponse( output=out_text, @@ -160,7 +158,7 @@ def _invoke_llm( print("Unrecognized prompt!") print("\n prompt: \n", prompt) print("\n instructions: \n", instructions) - print("\n msg_history: \n", msg_history) + print("\n messages: \n", messages) raise ValueError("Compiled prompt not found") diff --git a/tests/integration_tests/test_assets/custom_llm.py b/tests/integration_tests/test_assets/custom_llm.py index 7c4890683..3001b6f91 100644 --- a/tests/integration_tests/test_assets/custom_llm.py +++ b/tests/integration_tests/test_assets/custom_llm.py @@ -2,16 +2,16 @@ def mock_llm( + messages, *args, - messages: Optional[List[Dict[str, str]]] = None, **kwargs, ) -> str: return "" async def mock_async_llm( + messages, *args, - messages: Optional[List[Dict[str, str]]] = None, **kwargs, ) -> str: return "" diff --git a/tests/integration_tests/test_assets/string/compiled_prompt.txt b/tests/integration_tests/test_assets/string/compiled_prompt.txt index 00b66aa0e..73284f7c4 100644 --- a/tests/integration_tests/test_assets/string/compiled_prompt.txt +++ b/tests/integration_tests/test_assets/string/compiled_prompt.txt @@ -2,7 +2,3 @@ Given the following ingredients, what would you call this pizza? tomato, cheese, sour cream - - -String Output: - diff --git a/tests/integration_tests/test_assets/string/compiled_prompt_reask.txt b/tests/integration_tests/test_assets/string/compiled_prompt_reask.txt index 460efac9d..ac791914e 100644 --- a/tests/integration_tests/test_assets/string/compiled_prompt_reask.txt +++ b/tests/integration_tests/test_assets/string/compiled_prompt_reask.txt @@ -13,7 +13,3 @@ Your generated response should satisfy the following properties: - two-words Don't talk; just go. - - -String Output: - diff --git a/tests/integration_tests/test_data_validation.py b/tests/integration_tests/test_data_validation.py index 27559a80a..da20a951c 100644 --- a/tests/integration_tests/test_data_validation.py +++ b/tests/integration_tests/test_data_validation.py @@ -64,7 +64,7 @@ def test_choice_validation(llm_output, raises, fails, has_error): Dummy prompt. - + """ guard = Guard.from_rail_string(rail_spec) diff --git a/tests/integration_tests/test_guard.py b/tests/integration_tests/test_guard.py index f46762774..077aad236 100644 --- a/tests/integration_tests/test_guard.py +++ b/tests/integration_tests/test_guard.py @@ -419,7 +419,7 @@ def test_entity_extraction_with_refrain(mocker, rail, prompt): def test_entity_extraction_with_fix_chat_models(mocker, rail, messages): """Test that the entity extraction works with fix for chat models.""" mock_invoke_llm = mocker.patch( - "guardrails.llm_providers.OpenAIChatCallable._invoke_llm", + "guardrails.llm_providers.LiteLLMCallable._invoke_llm", ) mock_invoke_llm.side_effect = [ LLMResponse( @@ -566,7 +566,7 @@ def test_entity_extraction_with_reask_with_optional_prompts( ) else: mock_openai_invoke_llm = mocker.patch( - "guardrails.llm_providers.OpenAIChatCallable._invoke_llm" + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" ) mock_openai_invoke_llm.side_effect = llm_return_values @@ -709,14 +709,13 @@ def test_string_with_message_history_reask(mocker): """Test single string (non-JSON) generation with message history and reask.""" mocker.patch( - "guardrails.llm_providers.OpenAIChatCallable", + "guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable, ) - guard = gd.Guard.from_rail_string(string.RAIL_SPEC_FOR_messages) + guard = gd.Guard.from_rail_string(string.RAIL_SPEC_FOR_MSG_HISTORY) final_output = guard( - llm_api=openai.chat.completions.create, - messages=string.MOVIE_messages, + messages=string.MOVIE_MSG_HISTORY, temperature=0.0, model="gpt-3.5-turbo", ) @@ -745,16 +744,16 @@ def test_string_with_message_history_reask(mocker): def test_pydantic_with_message_history_reask(mocker): """Test JSON generation with message history re-asking.""" mock_invoke_llm = mocker.patch( - "guardrails.llm_providers.OpenAIChatCallable._invoke_llm" + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" ) mock_invoke_llm.side_effect = [ LLMResponse( - output=pydantic.messages_LLM_OUTPUT_INCORRECT, + output=pydantic.MSG_HISTORY_LLM_OUTPUT_INCORRECT, prompt_token_count=123, response_token_count=1234, ), LLMResponse( - output=pydantic.messages_LLM_OUTPUT_CORRECT, + output=pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT, prompt_token_count=123, response_token_count=1234, ), @@ -769,17 +768,17 @@ def test_pydantic_with_message_history_reask(mocker): }, ) - guard = gd.Guard.from_pydantic(output_class=pydantic.WITH_messages) + guard = gd.Guard.from_pydantic(output_class=pydantic.WITH_MSG_HISTORY) final_output = guard( llm_api=openai.chat.completions.create, - messages=string.MOVIE_messages, + messages=string.MOVIE_MSG_HISTORY, temperature=0.0, model="gpt-3.5-turbo", ) - assert final_output.raw_llm_output == pydantic.messages_LLM_OUTPUT_CORRECT + assert final_output.raw_llm_output == pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT assert final_output.validated_output == json.loads( - pydantic.messages_LLM_OUTPUT_CORRECT + pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT ) call = guard.history.first @@ -789,7 +788,7 @@ def test_pydantic_with_message_history_reask(mocker): assert call.compiled_instructions is None assert call.compiled_prompt is None - assert call.iterations.first.raw_output == pydantic.messages_LLM_OUTPUT_INCORRECT + assert call.iterations.first.raw_output == pydantic.MSG_HISTORY_LLM_OUTPUT_INCORRECT assert ( call.iterations.first.validation_response == pydantic.MSG_VALIDATED_OUTPUT_REASK ) @@ -797,8 +796,8 @@ def test_pydantic_with_message_history_reask(mocker): # For re-asked prompt and output assert call.reask_prompts.last == pydantic.MSG_COMPILED_PROMPT_REASK assert call.reask_instructions.last == pydantic.MSG_COMPILED_INSTRUCTIONS_REASK - assert call.raw_outputs.last == pydantic.messages_LLM_OUTPUT_CORRECT - assert call.guarded_output == json.loads(pydantic.messages_LLM_OUTPUT_CORRECT) + assert call.raw_outputs.last == pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT + assert call.guarded_output == json.loads(pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT) def test_sequential_validator_log_is_not_duplicated(mocker): @@ -965,19 +964,19 @@ def test_pydantic_with_lite_llm(mocker): ) mock_invoke_llm.side_effect = [ LLMResponse( - output=pydantic.messages_LLM_OUTPUT_INCORRECT, + output=pydantic.MSG_HISTORY_LLM_OUTPUT_INCORRECT, prompt_token_count=123, response_token_count=1234, ), LLMResponse( - output=pydantic.messages_LLM_OUTPUT_CORRECT, + output=pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT, prompt_token_count=123, response_token_count=1234, ), ] - guard = gd.Guard.from_pydantic(output_class=pydantic.WITH_messages) + guard = gd.Guard.from_pydantic(output_class=pydantic.WITH_MSG_HISTORY) final_output = guard( - messages=string.MOVIE_messages, model="gpt-3.5-turbo", max_tokens=10 + messages=string.MOVIE_MSG_HISTORY, model="gpt-3.5-turbo", max_tokens=10 ) assert guard.history.last.inputs.messages == [ {"role": "system", "content": "You are a helpful assistant."}, @@ -986,7 +985,7 @@ def test_pydantic_with_lite_llm(mocker): call = guard.history.first assert call.iterations.length == 2 - assert final_output.raw_llm_output == pydantic.messages_LLM_OUTPUT_CORRECT + assert final_output.raw_llm_output == pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT def test_string_output(mocker): @@ -1025,7 +1024,7 @@ def test_string_output(mocker): def test_json_function_calling_tool(mocker): mock_invoke_llm = mocker.patch( - "guardrails.llm_providers.OpenAIChatCallable._invoke_llm" + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" ) task_list = { "list": [ @@ -1086,7 +1085,7 @@ class Tasks(BaseModel): ] final_output = guard( - llm_api=openai.chat.completions.create, + model="gpt-3.5-turbo", messages=[ { "role": "user", @@ -1464,7 +1463,7 @@ def test_guard_use_many_same_instance_on_two_guards(self, mocker): # With 0.6.0 we can drop the baggage of # the prompt and instructions and just pass in the messages. class TestCustomLLMApi: - def test_with_messages(self, mocker): + def test_WITH_MSG_HISTORY(self, mocker): mock_llm = mocker.Mock() def custom_llm( diff --git a/tests/integration_tests/test_pydantic.py b/tests/integration_tests/test_pydantic.py index 47ee05992..5b909481e 100644 --- a/tests/integration_tests/test_pydantic.py +++ b/tests/integration_tests/test_pydantic.py @@ -145,21 +145,17 @@ def test_pydantic_with_full_schema_reask(mocker): # Check that the guard state object has the correct number of re-asks. assert call.iterations.length == 3 - # For orginal prompt and output + # For original prompt and output assert call.compiled_messages[0]["content"]._source == pydantic.COMPILED_PROMPT_CHAT - assert call.compiled_messages[1]["content"] == pydantic.COMPILED_INSTRUCTIONS_CHAT assert call.iterations.first.raw_output == pydantic.LLM_OUTPUT assert ( call.iterations.first.validation_response == pydantic.VALIDATED_OUTPUT_REASK_1 ) # For re-asked prompt and output - assert call.iterations.at(1).inputs.prompt == gd.Prompt( - pydantic.COMPILED_PROMPT_FULL_REASK_1 - ) - assert call.iterations.at(1).inputs.instructions == gd.Instructions( - pydantic.COMPILED_INSTRUCTIONS_CHAT - ) + assert call.iterations.at(1).inputs.messages[0]["content"]._source == pydantic.COMPILED_INSTRUCTIONS_CHAT + assert call.iterations.at(1).inputs.messages[1]["content"]._source == pydantic.COMPILED_PROMPT_FULL_REASK + assert call.iterations.at(1).raw_output == pydantic.LLM_OUTPUT_FULL_REASK_1 assert ( call.iterations.at(1).validation_response == pydantic.VALIDATED_OUTPUT_REASK_2 diff --git a/tests/integration_tests/test_python_rail.py b/tests/integration_tests/test_python_rail.py index 662fbfd92..60f4bfbbe 100644 --- a/tests/integration_tests/test_python_rail.py +++ b/tests/integration_tests/test_python_rail.py @@ -182,8 +182,22 @@ def test_python_rail(mocker): def test_python_string(mocker): """Test single string (non-JSON) generation via pydantic with re-asking.""" - mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) - + # mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) + mock_invoke_llm = mocker.patch( + "guardrails.llm_providers.LiteLLMCallable._invoke_llm", + ) + mock_invoke_llm.side_effect = [ + LLMResponse( + output=string.LLM_OUTPUT, + prompt_token_count=123, + response_token_count=1234, + ), + LLMResponse( + output=string.LLM_OUTPUT_REASK, + prompt_token_count=123, + response_token_count=1234, + ), + ] validators = [TwoWords(on_fail=OnFailAction.REASK)] description = "Name for the pizza" instructions = """ @@ -221,14 +235,14 @@ def test_python_string(mocker): assert call.iterations.length == 2 # For orginal prompt and output - assert call.compiled_instructions == string.COMPILED_INSTRUCTIONS - assert call.compiled_prompt == string.COMPILED_PROMPT + assert call.compiled_messages[0]["content"]._source == string.COMPILED_INSTRUCTIONS + assert call.compiled_messages[1]["content"]._source == string.COMPILED_PROMPT assert call.iterations.first.raw_output == string.LLM_OUTPUT assert call.iterations.first.validation_response == string.VALIDATED_OUTPUT_REASK # For re-asked prompt and output - assert call.iterations.last.inputs.prompt == gd.Prompt(string.COMPILED_PROMPT_REASK) + assert call.iterations.last.inputs.messages[1]["content"] == string.COMPILED_PROMPT_REASK # Same as above - assert call.reask_prompts.last == string.COMPILED_PROMPT_REASK + assert call.reask_messages.last[-1]["content"] == string.COMPILED_PROMPT_REASK assert call.raw_outputs.last == string.LLM_OUTPUT_REASK assert call.guarded_output == string.LLM_OUTPUT_REASK diff --git a/tests/integration_tests/test_streaming.py b/tests/integration_tests/test_streaming.py index c6eac4363..412c88ae4 100644 --- a/tests/integration_tests/test_streaming.py +++ b/tests/integration_tests/test_streaming.py @@ -125,7 +125,7 @@ def gen(): choices=[ Choice( text=chunk, - delta=Delta(content=""), + delta=None, finish_reason=None, ) ], @@ -142,7 +142,7 @@ def gen(): yield MockOpenAIV1ChunkResponse( choices=[ Choice( - text="", + text=None, delta=Delta(content=chunk), finish_reason=None, ) diff --git a/tests/integration_tests/test_validator_base.py b/tests/integration_tests/test_validator_base.py index 3a8f5bda5..928658410 100644 --- a/tests/integration_tests/test_validator_base.py +++ b/tests/integration_tests/test_validator_base.py @@ -96,7 +96,6 @@ def test_validator_instance_attr_equality(mocker, instance_attr): guard = Guard.from_string( validators=[validator], - prompt="", ) assert guard._validators[0].an_instance_attr == instance_attr diff --git a/tests/unit_tests/classes/history/test_call.py b/tests/unit_tests/classes/history/test_call.py index a5719f0dc..854884868 100644 --- a/tests/unit_tests/classes/history/test_call.py +++ b/tests/unit_tests/classes/history/test_call.py @@ -42,7 +42,7 @@ def test_empty_initialization(): def test_non_empty_initialization(): # Call input - def custom_llm(*args, messages=None, **kwargs): + def custom_llm(messages, *args, **kwargs): return "Hello there!" llm_api = custom_llm diff --git a/tests/unit_tests/mocks/mock_custom_llm.py b/tests/unit_tests/mocks/mock_custom_llm.py index fce6ddac5..628d56618 100644 --- a/tests/unit_tests/mocks/mock_custom_llm.py +++ b/tests/unit_tests/mocks/mock_custom_llm.py @@ -6,16 +6,16 @@ def __init__(self, times_called=0, response="Hello world!"): self.times_called = times_called self.response = response - def fail_retryable(self, *args, messages=None, **kwargs) -> str: + def fail_retryable(self, messages, *args, **kwargs) -> str: if self.times_called == 0: self.times_called = self.times_called + 1 raise OpenAIServiceUnavailableError("ServiceUnavailableError") return self.response - def fail_non_retryable(self, *args, messages=None, **kwargs) -> str: + def fail_non_retryable(self, messages, *args, **kwargs) -> str: raise Exception("Non-Retryable Error!") - def succeed(self, *args, messages=None, **kwargs) -> str: + def succeed(self, messages, *args, **kwargs) -> str: return self.response @@ -24,14 +24,14 @@ def __init__(self, times_called=0, response="Hello world!"): self.times_called = times_called self.response = response - async def fail_retryable(self, *args, messages=None, **kwargs) -> str: + async def fail_retryable(self, messages, *args, **kwargs) -> str: if self.times_called == 0: self.times_called = self.times_called + 1 raise OpenAIServiceUnavailableError("ServiceUnavailableError") return self.response - async def fail_non_retryable(self, *args, messages=None, **kwargs) -> str: + async def fail_non_retryable(self, messages, *args, **kwargs) -> str: raise Exception("Non-Retryable Error!") - async def succeed(self, *args, messages=None, **kwargs) -> str: + async def succeed(self, messages, *args, **kwargs) -> str: return self.response diff --git a/tests/unit_tests/test_llm_providers.py b/tests/unit_tests/test_llm_providers.py index 30e1c7702..372833f58 100644 --- a/tests/unit_tests/test_llm_providers.py +++ b/tests/unit_tests/test_llm_providers.py @@ -24,7 +24,7 @@ def test_openai_callable_does_not_retry_on_success(mocker): llm = MockOpenAILlm() succeed_spy = mocker.spy(llm, "succeed") - arbitrary_callable = ArbitraryCallable(llm.succeed, prompt="Hello") + arbitrary_callable = ArbitraryCallable(llm.succeed, messages=[{"role":"user", "content":"Hello"}]) response = arbitrary_callable() assert succeed_spy.call_count == 1 @@ -39,7 +39,7 @@ async def test_async_openai_callable_does_not_retry_on_success(mocker): llm = MockAsyncOpenAILlm() succeed_spy = mocker.spy(llm, "succeed") - arbitrary_callable = AsyncArbitraryCallable(llm.succeed, prompt="Hello") + arbitrary_callable = AsyncArbitraryCallable(llm.succeed, messages=[{"role":"user", "content":"Hello"}]) response = await arbitrary_callable() assert succeed_spy.call_count == 1 @@ -460,8 +460,8 @@ def my_llm() -> str: def test_get_llm_ask_custom_llm_must_accept_kwargs(): - def my_llm(prompt: str) -> str: - return f"Hello {prompt}!" + def my_llm(messages: str) -> str: + return f"Hello {messages}!" with pytest.raises( ValueError, match="Custom LLM callables must accept \\*\\*kwargs!" @@ -472,8 +472,8 @@ def my_llm(prompt: str) -> str: def test_get_async_llm_ask_custom_llm(): from guardrails.llm_providers import AsyncArbitraryCallable - async def my_llm(prompt: str, *, messages=None, **kwargs) -> str: - return f"Hello {prompt}!" + async def my_llm(messages: str, **kwargs) -> str: + return f"Hello {messages}!" prompt_callable = get_async_llm_ask(my_llm) diff --git a/tests/unit_tests/test_validator_base.py b/tests/unit_tests/test_validator_base.py index b3c5dcaa7..6479f6f17 100644 --- a/tests/unit_tests/test_validator_base.py +++ b/tests/unit_tests/test_validator_base.py @@ -450,7 +450,7 @@ class Pet(BaseModel): def test_input_validation_fix(mocker): - def mock_llm_api(*args, messages=None, **kwargs): + def mock_llm_api(messages, *args, **kwargs): return json.dumps({"name": "Fluffy"}) # fix returns an amended value for prompt/instructions validation, @@ -515,7 +515,7 @@ def mock_llm_api(*args, messages=None, **kwargs): @pytest.mark.asyncio async def test_async_messages_validation_fix(mocker): - async def mock_llm_api(*args, messages=None, **kwargs) -> str: + async def mock_llm_api(messages, *args, **kwargs) -> str: return json.dumps({"name": "Fluffy"}) # fix returns an amended value for messages validation, @@ -623,7 +623,7 @@ def test_input_validation_fail( guard = Guard.from_pydantic(output_class=Pet) guard.use(TwoWords(on_fail=on_fail), on="messages") - def custom_llm(*args, messages=None, **kwargs): + def custom_llm(messages, *args, **kwargs): raise Exception( "LLM was called when it should not have been!" "Input Validation did not raise as expected!" @@ -703,7 +703,7 @@ async def test_input_validation_fail_async( structured_messages_error, unstructured_messages_error, ): - async def custom_llm(*args, messages=None, **kwargs) -> str: + async def custom_llm(messages, *args, **kwargs) -> str: raise Exception( "LLM was called when it should not have been!" "Input Validation did not raise as expected!" From da2dc636d43a37dfc119a8fd3147660940a5cd10 Mon Sep 17 00:00:00 2001 From: David Tam Date: Thu, 26 Sep 2024 10:17:41 -0700 Subject: [PATCH 09/71] more tests --- guardrails/classes/history/inputs.py | 1 + guardrails/llm_providers.py | 28 ++++++++++++------- .../test_assets/string/string.rail | 2 +- tests/integration_tests/test_guard.py | 7 ----- tests/integration_tests/test_multi_reask.py | 3 +- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/guardrails/classes/history/inputs.py b/guardrails/classes/history/inputs.py index 7dcf68cd8..e8d686f16 100644 --- a/guardrails/classes/history/inputs.py +++ b/guardrails/classes/history/inputs.py @@ -95,6 +95,7 @@ def to_dict(self) -> Dict[str, Any]: @classmethod def from_interface(cls, i_inputs: IInputs) -> "Inputs": deserialized_messages = None + print("====== inputs.py: Inputs.from_interface() ======", i_inputs) if i_inputs.messages: deserialized_messages = [] for msg in i_inputs.messages: diff --git a/guardrails/llm_providers.py b/guardrails/llm_providers.py index 73ba3f4b6..00c56ef17 100644 --- a/guardrails/llm_providers.py +++ b/guardrails/llm_providers.py @@ -13,8 +13,7 @@ cast, ) -import warnings - +from guardrails.prompt import Prompt from guardrails_api_client.models import LLMResource from guardrails.errors import UserFacingException @@ -24,6 +23,20 @@ PromptCallableException, ) +from guardrails.types.inputs import MessageHistory + +# todo fix circular import +def messages_string(messages: MessageHistory) -> str: + messages_copy = "" + for msg in messages: + content = ( + msg["content"].source + if isinstance(msg["content"], Prompt) + else msg["content"] + ) + messages_copy += content + return messages_copy + from guardrails.utils.safe_get import safe_get from guardrails.telemetry import trace_llm_call, trace_operation @@ -252,7 +265,7 @@ def _invoke_llm( class HuggingFaceModelCallable(PromptCallableBase): def _invoke_llm( - self, prompt: str, model_generate: Any, *args, **kwargs + self, model_generate: Any, *args, messages: list[dict[str, str]], **kwargs ) -> LLMResponse: try: import transformers # noqa: F401 # type: ignore @@ -268,7 +281,7 @@ def _invoke_llm( "The `torch` package is not installed. " "Install with `pip install torch`" ) - + prompt = messages_string(messages) tokenizer = kwargs.pop("tokenizer") if not tokenizer: raise UserFacingException( @@ -320,7 +333,7 @@ def _invoke_llm( ) trace_llm_call( - input_messages=chat_prompt(prompt, kwargs.get("instructions")), + input_messages=messages, invocation_parameters={ **model_inputs, **kwargs, @@ -416,11 +429,6 @@ def _invoke_llm(self, prompt: str, pipeline: Any, *args, **kwargs) -> LLMRespons class ArbitraryCallable(PromptCallableBase): def __init__(self, llm_api: Optional[Callable] = None, *args, **kwargs): llm_api_args = inspect.getfullargspec(llm_api) - if not llm_api_args.args: - raise ValueError( - "Custom LLM callables must accept" - " at least one positional argument for messages!" - ) if not llm_api_args.varkw: raise ValueError("Custom LLM callables must accept **kwargs!") self.llm_api = llm_api diff --git a/tests/integration_tests/test_assets/string/string.rail b/tests/integration_tests/test_assets/string/string.rail index da29cafae..040d58990 100644 --- a/tests/integration_tests/test_assets/string/string.rail +++ b/tests/integration_tests/test_assets/string/string.rail @@ -14,7 +14,7 @@ Given the following ingredients, what would you call this pizza? ${ingredients} - \ No newline at end of file diff --git a/tests/integration_tests/test_guard.py b/tests/integration_tests/test_guard.py index 077aad236..a1c4d571b 100644 --- a/tests/integration_tests/test_guard.py +++ b/tests/integration_tests/test_guard.py @@ -770,7 +770,6 @@ def test_pydantic_with_message_history_reask(mocker): guard = gd.Guard.from_pydantic(output_class=pydantic.WITH_MSG_HISTORY) final_output = guard( - llm_api=openai.chat.completions.create, messages=string.MOVIE_MSG_HISTORY, temperature=0.0, model="gpt-3.5-turbo", @@ -1467,16 +1466,12 @@ def test_WITH_MSG_HISTORY(self, mocker): mock_llm = mocker.Mock() def custom_llm( - prompt: Optional[str] = None, *args, - instructions: Optional[str] = None, messages: Optional[List[Dict[str, str]]] = None, **kwargs, ) -> str: mock_llm( - prompt, *args, - instructions=instructions, messages=messages, **kwargs, ) @@ -1502,8 +1497,6 @@ def custom_llm( assert output.validation_passed is True assert output.validated_output == "Not really, no. I'm just a static function." mock_llm.assert_called_once_with( - None, - instructions=None, messages=[ { "role": "system", diff --git a/tests/integration_tests/test_multi_reask.py b/tests/integration_tests/test_multi_reask.py index b59a3e362..33be08dbd 100644 --- a/tests/integration_tests/test_multi_reask.py +++ b/tests/integration_tests/test_multi_reask.py @@ -33,8 +33,7 @@ def test_multi_reask(mocker): guard = gd.Guard.from_rail_string(python_rail.RAIL_SPEC_WITH_VALIDATOR_PARALLELISM) guard( - llm_api=openai.completions.create, - engine="text-davinci-003", + model="text-davinci-003", num_reasks=5, ) From 66a568baa1c4385366fb3f98fe4b4a78e9524427 Mon Sep 17 00:00:00 2001 From: David Tam Date: Thu, 26 Sep 2024 16:58:38 -0700 Subject: [PATCH 10/71] more tests --- tests/integration_tests/mock_llm_outputs.py | 15 ++++--- .../test_assets/lists_object.py | 10 ++--- .../python_rail/validator_parallelism.rail | 6 ++- .../validator_parallelism_prompt_1.txt | 4 -- .../validator_parallelism_prompt_2.txt | 4 -- .../validator_parallelism_prompt_3.txt | 4 -- tests/integration_tests/test_guard.py | 43 +++++++++++-------- tests/integration_tests/test_multi_reask.py | 16 +++++-- tests/integration_tests/test_pydantic.py | 33 ++++++++------ 9 files changed, 75 insertions(+), 60 deletions(-) diff --git a/tests/integration_tests/mock_llm_outputs.py b/tests/integration_tests/mock_llm_outputs.py index b2d755dfc..98497639f 100644 --- a/tests/integration_tests/mock_llm_outputs.py +++ b/tests/integration_tests/mock_llm_outputs.py @@ -13,7 +13,7 @@ class MockLiteLLMCallableOther(LiteLLMCallable): # NOTE: this class normally overrides `llm_providers.LiteLLMCallable`, # which compiles instructions and prompt into a single prompt; # here the instructions are passed into kwargs and ignored - def _invoke_llm(self, prompt, *args, **kwargs): + def _invoke_llm(self, messages, *args, **kwargs): """Mock the OpenAI API call to Completion.create.""" _rail_to_compiled_prompt = { # noqa @@ -43,16 +43,16 @@ def _invoke_llm(self, prompt, *args, **kwargs): } try: - output = mock_llm_responses[prompt] + output = mock_llm_responses[messages[0]["content"]] return LLMResponse( output=output, prompt_token_count=123, response_token_count=1234, ) except KeyError: - print("Unrecognized prompt!") - print(prompt) - raise ValueError("Compiled prompt not found") + print("Unrecognized messages!") + print(messages) + raise ValueError("Compiled messages not found") class MockAsyncLiteLLMCallable(AsyncLiteLLMCallable): @@ -129,7 +129,10 @@ def _invoke_llm( try: if messages: - key = (messages[0]["content"], messages[1]["content"]) + if len(messages) == 2: + key = (messages[0]["content"], messages[1]["content"]) + elif len(messages) == 1: + key = (messages[0]["content"], None) out_text = mock_llm_responses[key] if prompt and instructions and not messages: out_text = mock_llm_responses[(prompt, instructions)] diff --git a/tests/integration_tests/test_assets/lists_object.py b/tests/integration_tests/test_assets/lists_object.py index 4310700cc..42b23cd84 100644 --- a/tests/integration_tests/test_assets/lists_object.py +++ b/tests/integration_tests/test_assets/lists_object.py @@ -2,11 +2,7 @@ from pydantic import BaseModel -LIST_PROMPT = """Create a list of items that may be found in a grocery store. - -Json Output: - -""" +LIST_PROMPT = """Create a list of items that may be found in a grocery store.""" LIST_OUTPUT = """[{"name": "apple", "price": 1.0}, {"name": "banana", "price": 0.5}, {"name": "orange", "price": 1.5}]""" # noqa: E501 @@ -28,6 +24,8 @@ class Item(BaseModel): - Create a list of items that may be found in a grocery store. + + Create a list of items that may be found in a grocery store. + """ diff --git a/tests/integration_tests/test_assets/python_rail/validator_parallelism.rail b/tests/integration_tests/test_assets/python_rail/validator_parallelism.rail index d86d278d2..0e5df4456 100644 --- a/tests/integration_tests/test_assets/python_rail/validator_parallelism.rail +++ b/tests/integration_tests/test_assets/python_rail/validator_parallelism.rail @@ -11,10 +11,12 @@ on-fail-length="reask" /> - + + Say hullo to my little friend ${gr.complete_string_suffix} - + + \ No newline at end of file diff --git a/tests/integration_tests/test_assets/python_rail/validator_parallelism_prompt_1.txt b/tests/integration_tests/test_assets/python_rail/validator_parallelism_prompt_1.txt index ff6814b77..31d6dd8d8 100644 --- a/tests/integration_tests/test_assets/python_rail/validator_parallelism_prompt_1.txt +++ b/tests/integration_tests/test_assets/python_rail/validator_parallelism_prompt_1.txt @@ -14,7 +14,3 @@ Your generated response should satisfy the following properties: Don't talk; just go. - - -String Output: - diff --git a/tests/integration_tests/test_assets/python_rail/validator_parallelism_prompt_2.txt b/tests/integration_tests/test_assets/python_rail/validator_parallelism_prompt_2.txt index 63fb66348..d2ce09cae 100644 --- a/tests/integration_tests/test_assets/python_rail/validator_parallelism_prompt_2.txt +++ b/tests/integration_tests/test_assets/python_rail/validator_parallelism_prompt_2.txt @@ -22,7 +22,3 @@ Your generated response should satisfy the following properties: - length: min=1 max=10 Don't talk; just go. - - -String Output: - diff --git a/tests/integration_tests/test_assets/python_rail/validator_parallelism_prompt_3.txt b/tests/integration_tests/test_assets/python_rail/validator_parallelism_prompt_3.txt index 500b2b7d7..def59a94d 100644 --- a/tests/integration_tests/test_assets/python_rail/validator_parallelism_prompt_3.txt +++ b/tests/integration_tests/test_assets/python_rail/validator_parallelism_prompt_3.txt @@ -18,7 +18,3 @@ Your generated response should satisfy the following properties: - length: min=1 max=10 Don't talk; just go. - - -String Output: - diff --git a/tests/integration_tests/test_guard.py b/tests/integration_tests/test_guard.py index a1c4d571b..b1b5a027a 100644 --- a/tests/integration_tests/test_guard.py +++ b/tests/integration_tests/test_guard.py @@ -26,6 +26,7 @@ ) from .mock_llm_outputs import ( + MockLiteLLMCallableOther, MockLiteLLMCallable, entity_extraction, lists_object, @@ -173,10 +174,10 @@ def test_entity_extraction_with_reask( ) content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") - guard = guard_initializer(rail, prompt) + guard = guard_initializer(rail, messages=[{"role": "user", "content": prompt}]) final_output: ValidationOutcome = guard( - llm_api=openai.completions.create, + model="gpt-3.5-turbo", prompt_params={"document": content[:6000]}, num_reasks=1, max_tokens=2000, @@ -259,7 +260,7 @@ def test_entity_extraction_with_noop(mocker, rail, prompt): mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") - guard = guard_initializer(rail, prompt) + guard = guard_initializer(rail, messages=[{"role": "user", "content": prompt}]) final_output = guard( llm_api=openai.completions.create, prompt_params={"document": content[:6000]}, @@ -305,7 +306,7 @@ def test_entity_extraction_with_filter(mocker, rail, prompt): mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") - guard = guard_initializer(rail, prompt) + guard = guard_initializer(rail, messages=[{"role": "user", "content": prompt}]) final_output = guard( llm_api=openai.completions.create, prompt_params={"document": content[:6000]}, @@ -340,7 +341,7 @@ def test_entity_extraction_with_fix(mocker, rail, prompt): mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") - guard = guard_initializer(rail, prompt) + guard = guard_initializer(rail, messages=[{"role": "user", "content": prompt}]) final_output = guard( llm_api=openai.completions.create, prompt_params={"document": content[:6000]}, @@ -376,7 +377,7 @@ def test_entity_extraction_with_refrain(mocker, rail, prompt): mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") - guard = guard_initializer(rail, prompt) + guard = guard_initializer(rail, messages=[{"role": "user", "content": prompt}]) final_output = guard( llm_api=openai.completions.create, prompt_params={"document": content[:6000]}, @@ -857,11 +858,12 @@ def test_in_memory_validator_log_is_not_duplicated(mocker): try: content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = guard_initializer( - entity_extraction.PYDANTIC_RAIL_WITH_NOOP, entity_extraction.PYDANTIC_PROMPT + entity_extraction.PYDANTIC_RAIL_WITH_NOOP, + messages=[{"role": "user", "content": entity_extraction.PYDANTIC_PROMPT}], ) guard( - llm_api=openai.completions.create, + model="gpt-3.5-turbo", prompt_params={"document": content[:6000]}, num_reasks=1, ) @@ -942,11 +944,13 @@ def test_guard_with_top_level_list_return_type(mocker, rail, prompt): # Create a Guard with a top level list return type # Mock the LLM - mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) + mocker.patch( + "guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallableOther + ) - guard = guard_initializer(rail, prompt=prompt) + guard = guard_initializer(rail, messages=[{"role": "user", "content": prompt}]) - output = guard(llm_api=openai.completions.create) + output = guard(model="gpt-3.5-turbo") # Validate the output assert output.validated_output == [ @@ -1002,7 +1006,7 @@ def test_string_output(mocker): guard = gd.Guard.from_rail_string(string.RAIL_SPEC_FOR_STRING) final_output = guard( - llm_api=openai.completions.create, + model="gpt-3.5-turbo", prompt_params={"ingredients": "tomato, cheese, sour cream"}, num_reasks=1, ) @@ -1015,7 +1019,7 @@ def test_string_output(mocker): assert call.iterations.length == 1 # For original prompt and output - assert call.compiled_prompt == string.COMPILED_PROMPT + assert call.compiled_messages[1]["content"]._source == string.COMPILED_PROMPT assert call.raw_outputs.last == string.LLM_OUTPUT assert mock_invoke_llm.call_count == 1 mock_invoke_llm = None @@ -1138,7 +1142,7 @@ def test_string_reask(mocker): guard = gd.Guard.from_rail_string(string.RAIL_SPEC_FOR_STRING_REASK) final_output = guard( - llm_api=openai.completions.create, + model="gpt-3.5-turbo", prompt_params={"ingredients": "tomato, cheese, sour cream"}, num_reasks=1, max_tokens=100, @@ -1152,15 +1156,18 @@ def test_string_reask(mocker): assert call.iterations.length == 2 # For orginal prompt and output - assert call.compiled_instructions == string.COMPILED_INSTRUCTIONS - assert call.compiled_prompt == string.COMPILED_PROMPT + assert call.compiled_messages[0]["content"]._source == string.COMPILED_INSTRUCTIONS + assert call.compiled_messages[1]["content"]._source == string.COMPILED_PROMPT assert call.iterations.first.raw_output == string.LLM_OUTPUT assert call.iterations.first.validation_response == string.VALIDATED_OUTPUT_REASK # For re-asked prompt and output - assert call.iterations.last.inputs.prompt == gd.Prompt(string.COMPILED_PROMPT_REASK) + assert ( + call.iterations.last.inputs.messages[1]["content"] + == string.COMPILED_PROMPT_REASK + ) # Same thing as above - assert call.reask_prompts.last == string.COMPILED_PROMPT_REASK + assert call.reask_messages[0][1]["content"] == string.COMPILED_PROMPT_REASK assert call.raw_outputs.last == string.LLM_OUTPUT_REASK assert call.guarded_output == string.LLM_OUTPUT_REASK diff --git a/tests/integration_tests/test_multi_reask.py b/tests/integration_tests/test_multi_reask.py index 33be08dbd..3616572a3 100644 --- a/tests/integration_tests/test_multi_reask.py +++ b/tests/integration_tests/test_multi_reask.py @@ -1,4 +1,3 @@ -import openai import guardrails as gd from guardrails.classes.llm.llm_response import LLMResponse @@ -44,21 +43,30 @@ def test_multi_reask(mocker): assert len(call.iterations) == 3 - assert call.compiled_prompt == python_rail.VALIDATOR_PARALLELISM_PROMPT_1 + assert ( + call.compiled_messages[0]["content"]._source + == python_rail.VALIDATOR_PARALLELISM_PROMPT_1 + ) assert call.raw_outputs.first == python_rail.VALIDATOR_PARALLELISM_RESPONSE_1 assert ( call.iterations.first.validation_response == python_rail.VALIDATOR_PARALLELISM_REASK_1 ) - assert call.reask_prompts.first == python_rail.VALIDATOR_PARALLELISM_PROMPT_2 + assert ( + call.reask_messages[0][1]["content"] + == python_rail.VALIDATOR_PARALLELISM_PROMPT_2 + ) assert call.raw_outputs.at(1) == python_rail.VALIDATOR_PARALLELISM_RESPONSE_2 assert ( call.iterations.at(1).validation_response == python_rail.VALIDATOR_PARALLELISM_REASK_2 ) - assert call.reask_prompts.last == python_rail.VALIDATOR_PARALLELISM_PROMPT_3 + assert ( + call.reask_messages[1][1]["content"] + == python_rail.VALIDATOR_PARALLELISM_PROMPT_3 + ) assert call.raw_outputs.last == python_rail.VALIDATOR_PARALLELISM_RESPONSE_3 # The output here fails some validators but passes others. # Since those that it fails in the end are noop fixes, validation fails. diff --git a/tests/integration_tests/test_pydantic.py b/tests/integration_tests/test_pydantic.py index 5b909481e..a3867c694 100644 --- a/tests/integration_tests/test_pydantic.py +++ b/tests/integration_tests/test_pydantic.py @@ -1,6 +1,5 @@ import json from typing import Dict, List -import openai import pytest from pydantic import BaseModel @@ -36,10 +35,10 @@ def test_pydantic_with_reask(mocker): ), ] - guard = gd.Guard.from_pydantic(ListOfPeople, - messages=[{ - "role": "user", - "content": VALIDATED_RESPONSE_REASK_PROMPT}]) + guard = gd.Guard.from_pydantic( + ListOfPeople, + messages=[{"role": "user", "content": VALIDATED_RESPONSE_REASK_PROMPT}], + ) final_output = guard( model="text-davinci-003", max_tokens=512, @@ -124,10 +123,15 @@ def test_pydantic_with_full_schema_reask(mocker): ), ] - guard = gd.Guard.from_pydantic(ListOfPeople, messages=[{ - "content": VALIDATED_RESPONSE_REASK_PROMPT, - "role": "user", - }]) + guard = gd.Guard.from_pydantic( + ListOfPeople, + messages=[ + { + "content": VALIDATED_RESPONSE_REASK_PROMPT, + "role": "user", + } + ], + ) final_output = guard( model="gpt-3.5-turbo", max_tokens=512, @@ -153,9 +157,14 @@ def test_pydantic_with_full_schema_reask(mocker): ) # For re-asked prompt and output - assert call.iterations.at(1).inputs.messages[0]["content"]._source == pydantic.COMPILED_INSTRUCTIONS_CHAT - assert call.iterations.at(1).inputs.messages[1]["content"]._source == pydantic.COMPILED_PROMPT_FULL_REASK - + assert ( + call.iterations.at(1).inputs.messages[0]["content"]._source + == pydantic.COMPILED_PROMPT_FULL_REASK_1 + ) + assert ( + call.iterations.at(1).inputs.messages[1]["content"]._source + == pydantic.COMPILED_INSTRUCTIONS_CHAT + ) assert call.iterations.at(1).raw_output == pydantic.LLM_OUTPUT_FULL_REASK_1 assert ( call.iterations.at(1).validation_response == pydantic.VALIDATED_OUTPUT_REASK_2 From bbef78a968c9a5208392ef961fa9bd3de9a5e8af Mon Sep 17 00:00:00 2001 From: Alejandro Date: Fri, 27 Sep 2024 12:37:50 -0700 Subject: [PATCH 11/71] removed nltk dependency --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ab7870f2f..e05a445b3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,6 @@ rstr = "^3.2.2" typing-extensions = "^4.8.0" python-dateutil = "^2.8.2" tiktoken = ">=0.5.1" -nltk = ">3.0, <=3.8.1" litellm = "^1.37.14" sqlvalidator = {version = "^0.0.20", optional = true} sqlalchemy = {version = ">=2.0.9", optional = true} From 029873034040a6a8a6064de83e99168291a40fc2 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Fri, 27 Sep 2024 12:39:55 -0700 Subject: [PATCH 12/71] remove nltk import and download from validator base --- guardrails/validator_base.py | 44 ++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/guardrails/validator_base.py b/guardrails/validator_base.py index d2c8e53db..4ef785d2b 100644 --- a/guardrails/validator_base.py +++ b/guardrails/validator_base.py @@ -15,7 +15,6 @@ from warnings import warn import warnings -import nltk import requests from langchain_core.runnables import Runnable @@ -32,12 +31,6 @@ from guardrails.utils.safe_get import safe_get from guardrails.utils.hub_telemetry_utils import HubTelemetry -# See: https://github.com/guardrails-ai/guardrails/issues/829 -try: - nltk.data.find("tokenizers/punkt") -except LookupError: - nltk.download("punkt") - ### functions to get chunks ### def split_sentence_str(chunk: str): @@ -48,24 +41,25 @@ def split_sentence_str(chunk: str): return [fragments[0] + ".", ".".join(fragments[1:])] -def split_sentence_nltk(chunk: str): - """ - NOTE: this approach currently does not work - Use a sentence tokenizer to split the chunk into sentences. - - Because using the tokenizer is expensive, we only use it if there - is a period present in the chunk. - """ - # using the sentence tokenizer is expensive - # we check for a . to avoid wastefully calling the tokenizer - if "." not in chunk: - return [] - sentences = nltk.sent_tokenize(chunk) - if len(sentences) == 0: - return [] - # return the sentence - # then the remaining chunks that aren't finished accumulating - return [sentences[0], "".join(sentences[1:])] +# TODO ensure this is not indeed needed +# def split_sentence_nltk(chunk: str): +# """ +# NOTE: this approach currently does not work +# Use a sentence tokenizer to split the chunk into sentences. + +# Because using the tokenizer is expensive, we only use it if there +# is a period present in the chunk. +# """ +# # using the sentence tokenizer is expensive +# # we check for a . to avoid wastefully calling the tokenizer +# if "." not in chunk: +# return [] +# sentences = nltk.sent_tokenize(chunk) +# if len(sentences) == 0: +# return [] +# # return the sentence +# # then the remaining chunks that aren't finished accumulating +# return [sentences[0], "".join(sentences[1:])] # TODO: Can we remove dataclass? It was originally added to support pydantic 1.* From e69939723886727918350117da6f20c9c5628b12 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Fri, 27 Sep 2024 12:40:34 -0700 Subject: [PATCH 13/71] remove commented out test referencing nltk --- tests/unit_tests/utils/test_docs_utils.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/tests/unit_tests/utils/test_docs_utils.py b/tests/unit_tests/utils/test_docs_utils.py index 6f03857be..9cbf10e00 100644 --- a/tests/unit_tests/utils/test_docs_utils.py +++ b/tests/unit_tests/utils/test_docs_utils.py @@ -48,19 +48,6 @@ def test_text_splitter_split(mock_tokenizer): assert chunks[3] == "10 11 12 13 14 15 16 17" -# @patch('nltk.data.find', side_effect=LookupError) -# def test_sentence_split_nltk_download_error(mock_nltk_find): -# with pytest.raises(ImportError): -# sentence_split("This is a test sentence.") - -# @patch('nltk.data.find') -# def test_sentence_split(mock_nltk_find): -# mock_nltk_find.return_value = True -# result = sentence_split("This is a test sentence.") -# assert len(result) == 1 -# assert result[0] == "This is a test sentence." - - def test_prompt_template_token_length(mock_tokenizer, mock_prompt_template): text_splitter = TextSplitter() length = text_splitter.prompt_template_token_length(mock_prompt_template) From c1f735086bf9b7e805ea351757e9584924e65222 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Fri, 27 Sep 2024 12:41:02 -0700 Subject: [PATCH 14/71] throwing import error if nltk not available in detect_pii mock --- .../test_assets/validators/detect_pii.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/integration_tests/test_assets/validators/detect_pii.py b/tests/integration_tests/test_assets/validators/detect_pii.py index ddcfb87cd..2da94e7d6 100644 --- a/tests/integration_tests/test_assets/validators/detect_pii.py +++ b/tests/integration_tests/test_assets/validators/detect_pii.py @@ -1,6 +1,5 @@ from typing import Any, Callable, Dict, List, Union import difflib -import nltk from guardrails.validator_base import ( FailResult, @@ -65,6 +64,14 @@ def chunking_function(self, chunk: str): Because using the tokenizer is expensive, we only use it if there is a period present in the chunk. """ + try: + import nltk + except ImportError: + raise ImportError( + "nltk is required for sentence splitting. Please install it using " + "`poetry add nltk`" + ) + # using the sentence tokenizer is expensive # we check for a . to avoid wastefully calling the tokenizer if "." not in chunk: From bc7ff0746fccbfcf9f9feebf55008b62cdaea382 Mon Sep 17 00:00:00 2001 From: David Tam Date: Fri, 27 Sep 2024 13:10:15 -0700 Subject: [PATCH 15/71] tests passing --- guardrails/classes/history/call.py | 34 ++- guardrails/classes/history/inputs.py | 6 +- guardrails/guard.py | 2 +- guardrails/llm_providers.py | 42 +++- tests/integration_tests/mock_llm_outputs.py | 22 +- .../entity_extraction/compiled_prompt.txt | 4 - .../compiled_prompt_full_reask.txt | 4 - .../compiled_prompt_reask.txt | 4 - .../compiled_prompt_skeleton_reask_1.txt | 4 - .../compiled_prompt_skeleton_reask_2.txt | 4 - .../entity_extraction/fix_chat_model.rail | 4 +- .../entity_extraction/skeleton_reask.rail | 2 +- .../pydantic/compiled_instructions_chat.txt | 10 +- .../test_assets/pydantic/compiled_prompt.txt | 4 - .../pydantic/compiled_prompt_enum.txt | 3 - .../pydantic/compiled_prompt_enum_2.txt | 3 - .../pydantic/compiled_prompt_reask_1.txt | 4 - .../pydantic/compiled_prompt_reask_2.txt | 4 - tests/integration_tests/test_async.py | 57 +++-- tests/integration_tests/test_guard.py | 232 ++++++++++++------ tests/integration_tests/test_multi_reask.py | 2 +- tests/integration_tests/test_parsing.py | 9 +- tests/integration_tests/test_pydantic.py | 20 +- tests/integration_tests/test_python_rail.py | 31 ++- tests/unit_tests/test_llm_providers.py | 27 +- 25 files changed, 326 insertions(+), 212 deletions(-) diff --git a/guardrails/classes/history/call.py b/guardrails/classes/history/call.py index 2a8de4955..b580c8226 100644 --- a/guardrails/classes/history/call.py +++ b/guardrails/classes/history/call.py @@ -16,6 +16,7 @@ from guardrails.classes.validation.validation_result import ValidationResult from guardrails.constants import error_status, fail_status, not_run_status, pass_status from guardrails.prompt.messages import Messages +from guardrails.prompt import Prompt, Instructions from guardrails.classes.validation.validator_logs import ValidatorLogs from guardrails.actions.reask import ( ReAsk, @@ -93,10 +94,13 @@ def compiled_messages(self) -> Optional[str]: prompt_params = initial_inputs.prompt_params or {} compiled_messages = [] for message in messages: + content = message["content"].format(**prompt_params) + if isinstance(content, (Prompt, Instructions)): + content = content._source compiled_messages.append( { "role": message["role"], - "content": message["content"].format(**prompt_params), + "content": content, } ) @@ -112,12 +116,28 @@ def reask_messages(self) -> Stack[Messages]: reasks = self.iterations.copy() initial_messages = reasks.first reasks.remove(initial_messages) # type: ignore - return Stack( - *[ - r.inputs.messages if r.inputs.messages is not None else None - for r in reasks - ] - ) + initial_inputs = self.iterations.first.inputs + prompt_params = initial_inputs.prompt_params or {} + compiled_reasks = [] + for reask in reasks: + messages: Messages = reask.inputs.messages + + if messages is None: + compiled_reasks.append(None) + else: + compiled_messages = [] + for message in messages: + content = message["content"].format(**prompt_params) + if isinstance(content, (Prompt, Instructions)): + content = content._source + compiled_messages.append( + { + "role": message["role"], + "content": content, + } + ) + compiled_reasks.append(compiled_messages) + return Stack(*compiled_reasks) return Stack() diff --git a/guardrails/classes/history/inputs.py b/guardrails/classes/history/inputs.py index e8d686f16..ec0ccb971 100644 --- a/guardrails/classes/history/inputs.py +++ b/guardrails/classes/history/inputs.py @@ -9,6 +9,7 @@ from guardrails.prompt.messages import Messages from guardrails.prompt.instructions import Instructions + class Inputs(IInputs, ArbitraryModel): """Inputs represent the input data that is passed into the validation loop. @@ -38,7 +39,9 @@ class Inputs(IInputs, ArbitraryModel): "provided by the user via Guard.parse.", default=None, ) - messages: Optional[Union[List[Dict[str, Union[str, Prompt, Instructions]]], Messages]] = Field( + messages: Optional[ + Union[List[Dict[str, Union[str, Prompt, Instructions]]], Messages] + ] = Field( description="The message history provided by the user for chat model calls.", default=None, ) @@ -95,7 +98,6 @@ def to_dict(self) -> Dict[str, Any]: @classmethod def from_interface(cls, i_inputs: IInputs) -> "Inputs": deserialized_messages = None - print("====== inputs.py: Inputs.from_interface() ======", i_inputs) if i_inputs.messages: deserialized_messages = [] for msg in i_inputs.messages: diff --git a/guardrails/guard.py b/guardrails/guard.py index 52f9c3093..cc46a04ed 100644 --- a/guardrails/guard.py +++ b/guardrails/guard.py @@ -841,7 +841,7 @@ def __call__( """ messages = messages or self._exec_opts.messages or [] - print("==== messages is", messages) + # if messages is not None and not len(messages): # raise RuntimeError( # "You must provide messages. " diff --git a/guardrails/llm_providers.py b/guardrails/llm_providers.py index 00c56ef17..0253de0ab 100644 --- a/guardrails/llm_providers.py +++ b/guardrails/llm_providers.py @@ -13,7 +13,7 @@ cast, ) -from guardrails.prompt import Prompt +from guardrails.prompt import Prompt, Instructions from guardrails_api_client.models import LLMResource from guardrails.errors import UserFacingException @@ -25,6 +25,12 @@ from guardrails.types.inputs import MessageHistory +import warnings + +from guardrails.utils.safe_get import safe_get +from guardrails.telemetry import trace_llm_call, trace_operation + + # todo fix circular import def messages_string(messages: MessageHistory) -> str: messages_copy = "" @@ -37,9 +43,6 @@ def messages_string(messages: MessageHistory) -> str: messages_copy += content return messages_copy -from guardrails.utils.safe_get import safe_get -from guardrails.telemetry import trace_llm_call, trace_operation - ### # Synchronous wrappers @@ -183,9 +186,7 @@ def _invoke_llm( "Install with `pip install litellm`" ) from e if messages is not None: - messages = litellm_messages( - prompt=text, messages=messages - ) + messages = litellm_messages(prompt=text, messages=messages) kwargs["messages"] = messages trace_operation( @@ -265,7 +266,11 @@ def _invoke_llm( class HuggingFaceModelCallable(PromptCallableBase): def _invoke_llm( - self, model_generate: Any, *args, messages: list[dict[str, str]], **kwargs + self, + model_generate: Any, + *args, + messages: list[dict[str, Union[str, Prompt, Instructions]]], + **kwargs, ) -> LLMResponse: try: import transformers # noqa: F401 # type: ignore @@ -431,6 +436,14 @@ def __init__(self, llm_api: Optional[Callable] = None, *args, **kwargs): llm_api_args = inspect.getfullargspec(llm_api) if not llm_api_args.varkw: raise ValueError("Custom LLM callables must accept **kwargs!") + if not llm_api_args.kwonlyargs or "messages" not in llm_api_args.kwonlyargs: + warnings.warn( + "We recommend including 'messages'" + " as keyword-only arguments for custom LLM callables." + " Doing so ensures these arguments are not unintentionally" + " passed through to other calls via **kwargs.", + UserWarning, + ) self.llm_api = llm_api super().__init__(*args, **kwargs) @@ -771,13 +784,16 @@ async def invoke_llm( class AsyncArbitraryCallable(AsyncPromptCallableBase): def __init__(self, llm_api: Callable, *args, **kwargs): llm_api_args = inspect.getfullargspec(llm_api) - if not llm_api_args.args: - raise ValueError( - "Custom LLM callables must accept" - " at least one positional argument for messages!" - ) if not llm_api_args.varkw: raise ValueError("Custom LLM callables must accept **kwargs!") + if not llm_api_args.kwonlyargs or "messages" not in llm_api_args.kwonlyargs: + warnings.warn( + "We recommend including 'messages'" + " as keyword-only arguments for custom LLM callables." + " Doing so ensures these arguments are not unintentionally" + " passed through to other calls via **kwargs.", + UserWarning, + ) self.llm_api = llm_api super().__init__(*args, **kwargs) diff --git a/tests/integration_tests/mock_llm_outputs.py b/tests/integration_tests/mock_llm_outputs.py index 98497639f..5a2580bb4 100644 --- a/tests/integration_tests/mock_llm_outputs.py +++ b/tests/integration_tests/mock_llm_outputs.py @@ -128,26 +128,15 @@ def _invoke_llm( } try: + out_text = None if messages: if len(messages) == 2: key = (messages[0]["content"], messages[1]["content"]) elif len(messages) == 1: key = (messages[0]["content"], None) - out_text = mock_llm_responses[key] - if prompt and instructions and not messages: - out_text = mock_llm_responses[(prompt, instructions)] - elif messages and not prompt and not instructions: - if messages == entity_extraction.COMPILED_MSG_HISTORY: - out_text = entity_extraction.LLM_OUTPUT - elif ( - messages == string.MOVIE_MSG_HISTORY - and base_model == pydantic.WITH_MSG_HISTORY - ): - out_text = pydantic.MSG_HISTORY_LLM_OUTPUT_INCORRECT - elif messages == string.MOVIE_MSG_HISTORY: - out_text = string.MSG_LLM_OUTPUT_INCORRECT - else: - raise ValueError("messages not found") + + if hasattr(mock_llm_responses[key], "read"): + out_text = mock_llm_responses[key] else: raise ValueError( "specify either prompt and instructions " "or messages" @@ -162,7 +151,8 @@ def _invoke_llm( print("\n prompt: \n", prompt) print("\n instructions: \n", instructions) print("\n messages: \n", messages) - raise ValueError("Compiled prompt not found") + print("\n base_model: \n", base_model) + raise ValueError("Compiled prompt not found in mock llm response") class MockArbitraryCallable(ArbitraryCallable): diff --git a/tests/integration_tests/test_assets/entity_extraction/compiled_prompt.txt b/tests/integration_tests/test_assets/entity_extraction/compiled_prompt.txt index 5fb172fba..1ee8e898d 100644 --- a/tests/integration_tests/test_assets/entity_extraction/compiled_prompt.txt +++ b/tests/integration_tests/test_assets/entity_extraction/compiled_prompt.txt @@ -129,7 +129,3 @@ Given below is XML that describes the information to extract from this document ONLY return a valid JSON object (no other text is necessary). The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. - - -Json Output: - diff --git a/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_full_reask.txt b/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_full_reask.txt index 8f6a89af4..145e7aaba 100644 --- a/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_full_reask.txt +++ b/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_full_reask.txt @@ -110,7 +110,3 @@ Given below is XML that describes the information to extract from this document ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, enter `null`. - - -Json Output: - diff --git a/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_reask.txt b/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_reask.txt index ea28aac0c..7398047fb 100644 --- a/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_reask.txt +++ b/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_reask.txt @@ -39,7 +39,3 @@ Given below is XML that describes the information to extract from this document ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, enter `null`. - - -Json Output: - diff --git a/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_skeleton_reask_1.txt b/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_skeleton_reask_1.txt index 869e76330..2c1d056c4 100644 --- a/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_skeleton_reask_1.txt +++ b/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_skeleton_reask_1.txt @@ -129,7 +129,3 @@ Given below is XML that describes the information to extract from this document ONLY return a valid JSON object (no other text is necessary). The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. - - -Json Output: - diff --git a/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_skeleton_reask_2.txt b/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_skeleton_reask_2.txt index 89e2896c3..45aaf0862 100644 --- a/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_skeleton_reask_2.txt +++ b/tests/integration_tests/test_assets/entity_extraction/compiled_prompt_skeleton_reask_2.txt @@ -97,7 +97,3 @@ Here's an example of the structure: ], "interest_rates": {} } - - -Json Output: - diff --git a/tests/integration_tests/test_assets/entity_extraction/fix_chat_model.rail b/tests/integration_tests/test_assets/entity_extraction/fix_chat_model.rail index 4afca6c42..4607be8f1 100644 --- a/tests/integration_tests/test_assets/entity_extraction/fix_chat_model.rail +++ b/tests/integration_tests/test_assets/entity_extraction/fix_chat_model.rail @@ -18,7 +18,7 @@ You are a helpful assistant only capable of communicating with valid JSON, and no other text. ${gr.xml_suffix_prompt_examples} - + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter `null`. @@ -29,7 +29,7 @@ Extract information from this document and return a JSON that follows the correc ${gr.xml_prefix_prompt} ${xml_output_schema} - + \ No newline at end of file diff --git a/tests/integration_tests/test_assets/entity_extraction/skeleton_reask.rail b/tests/integration_tests/test_assets/entity_extraction/skeleton_reask.rail index e9ca3540e..43f1eaac4 100644 --- a/tests/integration_tests/test_assets/entity_extraction/skeleton_reask.rail +++ b/tests/integration_tests/test_assets/entity_extraction/skeleton_reask.rail @@ -12,7 +12,7 @@ - + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. diff --git a/tests/integration_tests/test_assets/pydantic/compiled_instructions_chat.txt b/tests/integration_tests/test_assets/pydantic/compiled_instructions_chat.txt index 04f827a07..56005c1d9 100644 --- a/tests/integration_tests/test_assets/pydantic/compiled_instructions_chat.txt +++ b/tests/integration_tests/test_assets/pydantic/compiled_instructions_chat.txt @@ -1 +1,9 @@ -You are a helpful assistant, able to express yourself purely through JSON, strictly and precisely adhering to the provided XML schemas. \ No newline at end of file + +You are a helpful assistant only capable of communicating with valid JSON, and no other text. + +ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, enter `null`. + +Here are examples of simple (XML, JSON) pairs that show the expected behavior: +- `` => `{'foo': 'example one'}` +- `` => `{"bar": ['STRING ONE', 'STRING TWO', etc.]}` +- `` => `{'baz': {'foo': 'Some String', 'index': 1}}` diff --git a/tests/integration_tests/test_assets/pydantic/compiled_prompt.txt b/tests/integration_tests/test_assets/pydantic/compiled_prompt.txt index ed53b51ea..9ff8383fc 100644 --- a/tests/integration_tests/test_assets/pydantic/compiled_prompt.txt +++ b/tests/integration_tests/test_assets/pydantic/compiled_prompt.txt @@ -33,7 +33,3 @@ Here are examples of simple (XML, JSON) pairs that show the expected behavior: - `` => `{'foo': 'example one'}` - `` => `{"bar": ['STRING ONE', 'STRING TWO', etc.]}` - `` => `{'baz': {'foo': 'Some String', 'index': 1}}` - - -Json Output: - diff --git a/tests/integration_tests/test_assets/pydantic/compiled_prompt_enum.txt b/tests/integration_tests/test_assets/pydantic/compiled_prompt_enum.txt index 188240904..fb6102f4a 100644 --- a/tests/integration_tests/test_assets/pydantic/compiled_prompt_enum.txt +++ b/tests/integration_tests/test_assets/pydantic/compiled_prompt_enum.txt @@ -1,4 +1 @@ What is the status of this task? - -Json Output: - diff --git a/tests/integration_tests/test_assets/pydantic/compiled_prompt_enum_2.txt b/tests/integration_tests/test_assets/pydantic/compiled_prompt_enum_2.txt index 229d91191..f9c21f774 100644 --- a/tests/integration_tests/test_assets/pydantic/compiled_prompt_enum_2.txt +++ b/tests/integration_tests/test_assets/pydantic/compiled_prompt_enum_2.txt @@ -1,4 +1 @@ What is the status of this task REALLY? - -Json Output: - diff --git a/tests/integration_tests/test_assets/pydantic/compiled_prompt_reask_1.txt b/tests/integration_tests/test_assets/pydantic/compiled_prompt_reask_1.txt index db9d71862..8bcdbcacc 100644 --- a/tests/integration_tests/test_assets/pydantic/compiled_prompt_reask_1.txt +++ b/tests/integration_tests/test_assets/pydantic/compiled_prompt_reask_1.txt @@ -29,7 +29,3 @@ Given below is XML that describes the information to extract from this document ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, enter `null`. - - -Json Output: - diff --git a/tests/integration_tests/test_assets/pydantic/compiled_prompt_reask_2.txt b/tests/integration_tests/test_assets/pydantic/compiled_prompt_reask_2.txt index 11f03cdf3..6bb0d743e 100644 --- a/tests/integration_tests/test_assets/pydantic/compiled_prompt_reask_2.txt +++ b/tests/integration_tests/test_assets/pydantic/compiled_prompt_reask_2.txt @@ -30,7 +30,3 @@ Given below is XML that describes the information to extract from this document ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, enter `null`. - - -Json Output: - diff --git a/tests/integration_tests/test_async.py b/tests/integration_tests/test_async.py index 41981ac0c..61652cb4c 100644 --- a/tests/integration_tests/test_async.py +++ b/tests/integration_tests/test_async.py @@ -1,6 +1,6 @@ import pytest -from guardrails import AsyncGuard, Prompt +from guardrails import AsyncGuard from guardrails.utils import docs_utils from guardrails.classes.llm.llm_response import LLMResponse from tests.integration_tests.test_assets.custom_llm import mock_async_llm @@ -57,9 +57,15 @@ async def test_entity_extraction_with_reask(mocker): # For orginal prompt and output first = call.iterations.first - assert first.inputs.messages[0]["content"] == Prompt(entity_extraction.NON_OPENAI_COMPILED_PROMPT) + assert ( + first.inputs.messages[0]["content"]._source + == entity_extraction.NON_OPENAI_COMPILED_PROMPT + ) # Same as above - assert call.compiled_messages[0]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT + assert ( + call.compiled_messages[0]["content"] + == entity_extraction.NON_OPENAI_COMPILED_PROMPT + ) assert first.prompt_tokens_consumed == 123 assert first.completion_tokens_consumed == 1234 assert first.raw_output == entity_extraction.LLM_OUTPUT @@ -67,11 +73,15 @@ async def test_entity_extraction_with_reask(mocker): # For re-asked prompt and output final = call.iterations.last - assert final.inputs.messages[1]["content"] == Prompt( - entity_extraction.NON_OPENAI_COMPILED_PROMPT_REASK + assert ( + final.inputs.messages[1]["content"]._source + == entity_extraction.NON_OPENAI_COMPILED_PROMPT_REASK ) # Same as above - assert call.reask_messages[0][1]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT_REASK + assert ( + call.reask_messages[0][1]["content"] + == entity_extraction.NON_OPENAI_COMPILED_PROMPT_REASK + ) # TODO: Re-enable once field level reasking is supported # assert final.raw_output == entity_extraction.LLM_OUTPUT_REASK @@ -118,7 +128,10 @@ async def test_entity_extraction_with_noop(mocker): assert call.iterations.length == 1 # For orginal prompt and output - assert call.compiled_messages[0]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT + assert ( + call.compiled_messages[0]["content"] + == entity_extraction.NON_OPENAI_COMPILED_PROMPT + ) assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.validation_response == entity_extraction.VALIDATED_OUTPUT_NOOP @@ -138,10 +151,12 @@ async def test_entity_extraction_with_noop_pydantic(mocker): content = docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = AsyncGuard.from_pydantic( entity_extraction.PYDANTIC_RAIL_WITH_NOOP, - messages=[{ - "role":"user", - "content": entity_extraction.PYDANTIC_PROMPT, - }], + messages=[ + { + "role": "user", + "content": entity_extraction.PYDANTIC_PROMPT, + } + ], ) final_output = await guard( llm_api=mock_async_llm, @@ -163,7 +178,10 @@ async def test_entity_extraction_with_noop_pydantic(mocker): assert call.iterations.length == 1 # For orginal prompt and output - assert call.compiled_messages[0]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT + assert ( + call.compiled_messages[0]["content"] + == entity_extraction.NON_OPENAI_COMPILED_PROMPT + ) assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.validation_response == entity_extraction.VALIDATED_OUTPUT_NOOP @@ -201,7 +219,10 @@ async def test_entity_extraction_with_filter(mocker): assert call.iterations.length == 1 # For orginal prompt and output - assert call.compiled_messages[0]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT + assert ( + call.compiled_messages[0]["content"] + == entity_extraction.NON_OPENAI_COMPILED_PROMPT + ) assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.validation_response == entity_extraction.VALIDATED_OUTPUT_FILTER assert call.guarded_output is None @@ -240,7 +261,10 @@ async def test_entity_extraction_with_fix(mocker): assert guard.history.length == 1 # For orginal prompt and output - assert call.compiled_messages[0]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT + assert ( + call.compiled_messages[0]["content"] + == entity_extraction.NON_OPENAI_COMPILED_PROMPT + ) assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.guarded_output == entity_extraction.VALIDATED_OUTPUT_FIX @@ -277,7 +301,10 @@ async def test_entity_extraction_with_refrain(mocker): assert guard.history.length == 1 # For orginal prompt and output - assert call.compiled_messages[0]["content"]._source == entity_extraction.NON_OPENAI_COMPILED_PROMPT + assert ( + call.compiled_messages[0]["content"] + == entity_extraction.NON_OPENAI_COMPILED_PROMPT + ) assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.guarded_output == entity_extraction.VALIDATED_OUTPUT_REFRAIN diff --git a/tests/integration_tests/test_guard.py b/tests/integration_tests/test_guard.py index b1b5a027a..09b94020b 100644 --- a/tests/integration_tests/test_guard.py +++ b/tests/integration_tests/test_guard.py @@ -2,7 +2,6 @@ import importlib import json import os -import openai from typing import Dict, List, Optional, Union import pytest @@ -27,7 +26,6 @@ from .mock_llm_outputs import ( MockLiteLLMCallableOther, - MockLiteLLMCallable, entity_extraction, lists_object, ) @@ -194,7 +192,7 @@ def test_entity_extraction_with_reask( # For orginal prompt and output first = call.iterations.first - assert call.compiled_prompt == entity_extraction.COMPILED_PROMPT + assert call.compiled_messages[0]["content"] == entity_extraction.COMPILED_PROMPT assert first.prompt_tokens_consumed == 123 assert first.completion_tokens_consumed == 1234 assert first.raw_output == entity_extraction.LLM_OUTPUT @@ -231,7 +229,8 @@ def test_entity_extraction_with_reask( if test_full_schema_reask: assert ( # second.inputs.prompt.source # Also valid - call.reask_prompts.first == entity_extraction.COMPILED_PROMPT_FULL_REASK + call.reask_messages.first[1]["content"] + == entity_extraction.COMPILED_PROMPT_FULL_REASK ) assert ( # second.raw_output # Also valid @@ -239,7 +238,10 @@ def test_entity_extraction_with_reask( ) else: # Second iteration is the first reask - assert call.reask_prompts.first == entity_extraction.COMPILED_PROMPT_REASK + assert ( + call.reask_messages.first[1]["content"] + == entity_extraction.COMPILED_PROMPT_REASK + ) # FIXME: Switch back to this once field level reask schema pruning is implemented # noqa # assert call.raw_outputs.at(1) == entity_extraction.LLM_OUTPUT_REASK assert call.raw_outputs.at(1) == json.dumps( @@ -257,12 +259,27 @@ def test_entity_extraction_with_reask( ) def test_entity_extraction_with_noop(mocker, rail, prompt): """Test that the entity extraction works with re-asking.""" - mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) + mock_invoke_llm = mocker.patch( + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" + ) + + mock_invoke_llm.side_effect = [ + LLMResponse( + output=entity_extraction.LLM_OUTPUT, + prompt_token_count=123, + response_token_count=1234, + ), + LLMResponse( + output=entity_extraction.LLM_OUTPUT_FULL_REASK, + prompt_token_count=123, + response_token_count=1234, + ), + ] content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = guard_initializer(rail, messages=[{"role": "user", "content": prompt}]) final_output = guard( - llm_api=openai.completions.create, + model="gpt-3.5-turbo", prompt_params={"document": content[:6000]}, num_reasks=1, ) @@ -281,7 +298,7 @@ def test_entity_extraction_with_noop(mocker, rail, prompt): assert call.iterations.length == 1 # For orginal prompt and output - assert call.compiled_prompt == entity_extraction.COMPILED_PROMPT + assert call.compiled_messages[0]["content"] == entity_extraction.COMPILED_PROMPT assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert ( call.guarded_output is not None @@ -303,12 +320,27 @@ def test_entity_extraction_with_noop(mocker, rail, prompt): ) def test_entity_extraction_with_filter(mocker, rail, prompt): """Test that the entity extraction works with re-asking.""" - mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) + mock_invoke_llm = mocker.patch( + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" + ) + + mock_invoke_llm.side_effect = [ + LLMResponse( + output=entity_extraction.LLM_OUTPUT, + prompt_token_count=123, + response_token_count=1234, + ), + LLMResponse( + output=entity_extraction.LLM_OUTPUT_FULL_REASK, + prompt_token_count=123, + response_token_count=1234, + ), + ] content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = guard_initializer(rail, messages=[{"role": "user", "content": prompt}]) final_output = guard( - llm_api=openai.completions.create, + model="gpt-3.5-turbo", prompt_params={"document": content[:6000]}, num_reasks=1, ) @@ -322,8 +354,8 @@ def test_entity_extraction_with_filter(mocker, rail, prompt): # Check that the guard state object has the correct number of re-asks. assert call.iterations.length == 1 - # For orginal prompt and output - assert call.compiled_prompt == entity_extraction.COMPILED_PROMPT + # For original prompt and output + assert call.compiled_messages[0]["content"] == entity_extraction.COMPILED_PROMPT assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.status == "fail" assert call.guarded_output is None @@ -338,12 +370,27 @@ def test_entity_extraction_with_filter(mocker, rail, prompt): ) def test_entity_extraction_with_fix(mocker, rail, prompt): """Test that the entity extraction works with re-asking.""" - mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) + mock_invoke_llm = mocker.patch( + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" + ) + + mock_invoke_llm.side_effect = [ + LLMResponse( + output=entity_extraction.LLM_OUTPUT, + prompt_token_count=123, + response_token_count=1234, + ), + LLMResponse( + output=entity_extraction.LLM_OUTPUT_FULL_REASK, + prompt_token_count=123, + response_token_count=1234, + ), + ] content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = guard_initializer(rail, messages=[{"role": "user", "content": prompt}]) final_output = guard( - llm_api=openai.completions.create, + model="gpt-3.5-turbo", prompt_params={"document": content[:6000]}, num_reasks=1, ) @@ -357,7 +404,7 @@ def test_entity_extraction_with_fix(mocker, rail, prompt): assert call.iterations.length == 1 # For orginal prompt and output - assert call.compiled_prompt == entity_extraction.COMPILED_PROMPT + assert call.compiled_messages[0]["content"] == entity_extraction.COMPILED_PROMPT assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.guarded_output == entity_extraction.VALIDATED_OUTPUT_FIX @@ -374,12 +421,27 @@ def test_entity_extraction_with_fix(mocker, rail, prompt): ) def test_entity_extraction_with_refrain(mocker, rail, prompt): """Test that the entity extraction works with re-asking.""" - mocker.patch("guardrails.llm_providers.LiteLLMCallable", new=MockLiteLLMCallable) + mock_invoke_llm = mocker.patch( + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" + ) + + mock_invoke_llm.side_effect = [ + LLMResponse( + output=entity_extraction.LLM_OUTPUT, + prompt_token_count=123, + response_token_count=1234, + ), + LLMResponse( + output=entity_extraction.LLM_OUTPUT_FULL_REASK, + prompt_token_count=123, + response_token_count=1234, + ), + ] content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = guard_initializer(rail, messages=[{"role": "user", "content": prompt}]) final_output = guard( - llm_api=openai.completions.create, + model="gpt-3.5-turbo", prompt_params={"document": content[:6000]}, num_reasks=1, ) @@ -393,7 +455,7 @@ def test_entity_extraction_with_refrain(mocker, rail, prompt): assert call.iterations.length == 1 # For orginal prompt and output - assert call.compiled_prompt == entity_extraction.COMPILED_PROMPT + assert call.compiled_messages[0]["content"] == entity_extraction.COMPILED_PROMPT assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.guarded_output == entity_extraction.VALIDATED_OUTPUT_REFRAIN @@ -433,7 +495,7 @@ def test_entity_extraction_with_fix_chat_models(mocker, rail, messages): content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = guard_initializer(rail, messages) final_output = guard( - llm_api=openai.chat.completions.create, + model="gpt-3.5-turbo", prompt_params={"document": content[:6000]}, num_reasks=1, ) @@ -448,9 +510,12 @@ def test_entity_extraction_with_fix_chat_models(mocker, rail, messages): # For orginal prompt and output assert ( - call.compiled_prompt == entity_extraction.COMPILED_PROMPT_WITHOUT_INSTRUCTIONS + call.compiled_messages[1]["content"] + == entity_extraction.COMPILED_PROMPT_WITHOUT_INSTRUCTIONS + ) + assert ( + call.compiled_messages[0]["content"] == entity_extraction.COMPILED_INSTRUCTIONS ) - assert call.compiled_instructions == entity_extraction.COMPILED_INSTRUCTIONS assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT assert call.guarded_output == entity_extraction.VALIDATED_OUTPUT_FIX @@ -481,16 +546,18 @@ def test_entity_extraction_with_fix_chat_models(mocker, rail, messages): @pytest.mark.parametrize( - "rail,prompt,instructions,history,llm_api,expected_prompt," + "rail,messages,expected_prompt," "expected_instructions,expected_reask_prompt,expected_reask_instructions," "llm_outputs", [ ( entity_extraction.RAIL_SPEC_WITH_REASK_NO_PROMPT, - entity_extraction.OPTIONAL_PROMPT_COMPLETION_MODEL, - None, - None, - openai.completions.create, + [ + { + "role": "user", + "content": entity_extraction.OPTIONAL_PROMPT_COMPLETION_MODEL, + } + ], entity_extraction.COMPILED_PROMPT, None, entity_extraction.COMPILED_PROMPT_REASK, @@ -504,10 +571,16 @@ def test_entity_extraction_with_fix_chat_models(mocker, rail, messages): ), ( entity_extraction.RAIL_SPEC_WITH_REASK_NO_PROMPT, - entity_extraction.OPTIONAL_PROMPT_CHAT_MODEL, - entity_extraction.OPTIONAL_INSTRUCTIONS_CHAT_MODEL, - None, - openai.chat.completions.create, + [ + { + "role": "system", + "content": entity_extraction.OPTIONAL_INSTRUCTIONS_CHAT_MODEL, + }, + { + "role": "user", + "content": entity_extraction.OPTIONAL_PROMPT_CHAT_MODEL, + }, + ], entity_extraction.COMPILED_PROMPT_WITHOUT_INSTRUCTIONS, entity_extraction.COMPILED_INSTRUCTIONS, entity_extraction.COMPILED_PROMPT_REASK_WITHOUT_INSTRUCTIONS, @@ -521,10 +594,7 @@ def test_entity_extraction_with_fix_chat_models(mocker, rail, messages): ), ( entity_extraction.RAIL_SPEC_WITH_REASK_NO_PROMPT, - None, - None, entity_extraction.OPTIONAL_MSG_HISTORY, - openai.chat.completions.create, None, None, entity_extraction.COMPILED_PROMPT_REASK_WITHOUT_INSTRUCTIONS, @@ -541,10 +611,7 @@ def test_entity_extraction_with_fix_chat_models(mocker, rail, messages): def test_entity_extraction_with_reask_with_optional_prompts( mocker, rail, - prompt, - instructions, - history, - llm_api, + messages, expected_prompt, expected_instructions, expected_reask_prompt, @@ -560,25 +627,20 @@ def test_entity_extraction_with_reask_with_optional_prompts( ) for o in llm_outputs ] + mock_openai_invoke_llm = None - if llm_api == openai.completions.create: - mock_openai_invoke_llm = mocker.patch( - "guardrails.llm_providers.LiteLLMCallable._invoke_llm" - ) - else: - mock_openai_invoke_llm = mocker.patch( - "guardrails.llm_providers.LiteLLMCallable._invoke_llm" - ) + + mock_openai_invoke_llm = mocker.patch( + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" + ) mock_openai_invoke_llm.side_effect = llm_return_values content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = Guard.from_rail_string(rail) final_output = guard( - llm_api=llm_api, - prompt=prompt, - instructions=instructions, - messages=history, + model="gpt-3.5-turbo", + messages=messages, prompt_params={"document": content[:6000]}, num_reasks=1, ) @@ -592,13 +654,19 @@ def test_entity_extraction_with_reask_with_optional_prompts( assert call.iterations.length == 2 # For orginal prompt and output - assert call.compiled_prompt == expected_prompt + if expected_prompt: + if len(call.compiled_messages) == 1: + prompt = call.compiled_messages[0]["content"] + else: + prompt = call.compiled_messages[1]["content"] + assert prompt == expected_prompt assert call.iterations.first.raw_output == entity_extraction.LLM_OUTPUT assert ( call.iterations.first.validation_response == entity_extraction.VALIDATED_OUTPUT_REASK_1 ) - assert call.compiled_instructions == expected_instructions + if expected_instructions: + assert call.compiled_messages[0]["content"] == expected_instructions # For reask validator logs # TODO: Update once we add json_path to the ValidatorLog class @@ -622,7 +690,8 @@ def test_entity_extraction_with_reask_with_optional_prompts( ) # For re-asked prompt and output - assert call.reask_prompts.last == expected_reask_prompt + if expected_reask_prompt: + assert call.reask_messages.last[1]["content"] == expected_reask_prompt # FIXME: Switch back to this once field level reask schema pruning is implemented # noqa # assert call.raw_outputs.at(1) == entity_extraction.LLM_OUTPUT_REASK assert call.raw_outputs.at(1) == json.dumps( @@ -631,7 +700,7 @@ def test_entity_extraction_with_reask_with_optional_prompts( assert call.guarded_output == entity_extraction.VALIDATED_OUTPUT_REASK_2 if expected_reask_instructions: - assert call.reask_instructions.last == expected_reask_instructions + assert call.reask_messages.last[0]["content"] == expected_reask_instructions def test_skeleton_reask(mocker): @@ -672,7 +741,7 @@ def test_skeleton_reask(mocker): entity_extraction.RAIL_SPEC_WITH_SKELETON_REASK ) final_output = guard( - llm_api=openai.completions.create, + model="gpt-3.5-turbo", prompt_params={"document": content[:6000]}, max_tokens=1000, num_reasks=1, @@ -690,7 +759,10 @@ def test_skeleton_reask(mocker): assert call.iterations.length == 2 # For orginal prompt and output - assert call.compiled_prompt == entity_extraction.COMPILED_PROMPT_SKELETON_REASK_1 + assert ( + call.compiled_messages[0]["content"] + == entity_extraction.COMPILED_PROMPT_SKELETON_REASK_1 + ) assert ( call.iterations.first.raw_output == entity_extraction.LLM_OUTPUT_SKELETON_REASK_1 @@ -701,7 +773,10 @@ def test_skeleton_reask(mocker): ) # For re-asked prompt and output - assert call.reask_prompts.last == entity_extraction.COMPILED_PROMPT_SKELETON_REASK_2 + assert ( + call.reask_messages[0][1]["content"] + == entity_extraction.COMPILED_PROMPT_SKELETON_REASK_2 + ) assert call.raw_outputs.last == entity_extraction.LLM_OUTPUT_SKELETON_REASK_2 assert call.guarded_output == entity_extraction.VALIDATED_OUTPUT_SKELETON_REASK_2 @@ -709,11 +784,23 @@ def test_skeleton_reask(mocker): def test_string_with_message_history_reask(mocker): """Test single string (non-JSON) generation with message history and reask.""" - mocker.patch( - "guardrails.llm_providers.LiteLLMCallable", - new=MockLiteLLMCallable, + mock_invoke_llm = mocker.patch( + "guardrails.llm_providers.LiteLLMCallable._invoke_llm" ) + mock_invoke_llm.side_effect = [ + LLMResponse( + output=string.MSG_LLM_OUTPUT_INCORRECT, + prompt_token_count=123, + response_token_count=1234, + ), + LLMResponse( + output=string.MSG_LLM_OUTPUT_CORRECT, + prompt_token_count=123, + response_token_count=1234, + ), + ] + guard = gd.Guard.from_rail_string(string.RAIL_SPEC_FOR_MSG_HISTORY) final_output = guard( messages=string.MOVIE_MSG_HISTORY, @@ -728,16 +815,16 @@ def test_string_with_message_history_reask(mocker): # Check that the guard state object has the correct number of re-asks. assert call.iterations.length == 2 - assert call.compiled_instructions is None - assert call.compiled_prompt is None assert call.iterations.first.raw_output == string.MSG_LLM_OUTPUT_INCORRECT assert ( call.iterations.first.validation_response == string.MSG_VALIDATED_OUTPUT_REASK ) # For re-asked prompt and output - assert call.reask_prompts.last == string.MSG_COMPILED_PROMPT_REASK - assert call.reask_instructions.last == string.MSG_COMPILED_INSTRUCTIONS_REASK + assert call.reask_messages[0][1]["content"] == string.MSG_COMPILED_PROMPT_REASK + assert ( + call.reask_messages[0][0]["content"] == string.MSG_COMPILED_INSTRUCTIONS_REASK + ) assert call.raw_outputs.last == string.MSG_LLM_OUTPUT_CORRECT assert call.guarded_output == string.MSG_LLM_OUTPUT_CORRECT @@ -786,16 +873,16 @@ def test_pydantic_with_message_history_reask(mocker): # Check that the guard state object has the correct number of re-asks. assert call.iterations.length == 2 - assert call.compiled_instructions is None - assert call.compiled_prompt is None assert call.iterations.first.raw_output == pydantic.MSG_HISTORY_LLM_OUTPUT_INCORRECT assert ( call.iterations.first.validation_response == pydantic.MSG_VALIDATED_OUTPUT_REASK ) # For re-asked prompt and output - assert call.reask_prompts.last == pydantic.MSG_COMPILED_PROMPT_REASK - assert call.reask_instructions.last == pydantic.MSG_COMPILED_INSTRUCTIONS_REASK + assert call.reask_messages[0][1]["content"] == pydantic.MSG_COMPILED_PROMPT_REASK + assert ( + call.reask_messages[0][0]["content"] == pydantic.MSG_COMPILED_INSTRUCTIONS_REASK + ) assert call.raw_outputs.last == pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT assert call.guarded_output == json.loads(pydantic.MSG_HISTORY_LLM_OUTPUT_CORRECT) @@ -815,11 +902,12 @@ def test_sequential_validator_log_is_not_duplicated(mocker): try: content = gd.docs_utils.read_pdf("docs/examples/data/chase_card_agreement.pdf") guard = guard_initializer( - entity_extraction.PYDANTIC_RAIL_WITH_NOOP, entity_extraction.PYDANTIC_PROMPT + entity_extraction.PYDANTIC_RAIL_WITH_NOOP, + messages=[{"role": "user", "content": entity_extraction.PYDANTIC_PROMPT}], ) guard( - llm_api=openai.completions.create, + model="gpt-3.5-turbo", prompt_params={"document": content[:6000]}, num_reasks=1, ) @@ -1019,7 +1107,7 @@ def test_string_output(mocker): assert call.iterations.length == 1 # For original prompt and output - assert call.compiled_messages[1]["content"]._source == string.COMPILED_PROMPT + assert call.compiled_messages[1]["content"] == string.COMPILED_PROMPT assert call.raw_outputs.last == string.LLM_OUTPUT assert mock_invoke_llm.call_count == 1 mock_invoke_llm = None @@ -1156,8 +1244,8 @@ def test_string_reask(mocker): assert call.iterations.length == 2 # For orginal prompt and output - assert call.compiled_messages[0]["content"]._source == string.COMPILED_INSTRUCTIONS - assert call.compiled_messages[1]["content"]._source == string.COMPILED_PROMPT + assert call.compiled_messages[0]["content"] == string.COMPILED_INSTRUCTIONS + assert call.compiled_messages[1]["content"] == string.COMPILED_PROMPT assert call.iterations.first.raw_output == string.LLM_OUTPUT assert call.iterations.first.validation_response == string.VALIDATED_OUTPUT_REASK diff --git a/tests/integration_tests/test_multi_reask.py b/tests/integration_tests/test_multi_reask.py index 3616572a3..df5b12307 100644 --- a/tests/integration_tests/test_multi_reask.py +++ b/tests/integration_tests/test_multi_reask.py @@ -44,7 +44,7 @@ def test_multi_reask(mocker): assert len(call.iterations) == 3 assert ( - call.compiled_messages[0]["content"]._source + call.compiled_messages[0]["content"] == python_rail.VALIDATOR_PARALLELISM_PROMPT_1 ) assert call.raw_outputs.first == python_rail.VALIDATOR_PARALLELISM_RESPONSE_1 diff --git a/tests/integration_tests/test_parsing.py b/tests/integration_tests/test_parsing.py index 3397b3b3e..3c127b4aa 100644 --- a/tests/integration_tests/test_parsing.py +++ b/tests/integration_tests/test_parsing.py @@ -1,5 +1,4 @@ from typing import Dict -import openai import pytest import guardrails as gd @@ -49,7 +48,7 @@ def test_parsing_reask(mocker): assert call.iterations.length == 2 # For orginal prompt and output - assert call.compiled_messages[0]["content"]._source == pydantic.PARSING_COMPILED_PROMPT + assert call.compiled_messages[0]["content"] == pydantic.PARSING_COMPILED_PROMPT assert call.iterations.first.raw_output == pydantic.PARSING_UNPARSEABLE_LLM_OUTPUT assert call.iterations.first.guarded_output is None @@ -58,7 +57,7 @@ def test_parsing_reask(mocker): pydantic.PARSING_COMPILED_REASK ) # Same as above - assert call.reask_messages[0][1]["content"]._source == pydantic.PARSING_COMPILED_REASK + assert call.reask_messages[0][1]["content"] == pydantic.PARSING_COMPILED_REASK assert call.raw_outputs.last == pydantic.PARSING_EXPECTED_LLM_OUTPUT assert call.guarded_output == pydantic.PARSING_EXPECTED_OUTPUT @@ -101,7 +100,7 @@ async def test_async_parsing_reask(mocker): assert call.iterations.length == 2 # For orginal prompt and output - assert call.compiled_messages[0]["content"]._source == pydantic.PARSING_COMPILED_PROMPT + assert call.compiled_messages[0]["content"] == pydantic.PARSING_COMPILED_PROMPT assert call.iterations.first.raw_output == pydantic.PARSING_UNPARSEABLE_LLM_OUTPUT assert call.iterations.first.guarded_output is None @@ -111,7 +110,7 @@ async def test_async_parsing_reask(mocker): pydantic.PARSING_COMPILED_REASK ) # Same as above - assert call.reask_messages[0][1]["content"]._source == pydantic.PARSING_COMPILED_REASK + assert call.reask_messages[0][1]["content"] == pydantic.PARSING_COMPILED_REASK assert call.raw_outputs.last == pydantic.PARSING_EXPECTED_LLM_OUTPUT assert call.guarded_output == pydantic.PARSING_EXPECTED_OUTPUT diff --git a/tests/integration_tests/test_pydantic.py b/tests/integration_tests/test_pydantic.py index a3867c694..2783b9558 100644 --- a/tests/integration_tests/test_pydantic.py +++ b/tests/integration_tests/test_pydantic.py @@ -57,7 +57,7 @@ def test_pydantic_with_reask(mocker): assert call.iterations.length == 3 # For original prompt and output - assert call.compiled_messages[0]["content"]._source == pydantic.COMPILED_PROMPT + assert call.compiled_messages[0]["content"] == pydantic.COMPILED_PROMPT assert call.iterations.first.raw_output == pydantic.LLM_OUTPUT assert ( call.iterations.first.validation_response == pydantic.VALIDATED_OUTPUT_REASK_1 @@ -65,12 +65,12 @@ def test_pydantic_with_reask(mocker): # For re-asked prompt and output # Assert through iteration - assert call.iterations.at(1).inputs.prompt == gd.Prompt( + assert call.iterations.at(1).inputs.messages[1]["content"] == gd.Prompt( pydantic.COMPILED_PROMPT_REASK_1 ) assert call.iterations.at(1).raw_output == pydantic.LLM_OUTPUT_REASK_1 # Assert through call shortcut properties - assert call.reask_prompts.first == pydantic.COMPILED_PROMPT_REASK_1 + assert call.reask_messages.first[1]["content"] == pydantic.COMPILED_PROMPT_REASK_1 assert call.raw_outputs.at(1) == pydantic.LLM_OUTPUT_REASK_1 # We don't track merged validation output anymore @@ -90,11 +90,11 @@ def test_pydantic_with_reask(mocker): ) # For re-asked prompt #2 and output #2 - assert call.iterations.last.inputs.prompt == gd.Prompt( + assert call.iterations.last.inputs.messages[1]["content"] == gd.Prompt( pydantic.COMPILED_PROMPT_REASK_2 ) # Same as above - assert call.reask_prompts.last == pydantic.COMPILED_PROMPT_REASK_2 + assert call.reask_messages.last[1]["content"] == pydantic.COMPILED_PROMPT_REASK_2 assert call.raw_outputs.last == pydantic.LLM_OUTPUT_REASK_2 assert call.guarded_output is None assert call.validation_response == pydantic.VALIDATED_OUTPUT_REASK_3 @@ -150,7 +150,7 @@ def test_pydantic_with_full_schema_reask(mocker): assert call.iterations.length == 3 # For original prompt and output - assert call.compiled_messages[0]["content"]._source == pydantic.COMPILED_PROMPT_CHAT + assert call.compiled_messages[0]["content"] == pydantic.COMPILED_PROMPT_CHAT assert call.iterations.first.raw_output == pydantic.LLM_OUTPUT assert ( call.iterations.first.validation_response == pydantic.VALIDATED_OUTPUT_REASK_1 @@ -158,11 +158,11 @@ def test_pydantic_with_full_schema_reask(mocker): # For re-asked prompt and output assert ( - call.iterations.at(1).inputs.messages[0]["content"]._source + call.iterations.at(1).inputs.messages[1]["content"]._source == pydantic.COMPILED_PROMPT_FULL_REASK_1 ) assert ( - call.iterations.at(1).inputs.messages[1]["content"]._source + call.iterations.at(1).inputs.messages[0]["content"]._source == pydantic.COMPILED_INSTRUCTIONS_CHAT ) assert call.iterations.at(1).raw_output == pydantic.LLM_OUTPUT_FULL_REASK_1 @@ -171,10 +171,10 @@ def test_pydantic_with_full_schema_reask(mocker): ) # For re-asked prompt #2 and output #2 - assert call.iterations.last.inputs.prompt == gd.Prompt( + assert call.iterations.last.inputs.messages[1]["content"] == gd.Prompt( pydantic.COMPILED_PROMPT_FULL_REASK_2 ) - assert call.iterations.last.inputs.instructions == gd.Instructions( + assert call.iterations.last.inputs.messages[0]["content"] == gd.Instructions( pydantic.COMPILED_INSTRUCTIONS_CHAT ) assert call.raw_outputs.last == pydantic.LLM_OUTPUT_FULL_REASK_2 diff --git a/tests/integration_tests/test_python_rail.py b/tests/integration_tests/test_python_rail.py index 60f4bfbbe..b463ed0f3 100644 --- a/tests/integration_tests/test_python_rail.py +++ b/tests/integration_tests/test_python_rail.py @@ -2,7 +2,6 @@ from datetime import date, time from typing import List, Literal, Union -import openai import pytest from pydantic import BaseModel, Field, field_validator, model_validator @@ -17,7 +16,6 @@ ) from tests.integration_tests.test_assets.validators import ValidLength, TwoWords -from .mock_llm_outputs import MockLiteLLMCallable from .test_assets import python_rail, string @@ -118,13 +116,16 @@ def test_python_rail(mocker): output_class=Director, messages=[ { - "role": "system", - "content": "\nYou are a helpful assistant only capable of communicating" - " with valid JSON, and no other text.\n${gr.xml_suffix_prompt_examples}", + "role": "system", + "content": "\nYou are a helpful assistant" + " only capable of communicating" + " with valid JSON, and no other" + " text.\n${gr.xml_suffix_prompt_examples}", }, { - "role": "user", - "content":"Provide detailed information about the top 5 grossing movies from" + "role": "user", + "content": "Provide detailed information" + " about the top 5 grossing movies from" " ${director} including release date, duration, budget, whether " "it's a sequel, website, and contact email.\n" "${gr.xml_suffix_without_examples}", @@ -152,7 +153,7 @@ def test_python_rail(mocker): assert call.iterations.length == 2 assert ( - call.compiled_messages[1]["content"]._source + call.compiled_messages[1]["content"] == python_rail.COMPILED_PROMPT_1_PYDANTIC_2_WITHOUT_INSTRUCTIONS ) @@ -165,7 +166,10 @@ def test_python_rail(mocker): python_rail.COMPILED_PROMPT_2_WITHOUT_INSTRUCTIONS ) # Same as above - assert call.reask_messages[0][1]["content"]._source == python_rail.COMPILED_PROMPT_2_WITHOUT_INSTRUCTIONS + assert ( + call.reask_messages[0][1]["content"] + == python_rail.COMPILED_PROMPT_2_WITHOUT_INSTRUCTIONS + ) assert ( call.raw_outputs.last == python_rail.LLM_OUTPUT_2_SUCCEED_GUARDRAILS_BUT_FAIL_PYDANTIC_VALIDATION @@ -235,13 +239,16 @@ def test_python_string(mocker): assert call.iterations.length == 2 # For orginal prompt and output - assert call.compiled_messages[0]["content"]._source == string.COMPILED_INSTRUCTIONS - assert call.compiled_messages[1]["content"]._source == string.COMPILED_PROMPT + assert call.compiled_messages[0]["content"] == string.COMPILED_INSTRUCTIONS + assert call.compiled_messages[1]["content"] == string.COMPILED_PROMPT assert call.iterations.first.raw_output == string.LLM_OUTPUT assert call.iterations.first.validation_response == string.VALIDATED_OUTPUT_REASK # For re-asked prompt and output - assert call.iterations.last.inputs.messages[1]["content"] == string.COMPILED_PROMPT_REASK + assert ( + call.iterations.last.inputs.messages[1]["content"] + == string.COMPILED_PROMPT_REASK + ) # Same as above assert call.reask_messages.last[-1]["content"] == string.COMPILED_PROMPT_REASK assert call.raw_outputs.last == string.LLM_OUTPUT_REASK diff --git a/tests/unit_tests/test_llm_providers.py b/tests/unit_tests/test_llm_providers.py index 372833f58..a6de294c4 100644 --- a/tests/unit_tests/test_llm_providers.py +++ b/tests/unit_tests/test_llm_providers.py @@ -24,7 +24,9 @@ def test_openai_callable_does_not_retry_on_success(mocker): llm = MockOpenAILlm() succeed_spy = mocker.spy(llm, "succeed") - arbitrary_callable = ArbitraryCallable(llm.succeed, messages=[{"role":"user", "content":"Hello"}]) + arbitrary_callable = ArbitraryCallable( + llm.succeed, messages=[{"role": "user", "content": "Hello"}] + ) response = arbitrary_callable() assert succeed_spy.call_count == 1 @@ -39,7 +41,9 @@ async def test_async_openai_callable_does_not_retry_on_success(mocker): llm = MockAsyncOpenAILlm() succeed_spy = mocker.spy(llm, "succeed") - arbitrary_callable = AsyncArbitraryCallable(llm.succeed, messages=[{"role":"user", "content":"Hello"}]) + arbitrary_callable = AsyncArbitraryCallable( + llm.succeed, messages=[{"role": "user", "content": "Hello"}] + ) response = await arbitrary_callable() assert succeed_spy.call_count == 1 @@ -229,7 +233,9 @@ def decode(self, output: str, *args, **kwargs) -> str: hf_model_callable = HuggingFaceModelCallable() response = hf_model_callable( - "Hello", model_generate=model_generate, tokenizer=tokenizer + model_generate=model_generate, + messages=[{"role": "user", "content": "Hello"}], + tokenizer=tokenizer, ) assert tokenizer_call_spy.call_count == 1 @@ -448,17 +454,6 @@ def my_llm(prompt: str, **kwargs) -> str: assert isinstance(prompt_callable, ArbitraryCallable) -def test_get_llm_ask_custom_llm_must_accept_prompt(): - def my_llm() -> str: - return "Hello!" - - with pytest.raises( - ValueError, - match="Custom LLM callables must accept at least one positional argument for prompt!", # noqa - ): - get_llm_ask(my_llm) - - def test_get_llm_ask_custom_llm_must_accept_kwargs(): def my_llm(messages: str) -> str: return f"Hello {messages}!" @@ -483,8 +478,8 @@ async def my_llm(messages: str, **kwargs) -> str: def test_get_async_llm_ask_custom_llm_warning(): from guardrails.llm_providers import AsyncArbitraryCallable - async def my_llm(messages: str, **kwargs) -> str: - return f"Hello {messages}!" + async def my_llm(**kwargs) -> str: + return "Hello world!" with pytest.warns( UserWarning, From e8eb7f5f563de3aa60ea355bcf7db9002afcacee Mon Sep 17 00:00:00 2001 From: David Tam Date: Fri, 27 Sep 2024 13:32:26 -0700 Subject: [PATCH 16/71] typing and lint --- guardrails/applications/text2sql.py | 18 ++++++++++++++---- guardrails/classes/history/call.py | 16 +++++++++------- guardrails/classes/history/iteration.py | 8 ++++---- guardrails/formatters/json_formatter.py | 10 +++++----- guardrails/llm_providers.py | 13 +++++++++---- guardrails/prompt/messages.py | 10 ++++------ guardrails/run/runner.py | 16 ++++++++++------ guardrails/utils/misc.py | 4 ++-- 8 files changed, 57 insertions(+), 38 deletions(-) diff --git a/guardrails/applications/text2sql.py b/guardrails/applications/text2sql.py index 8c97b7d12..50c0cb89b 100644 --- a/guardrails/applications/text2sql.py +++ b/guardrails/applications/text2sql.py @@ -70,7 +70,12 @@ def __init__( rail_spec: Optional[str] = None, rail_params: Optional[Dict] = None, example_formatter: Callable = example_formatter, - reask_prompt: str = REASK_PROMPT, + reask_messages: list[Dict[str, str]] = [ + { + "role": "user", + "content": REASK_PROMPT, + } + ], llm_api: Optional[Callable] = None, llm_api_kwargs: Optional[Dict] = None, num_relevant_examples: int = 2, @@ -108,7 +113,7 @@ def __init__( schema_file, rail_spec, rail_params, - reask_prompt, + reask_messages, ) # Initialize the document store. @@ -122,7 +127,12 @@ def _init_guard( schema_file: Optional[str] = None, rail_spec: Optional[str] = None, rail_params: Optional[Dict] = None, - reask_prompt: str = REASK_PROMPT, + reask_messages: list[Dict[str, str]] = [ + { + "role": "user", + "content": REASK_PROMPT, + } + ], ): # Initialize the Guard class if rail_spec is None: @@ -140,7 +150,7 @@ def _init_guard( rail_spec_str = Template(rail_spec_str).safe_substitute(**rail_params) guard = Guard.from_rail_string(rail_spec_str) - guard._exec_opts.reask_prompt = reask_prompt + guard._exec_opts.reask_messages = reask_messages return guard diff --git a/guardrails/classes/history/call.py b/guardrails/classes/history/call.py index b580c8226..ae35e0692 100644 --- a/guardrails/classes/history/call.py +++ b/guardrails/classes/history/call.py @@ -78,21 +78,23 @@ def prompt_params(self) -> Optional[Dict]: return self.inputs.prompt_params @property - def messages(self) -> Optional[Messages]: + def messages(self) -> Optional[Union[Messages, list[dict[str, str]]]]: """The messages as provided by the user when initializing or calling the Guard.""" return self.inputs.messages @property - def compiled_messages(self) -> Optional[str]: + def compiled_messages(self) -> Optional[list[dict[str, str]]]: """The initial compiled messages that were passed to the LLM on the first call.""" if self.iterations.empty(): return None - initial_inputs = self.iterations.first.inputs - messages: Messages = initial_inputs.messages + initial_inputs = self.iterations.first.inputs # type: ignore + messages = initial_inputs.messages prompt_params = initial_inputs.prompt_params or {} compiled_messages = [] + if messages is None: + return None for message in messages: content = message["content"].format(**prompt_params) if isinstance(content, (Prompt, Instructions)): @@ -116,11 +118,11 @@ def reask_messages(self) -> Stack[Messages]: reasks = self.iterations.copy() initial_messages = reasks.first reasks.remove(initial_messages) # type: ignore - initial_inputs = self.iterations.first.inputs + initial_inputs = self.iterations.first.inputs # type: ignore prompt_params = initial_inputs.prompt_params or {} compiled_reasks = [] for reask in reasks: - messages: Messages = reask.inputs.messages + messages = reask.inputs.messages if messages is None: compiled_reasks.append(None) @@ -136,7 +138,7 @@ def reask_messages(self) -> Stack[Messages]: "content": content, } ) - compiled_reasks.append(compiled_messages) + compiled_reasks.append(compiled_messages) return Stack(*compiled_reasks) return Stack() diff --git a/guardrails/classes/history/iteration.py b/guardrails/classes/history/iteration.py index ae4974f47..dbf530acc 100644 --- a/guardrails/classes/history/iteration.py +++ b/guardrails/classes/history/iteration.py @@ -12,7 +12,7 @@ from guardrails.classes.history.outputs import Outputs from guardrails.classes.generic.arbitrary_model import ArbitraryModel from guardrails.logger import get_scope_handler -from guardrails.prompt.prompt import Prompt +from guardrails.prompt import Prompt, Instructions from guardrails.classes.validation.validator_logs import ValidatorLogs from guardrails.actions.reask import ReAsk from guardrails.classes.validation.validation_result import ErrorSpan @@ -189,7 +189,7 @@ def status(self) -> str: @property def rich_group(self) -> Group: def create_messages_table( - messages: Optional[List[Dict[str, Prompt]]], + messages: Optional[List[Dict[str, Union[str, Prompt, Instructions]]]], ) -> Union[str, Table]: if messages is None: return "No messages." @@ -198,11 +198,11 @@ def create_messages_table( table.add_column("Content") for msg in messages: - table.add_row(str(msg["role"]), msg["content"]) + table.add_row(str(msg["role"]), msg["content"]) # type: ignore return table - table = create_messages_table(self.inputs.messages) + table = create_messages_table(self.inputs.messages) # type: ignore return Group( Panel(table, title="Messages", style="on #E7DFEB"), diff --git a/guardrails/formatters/json_formatter.py b/guardrails/formatters/json_formatter.py index e71b718ae..adb1a5207 100644 --- a/guardrails/formatters/json_formatter.py +++ b/guardrails/formatters/json_formatter.py @@ -106,7 +106,7 @@ def fn( **kwargs, ) -> str: prompt = "" - for msg in messages: + for msg in messages: # type: ignore prompt += msg["content"] return json.dumps( @@ -114,7 +114,7 @@ def fn( model=model.model, tokenizer=model.tokenizer, json_schema=self.output_schema, - prompt=prompt + prompt=prompt, )() ) @@ -132,15 +132,15 @@ def fn( **kwargs, ) -> str: prompt = "" - for msg in messages: + for msg in messages: # type: ignore prompt += msg["content"] - + return json.dumps( Jsonformer( model=model, tokenizer=tokenizer, json_schema=self.output_schema, - prompt=prompt + prompt=prompt, )() ) diff --git a/guardrails/llm_providers.py b/guardrails/llm_providers.py index 0253de0ab..2b9adfa24 100644 --- a/guardrails/llm_providers.py +++ b/guardrails/llm_providers.py @@ -32,13 +32,16 @@ # todo fix circular import -def messages_string(messages: MessageHistory) -> str: +def messages_string( + messages: Union[list[dict[str, Union[str, Prompt, Instructions]]], MessageHistory], +) -> str: messages_copy = "" for msg in messages: content = ( - msg["content"].source + msg["content"].source # type: ignore if isinstance(msg["content"], Prompt) - else msg["content"] + or isinstance(msg["content"], Instructions) # type: ignore + else msg["content"] # type: ignore ) messages_copy += content return messages_copy @@ -269,7 +272,9 @@ def _invoke_llm( self, model_generate: Any, *args, - messages: list[dict[str, Union[str, Prompt, Instructions]]], + messages: Union[ + list[dict[str, Union[str, Prompt, Instructions]]], MessageHistory + ], **kwargs, ) -> LLMResponse: try: diff --git a/guardrails/prompt/messages.py b/guardrails/prompt/messages.py index 3e77e56be..8740cc46c 100644 --- a/guardrails/prompt/messages.py +++ b/guardrails/prompt/messages.py @@ -2,9 +2,9 @@ import re from string import Template -from typing import Dict, List, Optional - +from typing import Dict, List, Optional, Union +from guardrails.prompt import Prompt, Instructions from guardrails.classes.templating.namespace_template import NamespaceTemplate from guardrails.utils.constants import constants from guardrails.utils.templating_utils import get_template_variables @@ -13,7 +13,7 @@ class Messages: def __init__( self, - source: List[Dict[str, str]], + source: List[Dict[str, Union[str, Prompt, Instructions]]], output_schema: Optional[str] = None, *, xml_output_schema: Optional[str] = None, @@ -71,9 +71,7 @@ def format( filtered_kwargs = {k: v for k, v in kwargs.items() if k in vars} # Return another instance of the class with the formatted message. - formatted_message = Template(msg_str).safe_substitute( - **filtered_kwargs - ) + formatted_message = Template(msg_str).safe_substitute(**filtered_kwargs) formatted_messages.append( {"role": message["role"], "content": formatted_message} ) diff --git a/guardrails/run/runner.py b/guardrails/run/runner.py index dd50a806c..7b3303c99 100644 --- a/guardrails/run/runner.py +++ b/guardrails/run/runner.py @@ -16,7 +16,8 @@ ) from guardrails.logger import set_scope from guardrails.prompt import Prompt -from guardrails.run.utils import messages_source, messages_string +from guardrails.prompt.messages import Messages +from guardrails.run.utils import messages_source from guardrails.schema.rail_schema import json_schema_to_rail_output from guardrails.schema.validator import schema_validation from guardrails.hub_telemetry.hub_tracing import trace @@ -35,6 +36,7 @@ from guardrails.actions.reask import NonParseableReAsk, ReAsk, introspect from guardrails.telemetry import trace_call, trace_step + class Runner: """Runner class that calls an LLM API with a prompt, and performs input and output validation. @@ -293,9 +295,11 @@ def validate_messages( else msg["content"] ) inputs = Inputs( - llm_output=content, - ) - iteration = Iteration(call_id=call_log.id, index=attempt_number, inputs=inputs) + llm_output=content, + ) + iteration = Iteration( + call_id=call_log.id, index=attempt_number, inputs=inputs + ) call_log.iterations.insert(0, iteration) value, _metadata = validator_service.validate( value=content, @@ -309,7 +313,7 @@ def validate_messages( validated_msg = validator_service.post_process_validation( value, attempt_number, iteration, OutputTypes.STRING ) - + iteration.outputs.validation_response = validated_msg if isinstance(validated_msg, ReAsk): @@ -501,7 +505,7 @@ def prepare_to_loop( prompt_params: Optional[Dict] = None, ) -> Tuple[ Dict[str, Any], - Optional[List[Dict]], + Optional[Union[List[Dict], Messages]], ]: """Prepare to loop again.""" prompt_params = prompt_params or {} diff --git a/guardrails/utils/misc.py b/guardrails/utils/misc.py index 9f689582d..0a96b0496 100644 --- a/guardrails/utils/misc.py +++ b/guardrails/utils/misc.py @@ -49,11 +49,11 @@ def generate_test_artifacts( ext = f"_reask_{i}" # Save the compiled prompt. - compiled_prompt = logs.inputs.prompt + compiled_messages = logs.inputs.messages with open( os.path.join(artifact_dir, f"compiled_prompt_{on_fail_type}{ext}.txt"), "w" ) as f: - f.write(str(compiled_prompt or "")) + f.write(str(compiled_messages or "")) # Save the llm output. llm_output = logs.raw_output From f4c482746ea6cc9befc0e181629912f4b5a996c9 Mon Sep 17 00:00:00 2001 From: David Tam Date: Fri, 27 Sep 2024 13:39:40 -0700 Subject: [PATCH 17/71] lint --- guardrails/actions/reask.py | 5 +++-- guardrails/classes/history/call.py | 4 ++-- guardrails/run/async_stream_runner.py | 2 +- guardrails/run/stream_runner.py | 1 - tests/integration_tests/test_assets/custom_llm.py | 3 --- tests/integration_tests/test_assets/lists_object.py | 9 +++++++-- tests/integration_tests/test_formatters.py | 8 ++++++-- tests/unit_tests/actions/test_reask.py | 5 +---- tests/unit_tests/test_validator_base.py | 9 +++++---- 9 files changed, 25 insertions(+), 21 deletions(-) diff --git a/guardrails/actions/reask.py b/guardrails/actions/reask.py index 037db446e..55d587bcf 100644 --- a/guardrails/actions/reask.py +++ b/guardrails/actions/reask.py @@ -297,8 +297,9 @@ def get_reask_setup_for_string( if messages is None: messages = Messages( [ - {"role": "system", "content": instructions}, - {"role": "user", "content": prompt}] + {"role": "system", "content": instructions}, + {"role": "user", "content": prompt}, + ] ) messages = messages.format( diff --git a/guardrails/classes/history/call.py b/guardrails/classes/history/call.py index ae35e0692..7e92064dc 100644 --- a/guardrails/classes/history/call.py +++ b/guardrails/classes/history/call.py @@ -79,8 +79,8 @@ def prompt_params(self) -> Optional[Dict]: @property def messages(self) -> Optional[Union[Messages, list[dict[str, str]]]]: - """The messages as provided by the user when initializing or calling the - Guard.""" + """The messages as provided by the user when initializing or calling + the Guard.""" return self.inputs.messages @property diff --git a/guardrails/run/async_stream_runner.py b/guardrails/run/async_stream_runner.py index 5a3aecc58..218e0789f 100644 --- a/guardrails/run/async_stream_runner.py +++ b/guardrails/run/async_stream_runner.py @@ -200,7 +200,7 @@ async def async_step( def get_chunk_text(self, chunk: Any, api: Union[PromptCallableBase, None]) -> str: """Get the text from a chunk.""" chunk_text = "" - + try: finished = chunk.choices[0].finish_reason content = chunk.choices[0].delta.content diff --git a/guardrails/run/stream_runner.py b/guardrails/run/stream_runner.py index 38e6fbd65..1f37a1623 100644 --- a/guardrails/run/stream_runner.py +++ b/guardrails/run/stream_runner.py @@ -5,7 +5,6 @@ from guardrails.classes.output_type import OT, OutputTypes from guardrails.classes.validation_outcome import ValidationOutcome from guardrails.llm_providers import ( - LiteLLMCallable, PromptCallableBase, ) from guardrails.run.runner import Runner diff --git a/tests/integration_tests/test_assets/custom_llm.py b/tests/integration_tests/test_assets/custom_llm.py index 3001b6f91..6f23166bb 100644 --- a/tests/integration_tests/test_assets/custom_llm.py +++ b/tests/integration_tests/test_assets/custom_llm.py @@ -1,6 +1,3 @@ -from typing import Dict, List, Optional - - def mock_llm( messages, *args, diff --git a/tests/integration_tests/test_assets/lists_object.py b/tests/integration_tests/test_assets/lists_object.py index 42b23cd84..4779c3033 100644 --- a/tests/integration_tests/test_assets/lists_object.py +++ b/tests/integration_tests/test_assets/lists_object.py @@ -16,7 +16,12 @@ class Item(BaseModel): PYDANTIC_RAIL_WITH_LIST = List[Item] -RAIL_SPEC_WITH_LIST = """ +message = ( + '' + "Create a list of items that may be found in a grocery store." + "" +) +RAIL_SPEC_WITH_LIST = f""" @@ -25,7 +30,7 @@ class Item(BaseModel): - Create a list of items that may be found in a grocery store. + {message} """ diff --git a/tests/integration_tests/test_formatters.py b/tests/integration_tests/test_formatters.py index b6c3f341a..d72057d2c 100644 --- a/tests/integration_tests/test_formatters.py +++ b/tests/integration_tests/test_formatters.py @@ -25,7 +25,11 @@ class Foo(BaseModel): bez: List[str] g = Guard.from_pydantic(Foo, output_formatter="jsonformer") - response = g(model.generate, tokenizer=tokenizer, messages=[{"content": "test","role": "user"}]) + response = g( + model.generate, + tokenizer=tokenizer, + messages=[{"content": "test", "role": "user"}], + ) validated_output = response.validated_output assert isinstance(validated_output, dict) assert "bar" in validated_output @@ -45,7 +49,7 @@ class Foo(BaseModel): bez: List[str] g = Guard.from_pydantic(Foo, output_formatter="jsonformer") - response = g(model, messages=[{"content": "Sample:","role": "user"}]) + response = g(model, messages=[{"content": "Sample:", "role": "user"}]) validated_output = response.validated_output assert isinstance(validated_output, dict) assert "bar" in validated_output diff --git a/tests/unit_tests/actions/test_reask.py b/tests/unit_tests/actions/test_reask.py index 1e1e20cee..f78ebf01d 100644 --- a/tests/unit_tests/actions/test_reask.py +++ b/tests/unit_tests/actions/test_reask.py @@ -550,10 +550,7 @@ def test_get_reask_prompt( ] ) - ( - reask_schema, - reask_messages - ) = get_reask_setup( + (reask_schema, reask_messages) = get_reask_setup( output_type, output_schema, validation_map={}, diff --git a/tests/unit_tests/test_validator_base.py b/tests/unit_tests/test_validator_base.py index 6479f6f17..b8ae1f078 100644 --- a/tests/unit_tests/test_validator_base.py +++ b/tests/unit_tests/test_validator_base.py @@ -485,7 +485,9 @@ def mock_llm_api(messages, *args, **kwargs): } ], ) - assert str(excinfo.value) == "Validation failed for field with errors: must be exactly two words" + assert str(excinfo.value) == ( + "Validation failed for field with errors:" " must be exactly two words" + ) assert isinstance(guard.history.first.exception, ValidationError) assert guard.history.first.exception == excinfo.value @@ -565,8 +567,8 @@ async def mock_llm_api(messages, *args, **kwargs) -> str: } ], ) - - assert guard.history.first.iterations.first.outputs.validation_response == "What kind" + first_iter = guard.history.first.iterations.first + assert first_iter.outputs.validation_response == "What kind" # rail prompt validation guard = AsyncGuard.from_rail_string( @@ -767,4 +769,3 @@ async def custom_llm(messages, *args, **kwargs) -> str: assert str(excinfo.value) == unstructured_messages_error assert isinstance(guard.history.last.exception, ValidationError) assert guard.history.last.exception == excinfo.value - From 1228310551855ee8b442b55f56f1d231fd4739dd Mon Sep 17 00:00:00 2001 From: David Tam Date: Fri, 27 Sep 2024 13:46:41 -0700 Subject: [PATCH 18/71] typing --- guardrails/classes/history/call_inputs.py | 2 +- guardrails/classes/history/inputs.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/guardrails/classes/history/call_inputs.py b/guardrails/classes/history/call_inputs.py index 24dbc41ff..25a71cbd3 100644 --- a/guardrails/classes/history/call_inputs.py +++ b/guardrails/classes/history/call_inputs.py @@ -63,7 +63,7 @@ def from_interface(cls, i_call_inputs: ICallInputs) -> "CallInputs": return cls( llm_api=None, llm_output=i_call_inputs.llm_output, - messages=i_call_inputs.messages, + messages=i_call_inputs.messages, # type: ignore prompt_params=i_call_inputs.prompt_params, num_reasks=i_call_inputs.num_reasks, metadata=i_call_inputs.metadata, diff --git a/guardrails/classes/history/inputs.py b/guardrails/classes/history/inputs.py index ec0ccb971..18ec9114b 100644 --- a/guardrails/classes/history/inputs.py +++ b/guardrails/classes/history/inputs.py @@ -98,9 +98,9 @@ def to_dict(self) -> Dict[str, Any]: @classmethod def from_interface(cls, i_inputs: IInputs) -> "Inputs": deserialized_messages = None - if i_inputs.messages: + if i_inputs.messages: # type: ignore deserialized_messages = [] - for msg in i_inputs.messages: + for msg in i_inputs.messages: # type: ignore ser_msg = {**msg} content = ser_msg.get("content") if content: From 4e333b9c9a154bdd0ad01b1fdca4a3b246858aa5 Mon Sep 17 00:00:00 2001 From: David Tam Date: Fri, 27 Sep 2024 16:08:01 -0700 Subject: [PATCH 19/71] fix bad merge --- tests/integration_tests/test_guard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration_tests/test_guard.py b/tests/integration_tests/test_guard.py index 3549be9e5..0ae7c92ba 100644 --- a/tests/integration_tests/test_guard.py +++ b/tests/integration_tests/test_guard.py @@ -1328,7 +1328,7 @@ def test_ser_deser(self): ser_guard = guard.to_dict() - deser_guard = Guard.for_dict(ser_guard) + deser_guard = Guard.from_dict(ser_guard) assert deser_guard == guard From 416f29010b20e22c5d1996a20e20bf0f1a3b60c6 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Fri, 27 Sep 2024 16:11:09 -0700 Subject: [PATCH 20/71] Added rule based sentence tokenization from WordTokenizers.jl with minor modifications --- guardrails/utils/tokenization_utils.py | 173 +++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 guardrails/utils/tokenization_utils.py diff --git a/guardrails/utils/tokenization_utils.py b/guardrails/utils/tokenization_utils.py new file mode 100644 index 000000000..aef63e783 --- /dev/null +++ b/guardrails/utils/tokenization_utils.py @@ -0,0 +1,173 @@ +# This file contains code adapted from the WordTokenizers.jl +# https://github.com/JuliaText/WordTokenizers.jl project. +# It is subject to the license terms in the Apache License file +# found in the top-level directory of this distribution. +# This file has been modified by Guardrails AI on September 27 2024. + +import re + + +def replace_til_no_change(input_text, pattern, replacement): + while re.search(pattern, input_text): + input_text = re.sub(pattern, replacement, input_text) + return input_text + + +def postproc_splits(sentences): + """ + Applies heuristic rules to repair sentence splitting errors. + Developed for use as postprocessing for the GENIA sentence + splitter on PubMed abstracts, with minor tweaks for + full-text documents. + + `sentences` should be a string, with line breaks on sentence boundaries. + Returns a similar string, but more correct. + + Based on + https://github.com/ninjin/geniass/blob/master/geniass-postproc.pl + Which is + (c) 2010 Sampo Pyysalo. No rights reserved, i.e. do whatever you like with this. + Which draws in part on heuristics included in Yoshimasa Tsuruoka's + medss.pl script. + """ + # Remove Windows line endings + sentences = sentences.replace("\r", "") + + # Breaks sometimes missing after "?", "safe" cases + sentences = re.sub(r"\b([a-z]+\?) ([A-Z][a-z]+)\b", r"\1\n\2", sentences) + # Breaks sometimes missing after "." separated with extra space, "safe" cases + sentences = re.sub(r"\b([a-z]+ \.) ([A-Z][a-z]+)\b", r"\1\n\2", sentences) + + # No breaks producing lines only containing sentence-ending punctuation + sentences = re.sub(r"\n([.!?]+)\n", r"\1\n", sentences) + + # No breaks inside parentheses/brackets + # Unlimited length for no intervening parentheses/brackets + sentences = replace_til_no_change( + sentences, r"\[([^\[\]\(\)]*)\n([^\[\]\(\)]*)\]", r"[\1 \2]" + ) + sentences = replace_til_no_change( + sentences, r"\(([^\[\]\(\)]*)\n([^\[\]\(\)]*)\)", r"(\1 \2)" + ) + # Standard mismatched with possible intervening + sentences = replace_til_no_change( + sentences, r"\[([^\[\]]{0,250})\n([^\[\]]{0,250})\]", r"[\1 \2]" + ) + sentences = replace_til_no_change( + sentences, r"\(([^\(\)]{0,250})\n([^\(\)]{0,250})\)", r"(\1 \2)" + ) + + # Nesting to depth one + sentences = replace_til_no_change( + sentences, + r"\[((?:[^\[\]]|\[[^\[\]]*\]){0,250})\n((?:[^\[\]]|\[[^\[\]]*\]){0,250})\]", + r"[\1 \2]", + ) + sentences = replace_til_no_change( + sentences, + r"\(((?:[^\(\)]|\([^\(\)]*\)){0,250})\n((?:[^\(\)]|\([^\(\)]*\)){0,250})\)", + r"(\1 \2)", + ) + + # No break after periods followed by a non-uppercase "normal word" + sentences = re.sub(r"\.\n([a-z]{3}[a-z-]*[ .:,])", r". \1", sentences) + + # No break after a single letter other than I + sentences = re.sub(r"(\b[A-HJ-Z]\.)\n", r"\1 ", sentences) + + # No break before coordinating conjunctions (CC) + coordinating_conjunctions = ["and", "or", "but", "nor", "yet"] + for cc in coordinating_conjunctions: + sentences = re.sub(r"\n(" + cc + r" )", r" \1", sentences) + + # No break before prepositions (IN) + prepositions = [ + "of", + "in", + "by", + "as", + "on", + "at", + "to", + "via", + "for", + "with", + "that", + "than", + "from", + "into", + "upon", + "after", + "while", + "during", + "within", + "through", + "between", + "whereas", + "whether", + ] + for prep in prepositions: + sentences = re.sub(r"\n(" + prep + r" )", r" \1", sentences) + + # No sentence breaks in the middle of specific abbreviations + sentences = re.sub(r"(\be\.)\n(g\.)", r"\1 \2", sentences) + sentences = re.sub(r"(\bi\.)\n(e\.)", r"\1 \2", sentences) + sentences = re.sub(r"(\bi\.)\n(v\.)", r"\1 \2", sentences) + + # No sentence break after specific abbreviations + abbreviations = [ + r"e\. ?g\.", + r"i\. ?e\.", + r"i\. ?v\.", + r"vs\.", + r"cf\.", + r"Dr\.", + r"Mr\.", + r"Ms\.", + r"Mrs\.", + r"Prof\.", + r"Ph\.?D\.", + r"Jr\.", + r"St\.", + r"Mt\.", + r"etc\.", + r"Fig\.", + r"vol\.", + r"Vols\.", + r"no\.", + r"Nos\.", + r"et\.", + r"al\.", + r"i\. ?v\.", + r"inc\.", + r"Ltd\.", + r"Co\.", + r"Corp\.", + r"Dept\.", + r"est\.", + r"Asst\.", + r"approx\.", + r"dr\.", + r"fig\.", + r"mr\.", + r"mrs\.", + r"ms\.", + r"prof\.", + r"rep\.", + r"jr\.", + r"sen\.", + r"st\.", + r"vs\.", + r"i\. ?e\.", + ] + for abbr in abbreviations: + sentences = re.sub(r"(\b" + abbr + r")\n", r"\1 ", sentences) + + return sentences + + +# Original split sentences function from rulebased_split_sentences +def split_sentences(text): + text = re.sub(r"([?!.])\s", r"\1\n", text) + text = postproc_splits(text) + return text.split("\n") From 6743df2e7c3a58bf30efbee7c99faef5b652c627 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Fri, 27 Sep 2024 16:16:25 -0700 Subject: [PATCH 21/71] Added new version of split_sentence_str using new rule based sentence tokenization --- guardrails/validator_base.py | 43 ++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/guardrails/validator_base.py b/guardrails/validator_base.py index 4ef785d2b..7ad9d311d 100644 --- a/guardrails/validator_base.py +++ b/guardrails/validator_base.py @@ -4,11 +4,13 @@ # - [ ] Remove validator_base.py in 0.6.x import asyncio +import contextlib from functools import partial import inspect import logging from collections import defaultdict from dataclasses import dataclass +import re from string import Template from typing import Any, Callable, Dict, List, Optional, Type, TypeVar, Union from typing_extensions import deprecated @@ -30,6 +32,7 @@ from guardrails.types.on_fail import OnFailAction from guardrails.utils.safe_get import safe_get from guardrails.utils.hub_telemetry_utils import HubTelemetry +from guardrails.utils.tokenization_utils import postproc_splits ### functions to get chunks ### @@ -41,6 +44,46 @@ def split_sentence_str(chunk: str): return [fragments[0] + ".", ".".join(fragments[1:])] +def split_sentence_str_v2(chunk: str): + """ + Use a sentence tokenizer to detect if at least one sentence is present in the chunk. + We return the first sentence and the remaining chunks without the first sentence. + + We perform the first step of WordTokenizers.jl's split_sentences function to + detect possible sentence boundaries before calling the sentence tokenizer. + + Args: + chunk (str): The text to split into sentences. + + Returns: + List[str]: A list of two strings. The first string is the first sentence + in the chunk. The second string is the remaining text in the chunk. + """ + # using the sentence tokenizer is expensive + # we check for a . to avoid wastefully calling the tokenizer + + # check at least 3 characters have been accumulated before splitting + is_minimum_length = False + with contextlib.suppress(IndexError): + chunk[2] + is_minimum_length = True + + # check for potential line endings, which is what split_sentences does + chunk_with_potential_line_endings, count = re.subn(r"([?!.])\s", r"\1\n", chunk) + any_potential_line_endings = count > 0 + if not is_minimum_length or not any_potential_line_endings: + return [] + + sentences = postproc_splits(chunk_with_potential_line_endings).split("\n") + # if not more than one sentence, we haven't accumulated enough for a validation + if len(sentences) <= 1: + return [] + + # return the sentence + # then the remaining chunks that aren't finished accumulating + return [sentences[0], "".join(sentences[1:])] + + # TODO ensure this is not indeed needed # def split_sentence_nltk(chunk: str): # """ From acae7379a5dff9698054d6e3c1a4ceb30a69161d Mon Sep 17 00:00:00 2001 From: Alejandro Date: Fri, 27 Sep 2024 16:41:55 -0700 Subject: [PATCH 22/71] updates to factor in quotes during sentence splitting --- guardrails/utils/tokenization_utils.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/guardrails/utils/tokenization_utils.py b/guardrails/utils/tokenization_utils.py index aef63e783..d6ccabac0 100644 --- a/guardrails/utils/tokenization_utils.py +++ b/guardrails/utils/tokenization_utils.py @@ -57,6 +57,14 @@ def postproc_splits(sentences): sentences, r"\(([^\(\)]{0,250})\n([^\(\)]{0,250})\)", r"(\1 \2)" ) + # Guardrails mods for line breaks within quotes + sentences = replace_til_no_change( + sentences, r'"([^"\n]{0,250})\n([^"\n]{0,250})"', r'"\1 \2"' + ) + sentences = replace_til_no_change( + sentences, r"'([^'\n]{0,250})\n([^'\n]{0,250})'", r"'\1 \2'" + ) + # Nesting to depth one sentences = replace_til_no_change( sentences, From 815300f7057233d57d83a4e84648862161109ea0 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Fri, 27 Sep 2024 16:49:23 -0700 Subject: [PATCH 23/71] updated poetry.lock --- poetry.lock | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4d5e43f7f..aae967a0a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2716,7 +2716,7 @@ files = [ name = "joblib" version = "1.4.2" description = "Lightweight pipelining with Python functions" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, @@ -4335,31 +4335,6 @@ files = [ {file = "nh3-0.2.17.tar.gz", hash = "sha256:40d0741a19c3d645e54efba71cb0d8c475b59135c1e3c580f879ad5514cbf028"}, ] -[[package]] -name = "nltk" -version = "3.8.1" -description = "Natural Language Toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, - {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, -] - -[package.dependencies] -click = "*" -joblib = "*" -regex = ">=2021.8.3" -tqdm = "*" - -[package.extras] -all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] -corenlp = ["requests"] -machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] -plot = ["matplotlib"] -tgrep = ["pyparsing"] -twitter = ["twython"] - [[package]] name = "nodeenv" version = "1.9.1" @@ -8430,4 +8405,4 @@ vectordb = ["faiss-cpu", "numpy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "25d043e207ef2c57ecc4c4cb6fb288ecccea69cc1f2e7894f3c56e7919f17a43" +content-hash = "97c2443e924bdc7c4cae794518c80bba648efd3144740717e412ebb907f1e092" From 1a2546a572c349696d7213ed093f2f6a7322ee5e Mon Sep 17 00:00:00 2001 From: Alejandro Date: Fri, 27 Sep 2024 16:52:27 -0700 Subject: [PATCH 24/71] replaced split sentence default --- guardrails/validator_base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guardrails/validator_base.py b/guardrails/validator_base.py index 7ad9d311d..6d67bd0d9 100644 --- a/guardrails/validator_base.py +++ b/guardrails/validator_base.py @@ -44,7 +44,7 @@ def split_sentence_str(chunk: str): return [fragments[0] + ".", ".".join(fragments[1:])] -def split_sentence_str_v2(chunk: str): +def split_sentence_word_tokenizers_jl(chunk: str): """ Use a sentence tokenizer to detect if at least one sentence is present in the chunk. We return the first sentence and the remaining chunks without the first sentence. @@ -303,7 +303,7 @@ def _chunking_function(self, chunk: str) -> List[str]: Returns: list[str]: The text chunked into some subset. """ - return split_sentence_str(chunk) + return split_sentence_word_tokenizers_jl(chunk) def validate_stream( self, chunk: Any, metadata: Dict[str, Any], **kwargs From bd0ab50d282839a852052bc01d6a030634448cda Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 1 Oct 2024 12:10:50 -0700 Subject: [PATCH 25/71] testing changes using custom separator in wordtokenizer algo --- guardrails/utils/tokenization_utils.py | 98 ++++++++++++++++---------- guardrails/validator_base.py | 14 ++-- 2 files changed, 71 insertions(+), 41 deletions(-) diff --git a/guardrails/utils/tokenization_utils.py b/guardrails/utils/tokenization_utils.py index d6ccabac0..3e9777236 100644 --- a/guardrails/utils/tokenization_utils.py +++ b/guardrails/utils/tokenization_utils.py @@ -8,12 +8,15 @@ def replace_til_no_change(input_text, pattern, replacement): - while re.search(pattern, input_text): - input_text = re.sub(pattern, replacement, input_text) + while True: + new_text = re.sub(pattern, replacement, input_text) + if new_text == input_text: + break + input_text = new_text return input_text -def postproc_splits(sentences): +def postproc_splits(sentences, separator): """ Applies heuristic rules to repair sentence splitting errors. Developed for use as postprocessing for the GENIA sentence @@ -30,63 +33,83 @@ def postproc_splits(sentences): Which draws in part on heuristics included in Yoshimasa Tsuruoka's medss.pl script. """ + # Remove Windows line endings sentences = sentences.replace("\r", "") # Breaks sometimes missing after "?", "safe" cases - sentences = re.sub(r"\b([a-z]+\?) ([A-Z][a-z]+)\b", r"\1\n\2", sentences) - # Breaks sometimes missing after "." separated with extra space, "safe" cases - sentences = re.sub(r"\b([a-z]+ \.) ([A-Z][a-z]+)\b", r"\1\n\2", sentences) + sentences = re.sub( + r"\b([a-z]+\?)\s+([A-Z][a-z]+)\b", rf"\1{separator}\2", sentences + ) + # Breaks sometimes missing after ".", "safe" cases + sentences = re.sub( + r"\b([a-z]+ \.)\s+([A-Z][a-z]+)\b", rf"\1{separator}\2", sentences + ) # No breaks producing lines only containing sentence-ending punctuation - sentences = re.sub(r"\n([.!?]+)\n", r"\1\n", sentences) + sentences = re.sub(rf"{separator}([.!?]+){separator}", r"\1" + separator, sentences) # No breaks inside parentheses/brackets - # Unlimited length for no intervening parentheses/brackets sentences = replace_til_no_change( - sentences, r"\[([^\[\]\(\)]*)\n([^\[\]\(\)]*)\]", r"[\1 \2]" + sentences, + r"\[([^\[\]\(\)]*)" + re.escape(separator) + r"([^\[\]\(\)]*)\]", + r"[\1 \2]", ) sentences = replace_til_no_change( - sentences, r"\(([^\[\]\(\)]*)\n([^\[\]\(\)]*)\)", r"(\1 \2)" + sentences, + r"\(([^\[\]\(\)]*)" + re.escape(separator) + r"([^\[\]\(\)]*)\)", + r"(\1 \2)", ) # Standard mismatched with possible intervening sentences = replace_til_no_change( - sentences, r"\[([^\[\]]{0,250})\n([^\[\]]{0,250})\]", r"[\1 \2]" + sentences, + r"\[([^\[\]]{0,250})" + re.escape(separator) + r"([^\[\]]{0,250})\]", + r"[\1 \2]", ) sentences = replace_til_no_change( - sentences, r"\(([^\(\)]{0,250})\n([^\(\)]{0,250})\)", r"(\1 \2)" + sentences, + r"\(([^\(\)]{0,250})" + re.escape(separator) + r"([^\(\)]{0,250})\)", + r"(\1 \2)", ) - # Guardrails mods for line breaks within quotes + # Line breaks within quotes sentences = replace_til_no_change( - sentences, r'"([^"\n]{0,250})\n([^"\n]{0,250})"', r'"\1 \2"' + sentences, + r'"([^"\n]{0,250})' + re.escape(separator) + r'([^"\n]{0,250})"', + r'"\1 \2"', ) sentences = replace_til_no_change( - sentences, r"'([^'\n]{0,250})\n([^'\n]{0,250})'", r"'\1 \2'" + sentences, + r"'([^'\n]{0,250})" + re.escape(separator) + r"([^'\n]{0,250})'", + r"'\1 \2'", ) # Nesting to depth one sentences = replace_til_no_change( sentences, - r"\[((?:[^\[\]]|\[[^\[\]]*\]){0,250})\n((?:[^\[\]]|\[[^\[\]]*\]){0,250})\]", + r"\[((?:[^\[\]]|\[[^\[\]]*\]){0,250})" + + re.escape(separator) + + r"((?:[^\[\]]|\[[^\[\]]*\]){0,250})\]", r"[\1 \2]", ) sentences = replace_til_no_change( sentences, - r"\(((?:[^\(\)]|\([^\(\)]*\)){0,250})\n((?:[^\(\)]|\([^\(\)]*\)){0,250})\)", + r"\(((?:[^\(\)]|\([^\(\)]*\)){0,250})" + + re.escape(separator) + + r"((?:[^\(\)]|\([^\(\)]*\)){0,250})\)", r"(\1 \2)", ) # No break after periods followed by a non-uppercase "normal word" - sentences = re.sub(r"\.\n([a-z]{3}[a-z-]*[ .:,])", r". \1", sentences) + sentences = re.sub(rf"\.{separator}([a-z]{{3,}}[a-z-]*[ .:,])", r". \1", sentences) # No break after a single letter other than I - sentences = re.sub(r"(\b[A-HJ-Z]\.)\n", r"\1 ", sentences) + sentences = re.sub(rf"(\b[A-HJ-Z]\.){separator}", r"\1 ", sentences) # No break before coordinating conjunctions (CC) coordinating_conjunctions = ["and", "or", "but", "nor", "yet"] for cc in coordinating_conjunctions: - sentences = re.sub(r"\n(" + cc + r" )", r" \1", sentences) + sentences = re.sub(rf"{separator}({cc}\s)", r" \1", sentences) # No break before prepositions (IN) prepositions = [ @@ -115,18 +138,18 @@ def postproc_splits(sentences): "whether", ] for prep in prepositions: - sentences = re.sub(r"\n(" + prep + r" )", r" \1", sentences) + sentences = re.sub(rf"{separator}({prep}\s)", r" \1", sentences) # No sentence breaks in the middle of specific abbreviations - sentences = re.sub(r"(\be\.)\n(g\.)", r"\1 \2", sentences) - sentences = re.sub(r"(\bi\.)\n(e\.)", r"\1 \2", sentences) - sentences = re.sub(r"(\bi\.)\n(v\.)", r"\1 \2", sentences) + sentences = re.sub(rf"(\be\.){separator}(g\.)", r"\1 \2", sentences) + sentences = re.sub(rf"(\bi\.){separator}(e\.)", r"\1 \2", sentences) + sentences = re.sub(rf"(\bi\.){separator}(v\.)", r"\1 \2", sentences) # No sentence break after specific abbreviations abbreviations = [ - r"e\. ?g\.", - r"i\. ?e\.", - r"i\. ?v\.", + r"e\.?g\.", + r"i\.?e\.", + r"i\.?v\.", r"vs\.", r"cf\.", r"Dr\.", @@ -142,12 +165,11 @@ def postproc_splits(sentences): r"Fig\.", r"vol\.", r"Vols\.", - r"no\.", + r"No\.", r"Nos\.", r"et\.", r"al\.", - r"i\. ?v\.", - r"inc\.", + r"Inc\.", r"Ltd\.", r"Co\.", r"Corp\.", @@ -166,16 +188,18 @@ def postproc_splits(sentences): r"sen\.", r"st\.", r"vs\.", - r"i\. ?e\.", + r"i\.?e\.", ] for abbr in abbreviations: - sentences = re.sub(r"(\b" + abbr + r")\n", r"\1 ", sentences) + sentences = re.sub( + rf"(\b{abbr}){separator}", r"\1 ", sentences, flags=re.IGNORECASE + ) return sentences -# Original split sentences function from rulebased_split_sentences -def split_sentences(text): - text = re.sub(r"([?!.])\s", r"\1\n", text) - text = postproc_splits(text) - return text.split("\n") +def split_sentences(text, separator="SENTENCEBREAK"): + # Use the separator in the regex + text = re.sub(r"([?!.])(?=\s|$)", rf"\1{separator}", text) + text = postproc_splits(text, separator) + return re.split(rf"\n?{separator} ?\n?", text) diff --git a/guardrails/validator_base.py b/guardrails/validator_base.py index 6d67bd0d9..b1a51e390 100644 --- a/guardrails/validator_base.py +++ b/guardrails/validator_base.py @@ -44,7 +44,9 @@ def split_sentence_str(chunk: str): return [fragments[0] + ".", ".".join(fragments[1:])] -def split_sentence_word_tokenizers_jl(chunk: str): +def split_sentence_word_tokenizers_jl( + chunk: str, separator: str = "SENTENCEBREAK" +) -> List[str]: """ Use a sentence tokenizer to detect if at least one sentence is present in the chunk. We return the first sentence and the remaining chunks without the first sentence. @@ -69,12 +71,16 @@ def split_sentence_word_tokenizers_jl(chunk: str): is_minimum_length = True # check for potential line endings, which is what split_sentences does - chunk_with_potential_line_endings, count = re.subn(r"([?!.])\s", r"\1\n", chunk) - any_potential_line_endings = count > 0 + chunk_with_potential_line_endings, count = re.sub( + r"([?!.])(?=\s|$)", rf"\1{separator}", chunk + ) + any_potential_line_endings = int(count) > 0 if not is_minimum_length or not any_potential_line_endings: return [] - sentences = postproc_splits(chunk_with_potential_line_endings).split("\n") + sentences = postproc_splits(chunk_with_potential_line_endings, separator).split( + "\n" + ) # if not more than one sentence, we haven't accumulated enough for a validation if len(sentences) <= 1: return [] From 4ebef188b486e40d7fe15be109070e0e330fd65c Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 1 Oct 2024 12:16:05 -0700 Subject: [PATCH 26/71] fix for counting subs --- guardrails/validator_base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guardrails/validator_base.py b/guardrails/validator_base.py index b1a51e390..0ff5227f2 100644 --- a/guardrails/validator_base.py +++ b/guardrails/validator_base.py @@ -71,10 +71,10 @@ def split_sentence_word_tokenizers_jl( is_minimum_length = True # check for potential line endings, which is what split_sentences does - chunk_with_potential_line_endings, count = re.sub( + chunk_with_potential_line_endings, count = re.subn( r"([?!.])(?=\s|$)", rf"\1{separator}", chunk ) - any_potential_line_endings = int(count) > 0 + any_potential_line_endings = count > 0 if not is_minimum_length or not any_potential_line_endings: return [] From fb1d2d00665ecc75ad3895bba1e563e699797108 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 1 Oct 2024 12:24:37 -0700 Subject: [PATCH 27/71] reverted split sentence in validators base --- guardrails/validator_base.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/guardrails/validator_base.py b/guardrails/validator_base.py index 0ff5227f2..6d67bd0d9 100644 --- a/guardrails/validator_base.py +++ b/guardrails/validator_base.py @@ -44,9 +44,7 @@ def split_sentence_str(chunk: str): return [fragments[0] + ".", ".".join(fragments[1:])] -def split_sentence_word_tokenizers_jl( - chunk: str, separator: str = "SENTENCEBREAK" -) -> List[str]: +def split_sentence_word_tokenizers_jl(chunk: str): """ Use a sentence tokenizer to detect if at least one sentence is present in the chunk. We return the first sentence and the remaining chunks without the first sentence. @@ -71,16 +69,12 @@ def split_sentence_word_tokenizers_jl( is_minimum_length = True # check for potential line endings, which is what split_sentences does - chunk_with_potential_line_endings, count = re.subn( - r"([?!.])(?=\s|$)", rf"\1{separator}", chunk - ) + chunk_with_potential_line_endings, count = re.subn(r"([?!.])\s", r"\1\n", chunk) any_potential_line_endings = count > 0 if not is_minimum_length or not any_potential_line_endings: return [] - sentences = postproc_splits(chunk_with_potential_line_endings, separator).split( - "\n" - ) + sentences = postproc_splits(chunk_with_potential_line_endings).split("\n") # if not more than one sentence, we haven't accumulated enough for a validation if len(sentences) <= 1: return [] From 3fb5765696333f7e0e76c1f0b54a99bd01de267f Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 1 Oct 2024 13:11:32 -0700 Subject: [PATCH 28/71] reverted to pre-seperator algo, added fix for conditional white space after ?!. chars --- guardrails/utils/tokenization_utils.py | 98 ++++++++++---------------- 1 file changed, 37 insertions(+), 61 deletions(-) diff --git a/guardrails/utils/tokenization_utils.py b/guardrails/utils/tokenization_utils.py index 3e9777236..8331c6b67 100644 --- a/guardrails/utils/tokenization_utils.py +++ b/guardrails/utils/tokenization_utils.py @@ -8,15 +8,12 @@ def replace_til_no_change(input_text, pattern, replacement): - while True: - new_text = re.sub(pattern, replacement, input_text) - if new_text == input_text: - break - input_text = new_text + while re.search(pattern, input_text): + input_text = re.sub(pattern, replacement, input_text) return input_text -def postproc_splits(sentences, separator): +def postproc_splits(sentences): """ Applies heuristic rules to repair sentence splitting errors. Developed for use as postprocessing for the GENIA sentence @@ -33,83 +30,63 @@ def postproc_splits(sentences, separator): Which draws in part on heuristics included in Yoshimasa Tsuruoka's medss.pl script. """ - # Remove Windows line endings sentences = sentences.replace("\r", "") # Breaks sometimes missing after "?", "safe" cases - sentences = re.sub( - r"\b([a-z]+\?)\s+([A-Z][a-z]+)\b", rf"\1{separator}\2", sentences - ) - # Breaks sometimes missing after ".", "safe" cases - sentences = re.sub( - r"\b([a-z]+ \.)\s+([A-Z][a-z]+)\b", rf"\1{separator}\2", sentences - ) + sentences = re.sub(r"\b([a-z]+\?) ([A-Z][a-z]+)\b", r"\1\n\2", sentences) + # Breaks sometimes missing after "." separated with extra space, "safe" cases + sentences = re.sub(r"\b([a-z]+ \.) ([A-Z][a-z]+)\b", r"\1\n\2", sentences) # No breaks producing lines only containing sentence-ending punctuation - sentences = re.sub(rf"{separator}([.!?]+){separator}", r"\1" + separator, sentences) + sentences = re.sub(r"\n([.!?]+)\n", r"\1\n", sentences) # No breaks inside parentheses/brackets + # Unlimited length for no intervening parentheses/brackets sentences = replace_til_no_change( - sentences, - r"\[([^\[\]\(\)]*)" + re.escape(separator) + r"([^\[\]\(\)]*)\]", - r"[\1 \2]", + sentences, r"\[([^\[\]\(\)]*)\n([^\[\]\(\)]*)\]", r"[\1 \2]" ) sentences = replace_til_no_change( - sentences, - r"\(([^\[\]\(\)]*)" + re.escape(separator) + r"([^\[\]\(\)]*)\)", - r"(\1 \2)", + sentences, r"\(([^\[\]\(\)]*)\n([^\[\]\(\)]*)\)", r"(\1 \2)" ) # Standard mismatched with possible intervening sentences = replace_til_no_change( - sentences, - r"\[([^\[\]]{0,250})" + re.escape(separator) + r"([^\[\]]{0,250})\]", - r"[\1 \2]", + sentences, r"\[([^\[\]]{0,250})\n([^\[\]]{0,250})\]", r"[\1 \2]" ) sentences = replace_til_no_change( - sentences, - r"\(([^\(\)]{0,250})" + re.escape(separator) + r"([^\(\)]{0,250})\)", - r"(\1 \2)", + sentences, r"\(([^\(\)]{0,250})\n([^\(\)]{0,250})\)", r"(\1 \2)" ) - # Line breaks within quotes + # Guardrails mods for line breaks within quotes sentences = replace_til_no_change( - sentences, - r'"([^"\n]{0,250})' + re.escape(separator) + r'([^"\n]{0,250})"', - r'"\1 \2"', + sentences, r'"([^"\n]{0,250})\n([^"\n]{0,250})"', r'"\1 \2"' ) sentences = replace_til_no_change( - sentences, - r"'([^'\n]{0,250})" + re.escape(separator) + r"([^'\n]{0,250})'", - r"'\1 \2'", + sentences, r"'([^'\n]{0,250})\n([^'\n]{0,250})'", r"'\1 \2'" ) # Nesting to depth one sentences = replace_til_no_change( sentences, - r"\[((?:[^\[\]]|\[[^\[\]]*\]){0,250})" - + re.escape(separator) - + r"((?:[^\[\]]|\[[^\[\]]*\]){0,250})\]", + r"\[((?:[^\[\]]|\[[^\[\]]*\]){0,250})\n((?:[^\[\]]|\[[^\[\]]*\]){0,250})\]", r"[\1 \2]", ) sentences = replace_til_no_change( sentences, - r"\(((?:[^\(\)]|\([^\(\)]*\)){0,250})" - + re.escape(separator) - + r"((?:[^\(\)]|\([^\(\)]*\)){0,250})\)", + r"\(((?:[^\(\)]|\([^\(\)]*\)){0,250})\n((?:[^\(\)]|\([^\(\)]*\)){0,250})\)", r"(\1 \2)", ) # No break after periods followed by a non-uppercase "normal word" - sentences = re.sub(rf"\.{separator}([a-z]{{3,}}[a-z-]*[ .:,])", r". \1", sentences) + sentences = re.sub(r"\.\n([a-z]{3}[a-z-]*[ .:,])", r". \1", sentences) # No break after a single letter other than I - sentences = re.sub(rf"(\b[A-HJ-Z]\.){separator}", r"\1 ", sentences) + sentences = re.sub(r"(\b[A-HJ-Z]\.)\n", r"\1 ", sentences) # No break before coordinating conjunctions (CC) coordinating_conjunctions = ["and", "or", "but", "nor", "yet"] for cc in coordinating_conjunctions: - sentences = re.sub(rf"{separator}({cc}\s)", r" \1", sentences) + sentences = re.sub(r"\n(" + cc + r" )", r" \1", sentences) # No break before prepositions (IN) prepositions = [ @@ -138,18 +115,18 @@ def postproc_splits(sentences, separator): "whether", ] for prep in prepositions: - sentences = re.sub(rf"{separator}({prep}\s)", r" \1", sentences) + sentences = re.sub(r"\n(" + prep + r" )", r" \1", sentences) # No sentence breaks in the middle of specific abbreviations - sentences = re.sub(rf"(\be\.){separator}(g\.)", r"\1 \2", sentences) - sentences = re.sub(rf"(\bi\.){separator}(e\.)", r"\1 \2", sentences) - sentences = re.sub(rf"(\bi\.){separator}(v\.)", r"\1 \2", sentences) + sentences = re.sub(r"(\be\.)\n(g\.)", r"\1 \2", sentences) + sentences = re.sub(r"(\bi\.)\n(e\.)", r"\1 \2", sentences) + sentences = re.sub(r"(\bi\.)\n(v\.)", r"\1 \2", sentences) # No sentence break after specific abbreviations abbreviations = [ - r"e\.?g\.", - r"i\.?e\.", - r"i\.?v\.", + r"e\. ?g\.", + r"i\. ?e\.", + r"i\. ?v\.", r"vs\.", r"cf\.", r"Dr\.", @@ -165,11 +142,12 @@ def postproc_splits(sentences, separator): r"Fig\.", r"vol\.", r"Vols\.", - r"No\.", + r"no\.", r"Nos\.", r"et\.", r"al\.", - r"Inc\.", + r"i\. ?v\.", + r"inc\.", r"Ltd\.", r"Co\.", r"Corp\.", @@ -188,18 +166,16 @@ def postproc_splits(sentences, separator): r"sen\.", r"st\.", r"vs\.", - r"i\.?e\.", + r"i\. ?e\.", ] for abbr in abbreviations: - sentences = re.sub( - rf"(\b{abbr}){separator}", r"\1 ", sentences, flags=re.IGNORECASE - ) + sentences = re.sub(r"(\b" + abbr + r")\n", r"\1 ", sentences) return sentences -def split_sentences(text, separator="SENTENCEBREAK"): - # Use the separator in the regex - text = re.sub(r"([?!.])(?=\s|$)", rf"\1{separator}", text) - text = postproc_splits(text, separator) - return re.split(rf"\n?{separator} ?\n?", text) +# Original split sentences function from rulebased_split_sentences +def split_sentences(text): + text = re.sub(r"([?!.])(\s)?", r"\1\n", text) + text = postproc_splits(text) + return text.split("\n") From f453ecc8b36a4ed1ac0cbd9035ec2f888456b17b Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 1 Oct 2024 13:11:51 -0700 Subject: [PATCH 29/71] fix for optional white space after potential line endings ?!. --- guardrails/validator_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guardrails/validator_base.py b/guardrails/validator_base.py index 6d67bd0d9..e50d138d8 100644 --- a/guardrails/validator_base.py +++ b/guardrails/validator_base.py @@ -69,7 +69,7 @@ def split_sentence_word_tokenizers_jl(chunk: str): is_minimum_length = True # check for potential line endings, which is what split_sentences does - chunk_with_potential_line_endings, count = re.subn(r"([?!.])\s", r"\1\n", chunk) + chunk_with_potential_line_endings, count = re.subn(r"([?!.])(\s)?", r"\1\n", chunk) any_potential_line_endings = count > 0 if not is_minimum_length or not any_potential_line_endings: return [] From 6462558c0921bd654b4bdef046adc3499c7a6658 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 1 Oct 2024 13:52:14 -0700 Subject: [PATCH 30/71] added back modified seperator algo, fix for split sentence --- .../utils/tokenization_utils_seperator.py | 205 ++++++++++++++++++ guardrails/validator_base.py | 54 ++++- 2 files changed, 257 insertions(+), 2 deletions(-) create mode 100644 guardrails/utils/tokenization_utils_seperator.py diff --git a/guardrails/utils/tokenization_utils_seperator.py b/guardrails/utils/tokenization_utils_seperator.py new file mode 100644 index 000000000..4ed266490 --- /dev/null +++ b/guardrails/utils/tokenization_utils_seperator.py @@ -0,0 +1,205 @@ +# This file contains code adapted from the WordTokenizers.jl +# https://github.com/JuliaText/WordTokenizers.jl project. +# It is subject to the license terms in the Apache License file +# found in the top-level directory of this distribution. +# This file has been modified by Guardrails AI on September 27 2024. + +import re + + +def replace_til_no_change(input_text, pattern, replacement): + while True: + new_text = re.sub(pattern, replacement, input_text) + if new_text == input_text: + break + input_text = new_text + return input_text + + +def postproc_splits(sentences, separator): + """ + Applies heuristic rules to repair sentence splitting errors. + Developed for use as postprocessing for the GENIA sentence + splitter on PubMed abstracts, with minor tweaks for + full-text documents. + + `sentences` should be a string, with line breaks on sentence boundaries. + Returns a similar string, but more correct. + + Based on + https://github.com/ninjin/geniass/blob/master/geniass-postproc.pl + Which is + (c) 2010 Sampo Pyysalo. No rights reserved, i.e. do whatever you like with this. + Which draws in part on heuristics included in Yoshimasa Tsuruoka's + medss.pl script. + """ + + # Remove Windows line endings + sentences = sentences.replace("\r", "") + + # Breaks sometimes missing after "?", "safe" cases + sentences = re.sub( + r"\b([a-z]+\?)\s+([A-Z][a-z]+)\b", rf"\1{separator}\2", sentences + ) + # Breaks sometimes missing after ".", "safe" cases + sentences = re.sub( + r"\b([a-z]+ \.)\s+([A-Z][a-z]+)\b", rf"\1{separator}\2", sentences + ) + + # No breaks producing lines only containing sentence-ending punctuation + sentences = re.sub(rf"{separator}([.!?]+){separator}", r"\1" + separator, sentences) + + # No breaks inside parentheses/brackets + sentences = replace_til_no_change( + sentences, + r"\[([^\[\]\(\)]*)" + re.escape(separator) + r"([^\[\]\(\)]*)\]", + r"[\1 \2]", + ) + sentences = replace_til_no_change( + sentences, + r"\(([^\[\]\(\)]*)" + re.escape(separator) + r"([^\[\]\(\)]*)\)", + r"(\1 \2)", + ) + # Standard mismatched with possible intervening + sentences = replace_til_no_change( + sentences, + r"\[([^\[\]]{0,250})" + re.escape(separator) + r"([^\[\]]{0,250})\]", + r"[\1 \2]", + ) + sentences = replace_til_no_change( + sentences, + r"\(([^\(\)]{0,250})" + re.escape(separator) + r"([^\(\)]{0,250})\)", + r"(\1 \2)", + ) + + # Line breaks within quotes + sentences = replace_til_no_change( + sentences, + r'"([^"\n]{0,250})' + re.escape(separator) + r'([^"\n]{0,250})"', + r'"\1 \2"', + ) + sentences = replace_til_no_change( + sentences, + r"'([^'\n]{0,250})" + re.escape(separator) + r"([^'\n]{0,250})'", + r"'\1 \2'", + ) + + # Nesting to depth one + sentences = replace_til_no_change( + sentences, + r"\[((?:[^\[\]]|\[[^\[\]]*\]){0,250})" + + re.escape(separator) + + r"((?:[^\[\]]|\[[^\[\]]*\]){0,250})\]", + r"[\1 \2]", + ) + sentences = replace_til_no_change( + sentences, + r"\(((?:[^\(\)]|\([^\(\)]*\)){0,250})" + + re.escape(separator) + + r"((?:[^\(\)]|\([^\(\)]*\)){0,250})\)", + r"(\1 \2)", + ) + + # No break after periods followed by a non-uppercase "normal word" + sentences = re.sub(rf"\.{separator}([a-z]{{3,}}[a-z-]*[ .:,])", r". \1", sentences) + + # No break after a single letter other than I + sentences = re.sub(rf"(\b[A-HJ-Z]\.){separator}", r"\1 ", sentences) + + # No break before coordinating conjunctions (CC) + coordinating_conjunctions = ["and", "or", "but", "nor", "yet"] + for cc in coordinating_conjunctions: + sentences = re.sub(rf"{separator}({cc}\s)", r" \1", sentences) + + # No break before prepositions (IN) + prepositions = [ + "of", + "in", + "by", + "as", + "on", + "at", + "to", + "via", + "for", + "with", + "that", + "than", + "from", + "into", + "upon", + "after", + "while", + "during", + "within", + "through", + "between", + "whereas", + "whether", + ] + for prep in prepositions: + sentences = re.sub(rf"{separator}({prep}\s)", r" \1", sentences) + + # No sentence breaks in the middle of specific abbreviations + sentences = re.sub(rf"(\be\.){separator}(g\.)", r"\1 \2", sentences) + sentences = re.sub(rf"(\bi\.){separator}(e\.)", r"\1 \2", sentences) + sentences = re.sub(rf"(\bi\.){separator}(v\.)", r"\1 \2", sentences) + + # No sentence break after specific abbreviations + abbreviations = [ + r"e\.?g\.", + r"i\.?e\.", + r"i\.?v\.", + r"vs\.", + r"cf\.", + r"Dr\.", + r"Mr\.", + r"Ms\.", + r"Mrs\.", + r"Prof\.", + r"Ph\.?D\.", + r"Jr\.", + r"St\.", + r"Mt\.", + r"etc\.", + r"Fig\.", + r"vol\.", + r"Vols\.", + r"No\.", + r"Nos\.", + r"et\.", + r"al\.", + r"Inc\.", + r"Ltd\.", + r"Co\.", + r"Corp\.", + r"Dept\.", + r"est\.", + r"Asst\.", + r"approx\.", + r"dr\.", + r"fig\.", + r"mr\.", + r"mrs\.", + r"ms\.", + r"prof\.", + r"rep\.", + r"jr\.", + r"sen\.", + r"st\.", + r"vs\.", + r"i\.?e\.", + ] + for abbr in abbreviations: + sentences = re.sub( + rf"(\b{abbr}){separator}", r"\1", sentences, flags=re.IGNORECASE + ) + + return sentences + + +def split_sentences(text, separator="abcdsentenceseperatordcba"): + # Use the separator in the regex + text = re.sub(r"([?!.])(?=\s|$)", rf"\1{separator}", text) + text = postproc_splits(text, separator) + return re.split(rf"\n?{separator} ?\n?", text) diff --git a/guardrails/validator_base.py b/guardrails/validator_base.py index e50d138d8..4cbbaa6c1 100644 --- a/guardrails/validator_base.py +++ b/guardrails/validator_base.py @@ -33,6 +33,9 @@ from guardrails.utils.safe_get import safe_get from guardrails.utils.hub_telemetry_utils import HubTelemetry from guardrails.utils.tokenization_utils import postproc_splits +from guardrails.utils.tokenization_utils_seperator import ( + postproc_splits as postproc_splits_separator, +) ### functions to get chunks ### @@ -44,6 +47,51 @@ def split_sentence_str(chunk: str): return [fragments[0] + ".", ".".join(fragments[1:])] +def split_sentence_word_tokenizers_jl_separator( + chunk: str, separator: str = "abcdsentenceseperatordcba" +): + """ + Use a sentence tokenizer to detect if at least one sentence is present in the chunk. + We return the first sentence and the remaining chunks without the first sentence. + + We perform the first step of WordTokenizers.jl's split_sentences function to + detect possible sentence boundaries before calling the sentence tokenizer. + + Args: + chunk (str): The text to split into sentences. + + Returns: + List[str]: A list of two strings. The first string is the first sentence + in the chunk. The second string is the remaining text in the chunk. + """ + # using the sentence tokenizer is expensive + # we check for a . to avoid wastefully calling the tokenizer + + # check at least 3 characters have been accumulated before splitting + is_minimum_length = False + with contextlib.suppress(IndexError): + chunk[2] + is_minimum_length = True + + # check for potential line endings, which is what split_sentences does + chunk_with_potential_line_endings, count = re.subn( + r"([?!.])\s?", rf"\1{separator}", chunk + ) + any_potential_line_endings = count > 0 + if not is_minimum_length or not any_potential_line_endings: + return [] + + sentences = postproc_splits_separator(chunk_with_potential_line_endings, separator) + sentences = re.split(rf"\n?{separator} ?\n?", sentences) + # if not more than one sentence, we haven't accumulated enough for a validation + if len(sentences) <= 1: + return [] + + # return the sentence + # then the remaining chunks that aren't finished accumulating + return [sentences[0], "".join(sentences[1:])] + + def split_sentence_word_tokenizers_jl(chunk: str): """ Use a sentence tokenizer to detect if at least one sentence is present in the chunk. @@ -69,7 +117,9 @@ def split_sentence_word_tokenizers_jl(chunk: str): is_minimum_length = True # check for potential line endings, which is what split_sentences does - chunk_with_potential_line_endings, count = re.subn(r"([?!.])(\s)?", r"\1\n", chunk) + chunk_with_potential_line_endings, count = re.subn( + r"([?!.])(?=\s|$)", r"\1\n", chunk + ) any_potential_line_endings = count > 0 if not is_minimum_length or not any_potential_line_endings: return [] @@ -303,7 +353,7 @@ def _chunking_function(self, chunk: str) -> List[str]: Returns: list[str]: The text chunked into some subset. """ - return split_sentence_word_tokenizers_jl(chunk) + return split_sentence_word_tokenizers_jl_separator(chunk) def validate_stream( self, chunk: Any, metadata: Dict[str, Any], **kwargs From 6f8b1755b91654e14719157a524a12c86f5fd2eb Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 1 Oct 2024 14:27:24 -0700 Subject: [PATCH 31/71] Fix regex patterns for abbreviations in tokenization_utils_seperator.py --- guardrails/utils/tokenization_utils_seperator.py | 13 +++++++------ guardrails/validator_base.py | 2 +- tests/integration_tests/test_streaming.py | 3 +-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/guardrails/utils/tokenization_utils_seperator.py b/guardrails/utils/tokenization_utils_seperator.py index 4ed266490..6dab87cdd 100644 --- a/guardrails/utils/tokenization_utils_seperator.py +++ b/guardrails/utils/tokenization_utils_seperator.py @@ -147,9 +147,9 @@ def postproc_splits(sentences, separator): # No sentence break after specific abbreviations abbreviations = [ - r"e\.?g\.", - r"i\.?e\.", - r"i\.?v\.", + r"e\. ?g\.", + r"i\. ?e\.", + r"i\. ?v\.", r"vs\.", r"cf\.", r"Dr\.", @@ -165,11 +165,12 @@ def postproc_splits(sentences, separator): r"Fig\.", r"vol\.", r"Vols\.", - r"No\.", + r"no\.", r"Nos\.", r"et\.", r"al\.", - r"Inc\.", + r"i\. ?v\.", + r"inc\.", r"Ltd\.", r"Co\.", r"Corp\.", @@ -188,7 +189,7 @@ def postproc_splits(sentences, separator): r"sen\.", r"st\.", r"vs\.", - r"i\.?e\.", + r"i\. ?e\.", ] for abbr in abbreviations: sentences = re.sub( diff --git a/guardrails/validator_base.py b/guardrails/validator_base.py index 4cbbaa6c1..fc17e5095 100644 --- a/guardrails/validator_base.py +++ b/guardrails/validator_base.py @@ -75,7 +75,7 @@ def split_sentence_word_tokenizers_jl_separator( # check for potential line endings, which is what split_sentences does chunk_with_potential_line_endings, count = re.subn( - r"([?!.])\s?", rf"\1{separator}", chunk + r"([?!.])(?=\s|$)", rf"\1{separator}", chunk ) any_potential_line_endings = count > 0 if not is_minimum_length or not any_potential_line_endings: diff --git a/tests/integration_tests/test_streaming.py b/tests/integration_tests/test_streaming.py index 9ae025146..0a7a5793d 100644 --- a/tests/integration_tests/test_streaming.py +++ b/tests/integration_tests/test_streaming.py @@ -584,8 +584,7 @@ def test_fix_behavior_three_validators(mocker): assert ( text == """"REDACTED!!, under purple!! bridges, roams, - hills, his home. -dreams of fog, and salty air, + hills, his home.dreams of fog, and salty air, in his heart, he's always there.""" ) assert ( From 27a0419941ccc5d9a66191376f32b992f4d999af Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 1 Oct 2024 14:33:51 -0700 Subject: [PATCH 32/71] fix tests --- tests/integration_tests/test_streaming.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/integration_tests/test_streaming.py b/tests/integration_tests/test_streaming.py index 0a7a5793d..cc3d92181 100644 --- a/tests/integration_tests/test_streaming.py +++ b/tests/integration_tests/test_streaming.py @@ -487,8 +487,7 @@ def test_fix_behavior_one_validator(mocker): assert ( text == """"john, under golden bridges, roams, -san francisco's hills, his home. -dreams of fog, and salty air, +san francisco's hills, his home.dreams of fog, and salty air, in his heart, he's always there.""" ) assert ( @@ -530,8 +529,7 @@ def test_fix_behavior_two_validators(mocker): assert ( text == """", under golden bridges, roams, - hills, his home. -dreams of fog, and salty air, + hills, his home.dreams of fog, and salty air, in his heart, he's always there.""" ) assert ( From 49aa02db6eeea7a411ea88574abfcbc68d5ed870 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 1 Oct 2024 14:41:37 -0700 Subject: [PATCH 33/71] remove nltk references from tests --- tests/unit_tests/classes/test_rc.py | 5 ----- tests/unit_tests/cli/test_configure.py | 5 ----- tests/unit_tests/cli/test_validate.py | 3 --- 3 files changed, 13 deletions(-) diff --git a/tests/unit_tests/classes/test_rc.py b/tests/unit_tests/classes/test_rc.py index fb71471f0..3ade2e8a7 100644 --- a/tests/unit_tests/classes/test_rc.py +++ b/tests/unit_tests/classes/test_rc.py @@ -4,11 +4,6 @@ class TestRC: def test_load(self, mocker): - # TODO: Re-enable this once we move nltk.download calls to individual validator repos. # noqa - # Right now, it fires during our import chain, causing this to blow up - mocker.patch("nltk.data.find") - mocker.patch("nltk.download") - expanduser_mock = mocker.patch("guardrails.classes.rc.expanduser") expanduser_mock.return_value = "/Home" diff --git a/tests/unit_tests/cli/test_configure.py b/tests/unit_tests/cli/test_configure.py index fc043462f..62446c871 100644 --- a/tests/unit_tests/cli/test_configure.py +++ b/tests/unit_tests/cli/test_configure.py @@ -61,11 +61,6 @@ def test_configure(mocker, runner, expected_token, enable_metrics, clear_token): def test_save_configuration_file(mocker): - # TODO: Re-enable this once we move nltk.download calls to individual validator repos. # noqa - # Right now, it fires during our import chain, causing this to blow up - mocker.patch("nltk.data.find") - mocker.patch("nltk.download") - expanduser_mock = mocker.patch("guardrails.cli.configure.expanduser") expanduser_mock.return_value = "/Home" diff --git a/tests/unit_tests/cli/test_validate.py b/tests/unit_tests/cli/test_validate.py index 1368c2ef7..2235009e7 100644 --- a/tests/unit_tests/cli/test_validate.py +++ b/tests/unit_tests/cli/test_validate.py @@ -2,9 +2,6 @@ def test_validate(mocker): - mocker.patch("nltk.data.find") - mocker.patch("nltk.download") - mock_validate_llm_output = mocker.patch( "guardrails.cli.validate.validate_llm_output" ) From affb2056baf0759ad0856244d31dfac6ef7ad41c Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 1 Oct 2024 14:51:42 -0700 Subject: [PATCH 34/71] removed older scripts --- guardrails/utils/tokenization_utils.py | 85 +++++--- .../utils/tokenization_utils_seperator.py | 206 ------------------ guardrails/validator_base.py | 70 +----- 3 files changed, 58 insertions(+), 303 deletions(-) delete mode 100644 guardrails/utils/tokenization_utils_seperator.py diff --git a/guardrails/utils/tokenization_utils.py b/guardrails/utils/tokenization_utils.py index 8331c6b67..6dab87cdd 100644 --- a/guardrails/utils/tokenization_utils.py +++ b/guardrails/utils/tokenization_utils.py @@ -8,12 +8,15 @@ def replace_til_no_change(input_text, pattern, replacement): - while re.search(pattern, input_text): - input_text = re.sub(pattern, replacement, input_text) + while True: + new_text = re.sub(pattern, replacement, input_text) + if new_text == input_text: + break + input_text = new_text return input_text -def postproc_splits(sentences): +def postproc_splits(sentences, separator): """ Applies heuristic rules to repair sentence splitting errors. Developed for use as postprocessing for the GENIA sentence @@ -30,63 +33,83 @@ def postproc_splits(sentences): Which draws in part on heuristics included in Yoshimasa Tsuruoka's medss.pl script. """ + # Remove Windows line endings sentences = sentences.replace("\r", "") # Breaks sometimes missing after "?", "safe" cases - sentences = re.sub(r"\b([a-z]+\?) ([A-Z][a-z]+)\b", r"\1\n\2", sentences) - # Breaks sometimes missing after "." separated with extra space, "safe" cases - sentences = re.sub(r"\b([a-z]+ \.) ([A-Z][a-z]+)\b", r"\1\n\2", sentences) + sentences = re.sub( + r"\b([a-z]+\?)\s+([A-Z][a-z]+)\b", rf"\1{separator}\2", sentences + ) + # Breaks sometimes missing after ".", "safe" cases + sentences = re.sub( + r"\b([a-z]+ \.)\s+([A-Z][a-z]+)\b", rf"\1{separator}\2", sentences + ) # No breaks producing lines only containing sentence-ending punctuation - sentences = re.sub(r"\n([.!?]+)\n", r"\1\n", sentences) + sentences = re.sub(rf"{separator}([.!?]+){separator}", r"\1" + separator, sentences) # No breaks inside parentheses/brackets - # Unlimited length for no intervening parentheses/brackets sentences = replace_til_no_change( - sentences, r"\[([^\[\]\(\)]*)\n([^\[\]\(\)]*)\]", r"[\1 \2]" + sentences, + r"\[([^\[\]\(\)]*)" + re.escape(separator) + r"([^\[\]\(\)]*)\]", + r"[\1 \2]", ) sentences = replace_til_no_change( - sentences, r"\(([^\[\]\(\)]*)\n([^\[\]\(\)]*)\)", r"(\1 \2)" + sentences, + r"\(([^\[\]\(\)]*)" + re.escape(separator) + r"([^\[\]\(\)]*)\)", + r"(\1 \2)", ) # Standard mismatched with possible intervening sentences = replace_til_no_change( - sentences, r"\[([^\[\]]{0,250})\n([^\[\]]{0,250})\]", r"[\1 \2]" + sentences, + r"\[([^\[\]]{0,250})" + re.escape(separator) + r"([^\[\]]{0,250})\]", + r"[\1 \2]", ) sentences = replace_til_no_change( - sentences, r"\(([^\(\)]{0,250})\n([^\(\)]{0,250})\)", r"(\1 \2)" + sentences, + r"\(([^\(\)]{0,250})" + re.escape(separator) + r"([^\(\)]{0,250})\)", + r"(\1 \2)", ) - # Guardrails mods for line breaks within quotes + # Line breaks within quotes sentences = replace_til_no_change( - sentences, r'"([^"\n]{0,250})\n([^"\n]{0,250})"', r'"\1 \2"' + sentences, + r'"([^"\n]{0,250})' + re.escape(separator) + r'([^"\n]{0,250})"', + r'"\1 \2"', ) sentences = replace_til_no_change( - sentences, r"'([^'\n]{0,250})\n([^'\n]{0,250})'", r"'\1 \2'" + sentences, + r"'([^'\n]{0,250})" + re.escape(separator) + r"([^'\n]{0,250})'", + r"'\1 \2'", ) # Nesting to depth one sentences = replace_til_no_change( sentences, - r"\[((?:[^\[\]]|\[[^\[\]]*\]){0,250})\n((?:[^\[\]]|\[[^\[\]]*\]){0,250})\]", + r"\[((?:[^\[\]]|\[[^\[\]]*\]){0,250})" + + re.escape(separator) + + r"((?:[^\[\]]|\[[^\[\]]*\]){0,250})\]", r"[\1 \2]", ) sentences = replace_til_no_change( sentences, - r"\(((?:[^\(\)]|\([^\(\)]*\)){0,250})\n((?:[^\(\)]|\([^\(\)]*\)){0,250})\)", + r"\(((?:[^\(\)]|\([^\(\)]*\)){0,250})" + + re.escape(separator) + + r"((?:[^\(\)]|\([^\(\)]*\)){0,250})\)", r"(\1 \2)", ) # No break after periods followed by a non-uppercase "normal word" - sentences = re.sub(r"\.\n([a-z]{3}[a-z-]*[ .:,])", r". \1", sentences) + sentences = re.sub(rf"\.{separator}([a-z]{{3,}}[a-z-]*[ .:,])", r". \1", sentences) # No break after a single letter other than I - sentences = re.sub(r"(\b[A-HJ-Z]\.)\n", r"\1 ", sentences) + sentences = re.sub(rf"(\b[A-HJ-Z]\.){separator}", r"\1 ", sentences) # No break before coordinating conjunctions (CC) coordinating_conjunctions = ["and", "or", "but", "nor", "yet"] for cc in coordinating_conjunctions: - sentences = re.sub(r"\n(" + cc + r" )", r" \1", sentences) + sentences = re.sub(rf"{separator}({cc}\s)", r" \1", sentences) # No break before prepositions (IN) prepositions = [ @@ -115,12 +138,12 @@ def postproc_splits(sentences): "whether", ] for prep in prepositions: - sentences = re.sub(r"\n(" + prep + r" )", r" \1", sentences) + sentences = re.sub(rf"{separator}({prep}\s)", r" \1", sentences) # No sentence breaks in the middle of specific abbreviations - sentences = re.sub(r"(\be\.)\n(g\.)", r"\1 \2", sentences) - sentences = re.sub(r"(\bi\.)\n(e\.)", r"\1 \2", sentences) - sentences = re.sub(r"(\bi\.)\n(v\.)", r"\1 \2", sentences) + sentences = re.sub(rf"(\be\.){separator}(g\.)", r"\1 \2", sentences) + sentences = re.sub(rf"(\bi\.){separator}(e\.)", r"\1 \2", sentences) + sentences = re.sub(rf"(\bi\.){separator}(v\.)", r"\1 \2", sentences) # No sentence break after specific abbreviations abbreviations = [ @@ -169,13 +192,15 @@ def postproc_splits(sentences): r"i\. ?e\.", ] for abbr in abbreviations: - sentences = re.sub(r"(\b" + abbr + r")\n", r"\1 ", sentences) + sentences = re.sub( + rf"(\b{abbr}){separator}", r"\1", sentences, flags=re.IGNORECASE + ) return sentences -# Original split sentences function from rulebased_split_sentences -def split_sentences(text): - text = re.sub(r"([?!.])(\s)?", r"\1\n", text) - text = postproc_splits(text) - return text.split("\n") +def split_sentences(text, separator="abcdsentenceseperatordcba"): + # Use the separator in the regex + text = re.sub(r"([?!.])(?=\s|$)", rf"\1{separator}", text) + text = postproc_splits(text, separator) + return re.split(rf"\n?{separator} ?\n?", text) diff --git a/guardrails/utils/tokenization_utils_seperator.py b/guardrails/utils/tokenization_utils_seperator.py deleted file mode 100644 index 6dab87cdd..000000000 --- a/guardrails/utils/tokenization_utils_seperator.py +++ /dev/null @@ -1,206 +0,0 @@ -# This file contains code adapted from the WordTokenizers.jl -# https://github.com/JuliaText/WordTokenizers.jl project. -# It is subject to the license terms in the Apache License file -# found in the top-level directory of this distribution. -# This file has been modified by Guardrails AI on September 27 2024. - -import re - - -def replace_til_no_change(input_text, pattern, replacement): - while True: - new_text = re.sub(pattern, replacement, input_text) - if new_text == input_text: - break - input_text = new_text - return input_text - - -def postproc_splits(sentences, separator): - """ - Applies heuristic rules to repair sentence splitting errors. - Developed for use as postprocessing for the GENIA sentence - splitter on PubMed abstracts, with minor tweaks for - full-text documents. - - `sentences` should be a string, with line breaks on sentence boundaries. - Returns a similar string, but more correct. - - Based on - https://github.com/ninjin/geniass/blob/master/geniass-postproc.pl - Which is - (c) 2010 Sampo Pyysalo. No rights reserved, i.e. do whatever you like with this. - Which draws in part on heuristics included in Yoshimasa Tsuruoka's - medss.pl script. - """ - - # Remove Windows line endings - sentences = sentences.replace("\r", "") - - # Breaks sometimes missing after "?", "safe" cases - sentences = re.sub( - r"\b([a-z]+\?)\s+([A-Z][a-z]+)\b", rf"\1{separator}\2", sentences - ) - # Breaks sometimes missing after ".", "safe" cases - sentences = re.sub( - r"\b([a-z]+ \.)\s+([A-Z][a-z]+)\b", rf"\1{separator}\2", sentences - ) - - # No breaks producing lines only containing sentence-ending punctuation - sentences = re.sub(rf"{separator}([.!?]+){separator}", r"\1" + separator, sentences) - - # No breaks inside parentheses/brackets - sentences = replace_til_no_change( - sentences, - r"\[([^\[\]\(\)]*)" + re.escape(separator) + r"([^\[\]\(\)]*)\]", - r"[\1 \2]", - ) - sentences = replace_til_no_change( - sentences, - r"\(([^\[\]\(\)]*)" + re.escape(separator) + r"([^\[\]\(\)]*)\)", - r"(\1 \2)", - ) - # Standard mismatched with possible intervening - sentences = replace_til_no_change( - sentences, - r"\[([^\[\]]{0,250})" + re.escape(separator) + r"([^\[\]]{0,250})\]", - r"[\1 \2]", - ) - sentences = replace_til_no_change( - sentences, - r"\(([^\(\)]{0,250})" + re.escape(separator) + r"([^\(\)]{0,250})\)", - r"(\1 \2)", - ) - - # Line breaks within quotes - sentences = replace_til_no_change( - sentences, - r'"([^"\n]{0,250})' + re.escape(separator) + r'([^"\n]{0,250})"', - r'"\1 \2"', - ) - sentences = replace_til_no_change( - sentences, - r"'([^'\n]{0,250})" + re.escape(separator) + r"([^'\n]{0,250})'", - r"'\1 \2'", - ) - - # Nesting to depth one - sentences = replace_til_no_change( - sentences, - r"\[((?:[^\[\]]|\[[^\[\]]*\]){0,250})" - + re.escape(separator) - + r"((?:[^\[\]]|\[[^\[\]]*\]){0,250})\]", - r"[\1 \2]", - ) - sentences = replace_til_no_change( - sentences, - r"\(((?:[^\(\)]|\([^\(\)]*\)){0,250})" - + re.escape(separator) - + r"((?:[^\(\)]|\([^\(\)]*\)){0,250})\)", - r"(\1 \2)", - ) - - # No break after periods followed by a non-uppercase "normal word" - sentences = re.sub(rf"\.{separator}([a-z]{{3,}}[a-z-]*[ .:,])", r". \1", sentences) - - # No break after a single letter other than I - sentences = re.sub(rf"(\b[A-HJ-Z]\.){separator}", r"\1 ", sentences) - - # No break before coordinating conjunctions (CC) - coordinating_conjunctions = ["and", "or", "but", "nor", "yet"] - for cc in coordinating_conjunctions: - sentences = re.sub(rf"{separator}({cc}\s)", r" \1", sentences) - - # No break before prepositions (IN) - prepositions = [ - "of", - "in", - "by", - "as", - "on", - "at", - "to", - "via", - "for", - "with", - "that", - "than", - "from", - "into", - "upon", - "after", - "while", - "during", - "within", - "through", - "between", - "whereas", - "whether", - ] - for prep in prepositions: - sentences = re.sub(rf"{separator}({prep}\s)", r" \1", sentences) - - # No sentence breaks in the middle of specific abbreviations - sentences = re.sub(rf"(\be\.){separator}(g\.)", r"\1 \2", sentences) - sentences = re.sub(rf"(\bi\.){separator}(e\.)", r"\1 \2", sentences) - sentences = re.sub(rf"(\bi\.){separator}(v\.)", r"\1 \2", sentences) - - # No sentence break after specific abbreviations - abbreviations = [ - r"e\. ?g\.", - r"i\. ?e\.", - r"i\. ?v\.", - r"vs\.", - r"cf\.", - r"Dr\.", - r"Mr\.", - r"Ms\.", - r"Mrs\.", - r"Prof\.", - r"Ph\.?D\.", - r"Jr\.", - r"St\.", - r"Mt\.", - r"etc\.", - r"Fig\.", - r"vol\.", - r"Vols\.", - r"no\.", - r"Nos\.", - r"et\.", - r"al\.", - r"i\. ?v\.", - r"inc\.", - r"Ltd\.", - r"Co\.", - r"Corp\.", - r"Dept\.", - r"est\.", - r"Asst\.", - r"approx\.", - r"dr\.", - r"fig\.", - r"mr\.", - r"mrs\.", - r"ms\.", - r"prof\.", - r"rep\.", - r"jr\.", - r"sen\.", - r"st\.", - r"vs\.", - r"i\. ?e\.", - ] - for abbr in abbreviations: - sentences = re.sub( - rf"(\b{abbr}){separator}", r"\1", sentences, flags=re.IGNORECASE - ) - - return sentences - - -def split_sentences(text, separator="abcdsentenceseperatordcba"): - # Use the separator in the regex - text = re.sub(r"([?!.])(?=\s|$)", rf"\1{separator}", text) - text = postproc_splits(text, separator) - return re.split(rf"\n?{separator} ?\n?", text) diff --git a/guardrails/validator_base.py b/guardrails/validator_base.py index fc17e5095..ba86d2989 100644 --- a/guardrails/validator_base.py +++ b/guardrails/validator_base.py @@ -32,9 +32,8 @@ from guardrails.types.on_fail import OnFailAction from guardrails.utils.safe_get import safe_get from guardrails.utils.hub_telemetry_utils import HubTelemetry -from guardrails.utils.tokenization_utils import postproc_splits -from guardrails.utils.tokenization_utils_seperator import ( - postproc_splits as postproc_splits_separator, +from guardrails.utils.tokenization_utils import ( + postproc_splits, ) @@ -81,7 +80,7 @@ def split_sentence_word_tokenizers_jl_separator( if not is_minimum_length or not any_potential_line_endings: return [] - sentences = postproc_splits_separator(chunk_with_potential_line_endings, separator) + sentences = postproc_splits(chunk_with_potential_line_endings, separator) sentences = re.split(rf"\n?{separator} ?\n?", sentences) # if not more than one sentence, we haven't accumulated enough for a validation if len(sentences) <= 1: @@ -92,69 +91,6 @@ def split_sentence_word_tokenizers_jl_separator( return [sentences[0], "".join(sentences[1:])] -def split_sentence_word_tokenizers_jl(chunk: str): - """ - Use a sentence tokenizer to detect if at least one sentence is present in the chunk. - We return the first sentence and the remaining chunks without the first sentence. - - We perform the first step of WordTokenizers.jl's split_sentences function to - detect possible sentence boundaries before calling the sentence tokenizer. - - Args: - chunk (str): The text to split into sentences. - - Returns: - List[str]: A list of two strings. The first string is the first sentence - in the chunk. The second string is the remaining text in the chunk. - """ - # using the sentence tokenizer is expensive - # we check for a . to avoid wastefully calling the tokenizer - - # check at least 3 characters have been accumulated before splitting - is_minimum_length = False - with contextlib.suppress(IndexError): - chunk[2] - is_minimum_length = True - - # check for potential line endings, which is what split_sentences does - chunk_with_potential_line_endings, count = re.subn( - r"([?!.])(?=\s|$)", r"\1\n", chunk - ) - any_potential_line_endings = count > 0 - if not is_minimum_length or not any_potential_line_endings: - return [] - - sentences = postproc_splits(chunk_with_potential_line_endings).split("\n") - # if not more than one sentence, we haven't accumulated enough for a validation - if len(sentences) <= 1: - return [] - - # return the sentence - # then the remaining chunks that aren't finished accumulating - return [sentences[0], "".join(sentences[1:])] - - -# TODO ensure this is not indeed needed -# def split_sentence_nltk(chunk: str): -# """ -# NOTE: this approach currently does not work -# Use a sentence tokenizer to split the chunk into sentences. - -# Because using the tokenizer is expensive, we only use it if there -# is a period present in the chunk. -# """ -# # using the sentence tokenizer is expensive -# # we check for a . to avoid wastefully calling the tokenizer -# if "." not in chunk: -# return [] -# sentences = nltk.sent_tokenize(chunk) -# if len(sentences) == 0: -# return [] -# # return the sentence -# # then the remaining chunks that aren't finished accumulating -# return [sentences[0], "".join(sentences[1:])] - - # TODO: Can we remove dataclass? It was originally added to support pydantic 1.* @dataclass # type: ignore class Validator: From 0611c7bea380344faf3d088eb6d54cb82469249e Mon Sep 17 00:00:00 2001 From: David Tam Date: Thu, 10 Oct 2024 14:13:57 -0700 Subject: [PATCH 35/71] minor fixes --- guardrails/classes/history/iteration.py | 5 ++++- guardrails/run/utils.py | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/guardrails/classes/history/iteration.py b/guardrails/classes/history/iteration.py index dbf530acc..9c806aa79 100644 --- a/guardrails/classes/history/iteration.py +++ b/guardrails/classes/history/iteration.py @@ -198,7 +198,10 @@ def create_messages_table( table.add_column("Content") for msg in messages: - table.add_row(str(msg["role"]), msg["content"]) # type: ignore + if hasattr(msg["content"], "source"): + table.add_row(str(msg["role"]), msg["content"].source) # type: ignore + else: + table.add_row(str(msg["role"]), msg["content"]) # type: ignore return table diff --git a/guardrails/run/utils.py b/guardrails/run/utils.py index 8d53dc7c5..d742f6481 100644 --- a/guardrails/run/utils.py +++ b/guardrails/run/utils.py @@ -20,6 +20,7 @@ def messages_source(messages: MessageHistory) -> MessageHistory: content = ( msg["content"].source if isinstance(msg["content"], Prompt) + or isinstance(msg["content"], Instructions) else msg["content"] ) msg_copy["content"] = content From 8c5f9c53619eae7043927fa3a77cf6f8ec61dae2 Mon Sep 17 00:00:00 2001 From: David Tam Date: Thu, 10 Oct 2024 16:21:29 -0700 Subject: [PATCH 36/71] notebooks --- docs/examples/bug_free_python_code.ipynb | 211 +-- docs/examples/check_for_pii.ipynb | 78 +- docs/examples/competitors_check.ipynb | 106 +- docs/examples/constrained_decoding.ipynb | 63 +- docs/examples/extracting_entities.ipynb | 1308 +++++++++++------ docs/examples/generate_structured_data.ipynb | 312 ++-- .../generate_structured_data_cohere.ipynb | 400 ++--- docs/examples/guardrails_server.ipynb | 351 ++++- .../guardrails_with_chat_models.ipynb | 115 +- docs/examples/input_validation.ipynb | 40 +- .../json_function_calling_tools.ipynb | 273 +++- docs/examples/lite_llm_defaults.ipynb | 46 +- .../no_secrets_in_generated_text.ipynb | 385 ++--- docs/examples/provenance.ipynb | 183 +-- docs/examples/recipe_generation.ipynb | 1194 ++++++++++++--- docs/examples/regex_validation.ipynb | 155 +- docs/examples/response_is_on_topic.ipynb | 38 +- docs/examples/secrets_detection.ipynb | 41 +- .../select_choice_based_on_action.ipynb | 846 +++++++---- docs/examples/summarizer.ipynb | 589 ++++---- docs/examples/syntax_error_free_sql.ipynb | 73 +- .../examples/text_summarization_quality.ipynb | 999 ++++++++++++- docs/examples/toxic_language.ipynb | 68 +- .../translation_to_specific_language.ipynb | 98 +- docs/examples/valid_chess_moves.ipynb | 403 ++++- guardrails/llm_providers.py | 3 +- guardrails/run/runner.py | 3 +- 27 files changed, 5613 insertions(+), 2768 deletions(-) diff --git a/docs/examples/bug_free_python_code.ipynb b/docs/examples/bug_free_python_code.ipynb index c6b4b4918..da8217640 100644 --- a/docs/examples/bug_free_python_code.ipynb +++ b/docs/examples/bug_free_python_code.ipynb @@ -31,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -60,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -80,63 +80,30 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 4, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
ValidationOutcome(\n",
-       "    call_id='12105167920',\n",
-       "    raw_llm_output='def longest_palindromic_substring(s):\\n    n = len(s)\\n    if n == 0:\\n        return \"\"\\n    \n",
-       "\\n    start, max_length = 0, 1\\n    \\n    for i in range(1, n):\\n        low, high = i - 1, i\\n        while low >=\n",
-       "0 and high < n and s[low] == s[high]:\\n            if high - low + 1 > max_length:\\n                start = low\\n  \n",
-       "max_length = high - low + 1\\n            low -= 1\\n            high += 1\\n        \\n        low, high = i - 1, i + \n",
-       "1\\n        while low >= 0 and high < n and s[low] == s[high]:\\n            if high - low + 1 > max_length:\\n       \n",
-       "start = low\\n                max_length = high - low + 1\\n            low -= 1\\n            high += 1\\n    \\n    \n",
-       "return s[start:start + max_length]\\n\\n# Example usage:\\ns = \"babad\"\\nprint(longest_palindromic_substring(s))  # \n",
-       "Output: \"bab\" or \"aba\"',\n",
-       "    validated_output='def longest_palindromic_substring(s):\\n    n = len(s)\\n    if n == 0:\\n        return \"\"\\n   \n",
-       "\\n    start, max_length = 0, 1\\n    \\n    for i in range(1, n):\\n        low, high = i - 1, i\\n        while low >=\n",
-       "0 and high < n and s[low] == s[high]:\\n            if high - low + 1 > max_length:\\n                start = low\\n  \n",
-       "max_length = high - low + 1\\n            low -= 1\\n            high += 1\\n        \\n        low, high = i - 1, i + \n",
-       "1\\n        while low >= 0 and high < n and s[low] == s[high]:\\n            if high - low + 1 > max_length:\\n       \n",
-       "start = low\\n                max_length = high - low + 1\\n            low -= 1\\n            high += 1\\n    \\n    \n",
-       "return s[start:start + max_length]\\n\\n# Example usage:\\ns = \"babad\"\\nprint(longest_palindromic_substring(s))  # \n",
-       "Output: \"bab\" or \"aba\"',\n",
-       "    reask=None,\n",
-       "    validation_passed=True,\n",
-       "    error=None\n",
-       ")\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33mcall_id\u001b[0m=\u001b[32m'12105167920'\u001b[0m,\n", - " \u001b[33mraw_llm_output\u001b[0m=\u001b[32m'def longest_palindromic_substring\u001b[0m\u001b[32m(\u001b[0m\u001b[32ms\u001b[0m\u001b[32m)\u001b[0m\u001b[32m:\\n n = len\u001b[0m\u001b[32m(\u001b[0m\u001b[32ms\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\n if n == 0:\\n return \"\"\\n \u001b[0m\n", - "\u001b[32m\\n start, max_length = 0, 1\\n \\n for i in range\u001b[0m\u001b[32m(\u001b[0m\u001b[32m1, n\u001b[0m\u001b[32m)\u001b[0m\u001b[32m:\\n low, high = i - 1, i\\n while low >=\u001b[0m\n", - "\u001b[32m0 and high \u001b[0m\u001b[32m<\u001b[0m\u001b[32m n and s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mlow\u001b[0m\u001b[32m]\u001b[0m\u001b[32m == s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mhigh\u001b[0m\u001b[32m]\u001b[0m\u001b[32m:\\n if high - low + 1 > max_length:\\n start = low\\n \u001b[0m\n", - "\u001b[32mmax_length = high - low + 1\\n low -= 1\\n high += 1\\n \\n low, high = i - 1, i + \u001b[0m\n", - "\u001b[32m1\\n while low >= 0 and high < n and s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mlow\u001b[0m\u001b[32m]\u001b[0m\u001b[32m == s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mhigh\u001b[0m\u001b[32m]\u001b[0m\u001b[32m:\\n if high - low + 1 > max_length:\\n \u001b[0m\n", - "\u001b[32mstart = low\\n max_length = high - low + 1\\n low -= 1\\n high += 1\\n \\n \u001b[0m\n", - "\u001b[32mreturn s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mstart:start + max_length\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\n\\n# Example usage:\\ns = \"babad\"\\nprint\u001b[0m\u001b[32m(\u001b[0m\u001b[32mlongest_palindromic_substring\u001b[0m\u001b[32m(\u001b[0m\u001b[32ms\u001b[0m\u001b[32m)\u001b[0m\u001b[32m)\u001b[0m\u001b[32m # \u001b[0m\n", - "\u001b[32mOutput: \"bab\" or \"aba\"'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[39m \u001b[0m\u001b[33mvalidated_output\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'def longest_palindromic_substring\u001b[0m\u001b[32m(\u001b[0m\u001b[32ms\u001b[0m\u001b[32m)\u001b[0m\u001b[32m:\\n n = len\u001b[0m\u001b[32m(\u001b[0m\u001b[32ms\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\n if n == 0:\\n return \"\"\\n \u001b[0m\n", - "\u001b[32m\\n start, max_length = 0, 1\\n \\n for i in range\u001b[0m\u001b[32m(\u001b[0m\u001b[32m1, n\u001b[0m\u001b[32m)\u001b[0m\u001b[32m:\\n low, high = i - 1, i\\n while low >=\u001b[0m\n", - "\u001b[32m0 and high < n and s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mlow\u001b[0m\u001b[32m]\u001b[0m\u001b[32m == s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mhigh\u001b[0m\u001b[32m]\u001b[0m\u001b[32m:\\n if high - low + 1 > max_length:\\n start = low\\n \u001b[0m\n", - "\u001b[32mmax_length = high - low + 1\\n low -= 1\\n high += 1\\n \\n low, high = i - 1, i + \u001b[0m\n", - "\u001b[32m1\\n while low >= 0 and high < n and s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mlow\u001b[0m\u001b[32m]\u001b[0m\u001b[32m == s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mhigh\u001b[0m\u001b[32m]\u001b[0m\u001b[32m:\\n if high - low + 1 \u001b[0m\u001b[32m>\u001b[0m\u001b[32m max_length:\\n \u001b[0m\n", - "\u001b[32mstart = low\\n max_length = high - low + 1\\n low -= 1\\n high += 1\\n \\n \u001b[0m\n", - "\u001b[32mreturn s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mstart:start + max_length\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\n\\n# Example usage:\\ns = \"babad\"\\nprint\u001b[0m\u001b[32m(\u001b[0m\u001b[32mlongest_palindromic_substring\u001b[0m\u001b[32m(\u001b[0m\u001b[32ms\u001b[0m\u001b[32m)\u001b[0m\u001b[32m)\u001b[0m\u001b[32m # \u001b[0m\n", - "\u001b[32mOutput: \"bab\" or \"aba\"'\u001b[0m,\n", - " \u001b[33mreask\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mvalidation_passed\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n", - " \u001b[33merror\u001b[0m=\u001b[3;35mNone\u001b[0m\n", - "\u001b[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stdout", + "output_type": "stream", + "text": [ + "ValidationOutcome(\n", + " call_id='14508958944',\n", + " raw_llm_output='def longest_palindrome(s: str) -> str:\\n if len(s) == 0:\\n return \"\"\\n \\n start, end = 0, 0\\n \\n def expand_around_center(left: int, right: int) -> int:\\n while left >= 0 and right < len(s) and s[left] == s[right]:\\n left -= 1\\n right += 1\\n return right - left - 1\\n \\n for i in range(len(s)):\\n len1 = expand_around_center(i, i)\\n len2 = expand_around_center(i, i + 1)\\n max_len = max(len1, len2)\\n \\n if max_len > end - start:\\n start = i - (max_len - 1) // 2\\n end = i + max_len // 2\\n \\n return s[start:end + 1]',\n", + " validated_output='def longest_palindrome(s: str) -> str:\\n if len(s) == 0:\\n return \"\"\\n \\n start, end = 0, 0\\n \\n def expand_around_center(left: int, right: int) -> int:\\n while left >= 0 and right < len(s) and s[left] == s[right]:\\n left -= 1\\n right += 1\\n return right - left - 1\\n \\n for i in range(len(s)):\\n len1 = expand_around_center(i, i)\\n len2 = expand_around_center(i, i + 1)\\n max_len = max(len1, len2)\\n \\n if max_len > end - start:\\n start = i - (max_len - 1) // 2\\n end = i + max_len // 2\\n \\n return s[start:end + 1]',\n", + " reask=None,\n", + " validation_passed=True,\n", + " error=None\n", + ")\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] } ], "source": [ @@ -162,7 +129,6 @@ " \"role\": \"user\",\n", " \"content\": prompt\n", " }],\n", - " # prompt=prompt,\n", " prompt_params={\"leetcode_problem\": leetcode_problem},\n", " temperature=0\n", ")\n", @@ -179,71 +145,36 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 5, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
def longestPalindrome(s: str) -> str:\n",
-       "    if len(s) == 0:\n",
-       "        return \"\"\n",
-       "    \n",
-       "    start, end = 0, 0\n",
-       "    \n",
-       "    for i in range(len(s)):\n",
-       "        len1 = expandAroundCenter(s, i, i)\n",
-       "        len2 = expandAroundCenter(s, i, i + 1)\n",
-       "        max_len = max(len1, len2)\n",
-       "        \n",
-       "        if max_len > end - start:\n",
-       "            start = i - (max_len - 1) // 2\n",
-       "            end = i + max_len // 2\n",
-       "    \n",
-       "    return s\n",
-       "\n",
-       "def expandAroundCenter(s: str, left: int, right: int) -> int:\n",
-       "    while left >= 0 and right < len(s) and s == s:\n",
-       "        left -= 1\n",
-       "        right += 1\n",
-       "    return right - left - 1\n",
-       "\n",
-       "# Example usage:\n",
-       "s = \"babad\"\n",
-       "print(longestPalindrome(s))  # Output: \"bab\" or \"aba\"\n",
-       "
\n" - ], - "text/plain": [ - "def \u001b[1;35mlongestPalindrome\u001b[0m\u001b[1m(\u001b[0ms: str\u001b[1m)\u001b[0m -> str:\n", - " if \u001b[1;35mlen\u001b[0m\u001b[1m(\u001b[0ms\u001b[1m)\u001b[0m == \u001b[1;36m0\u001b[0m:\n", - " return \u001b[32m\"\"\u001b[0m\n", - " \n", - " start, end = \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m\n", - " \n", - " for i in \u001b[1;35mrange\u001b[0m\u001b[1m(\u001b[0m\u001b[1;35mlen\u001b[0m\u001b[1m(\u001b[0ms\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m:\n", - " len1 = \u001b[1;35mexpandAroundCenter\u001b[0m\u001b[1m(\u001b[0ms, i, i\u001b[1m)\u001b[0m\n", - " len2 = \u001b[1;35mexpandAroundCenter\u001b[0m\u001b[1m(\u001b[0ms, i, i + \u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m\n", - " max_len = \u001b[1;35mmax\u001b[0m\u001b[1m(\u001b[0mlen1, len2\u001b[1m)\u001b[0m\n", - " \n", - " if max_len > end - start:\n", - " start = i - \u001b[1m(\u001b[0mmax_len - \u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m \u001b[35m/\u001b[0m\u001b[35m/\u001b[0m \u001b[1;36m2\u001b[0m\n", - " end = i + max_len \u001b[35m/\u001b[0m\u001b[35m/\u001b[0m \u001b[1;36m2\u001b[0m\n", - " \n", - " return s\n", - "\n", - "def \u001b[1;35mexpandAroundCenter\u001b[0m\u001b[1m(\u001b[0ms: str, left: int, right: int\u001b[1m)\u001b[0m -> int:\n", - " while left >= \u001b[1;36m0\u001b[0m and right < \u001b[1;35mlen\u001b[0m\u001b[1m(\u001b[0ms\u001b[1m)\u001b[0m and s == s:\n", - " left -= \u001b[1;36m1\u001b[0m\n", - " right += \u001b[1;36m1\u001b[0m\n", - " return right - left - \u001b[1;36m1\u001b[0m\n", - "\n", - "# Example usage:\n", - "s = \u001b[32m\"babad\"\u001b[0m\n", - "\u001b[1;35mprint\u001b[0m\u001b[1m(\u001b[0m\u001b[1;35mlongestPalindrome\u001b[0m\u001b[1m(\u001b[0ms\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m # Output: \u001b[32m\"bab\"\u001b[0m or \u001b[32m\"aba\"\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stdout", + "output_type": "stream", + "text": [ + "def longest_palindrome(s: str) -> str:\n", + " if len(s) == 0:\n", + " return \"\"\n", + " \n", + " start, end = 0, 0\n", + " \n", + " def expand_around_center(left: int, right: int) -> int:\n", + " while left >= 0 and right < len(s) and s[left] == s[right]:\n", + " left -= 1\n", + " right += 1\n", + " return right - left - 1\n", + " \n", + " for i in range(len(s)):\n", + " len1 = expand_around_center(i, i)\n", + " len2 = expand_around_center(i, i + 1)\n", + " max_len = max(len1, len2)\n", + " \n", + " if max_len > end - start:\n", + " start = i - (max_len - 1) // 2\n", + " end = i + max_len // 2\n", + " \n", + " return s[start:end + 1]\n" + ] } ], "source": [ @@ -260,34 +191,15 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 6, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
aba\n",
-       "
\n" - ], - "text/plain": [ - "aba\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
Success!\n",
-       "
\n" - ], - "text/plain": [ - "Success!\n" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stdout", + "output_type": "stream", + "text": [ + "Success!\n" + ] } ], "source": [ @@ -301,7 +213,7 @@ ], "metadata": { "kernelspec": { - "display_name": "tiff-env", + "display_name": "litellm", "language": "python", "name": "python3" }, @@ -315,14 +227,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.7" + "version": "3.12.3" }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "ef14f49bbc779f2fde64ca0552c2a99d578405052f5b73f61279551da311a8a1" - } - } + "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 diff --git a/docs/examples/check_for_pii.ipynb b/docs/examples/check_for_pii.ipynb index 66711cfcc..683b30edc 100644 --- a/docs/examples/check_for_pii.ipynb +++ b/docs/examples/check_for_pii.ipynb @@ -14,20 +14,16 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.1\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", - "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.1\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", - "\u001b[38;5;2m✔ Download and installation successful\u001b[0m\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "sagemaker 2.232.2 requires numpy<2.0,>=1.9.0, but you have numpy 2.0.2 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0m\u001b[38;5;2m✔ Download and installation successful\u001b[0m\n", "You can now load the package via spacy.load('en_core_web_lg')\n", "Installing hub:\u001b[35m/\u001b[0m\u001b[35m/guardrails/\u001b[0m\u001b[95mdetect_pii...\u001b[0m\n", "✅Successfully installed guardrails/detect_pii!\n", @@ -46,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -58,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -72,14 +68,22 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] + }, { "data": { "text/html": [ "
ValidationOutcome(\n",
-       "    call_id='11369602960',\n",
+       "    call_id='14118728112',\n",
        "    raw_llm_output='My email address is demo@lol.com, and my phone number is 1234567890',\n",
        "    validated_output='My email address is <EMAIL_ADDRESS>, and my phone number is <PHONE_NUMBER>',\n",
        "    reask=None,\n",
@@ -90,7 +94,7 @@
       ],
       "text/plain": [
        "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n",
-       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'11369602960'\u001b[0m,\n",
+       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'14118728112'\u001b[0m,\n",
        "    \u001b[33mraw_llm_output\u001b[0m=\u001b[32m'My email address is demo@lol.com, and my phone number is 1234567890'\u001b[0m,\n",
        "    \u001b[33mvalidated_output\u001b[0m=\u001b[32m'My email address is \u001b[0m\u001b[32m<\u001b[0m\u001b[32mEMAIL_ADDRESS\u001b[0m\u001b[32m>, and my phone number is \u001b[0m\u001b[32m'\u001b[0m,\n",
        "    \u001b[33mreask\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
@@ -123,14 +127,22 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    },
     {
      "data": {
       "text/html": [
        "
ValidationOutcome(\n",
-       "    call_id='12272632448',\n",
+       "    call_id='14120164704',\n",
        "    raw_llm_output='My email address is demo@lol.com, and my phone number is 1234567890',\n",
        "    validated_output='My email address is <EMAIL_ADDRESS>, and my phone number is 1234567890',\n",
        "    reask=None,\n",
@@ -141,7 +153,7 @@
       ],
       "text/plain": [
        "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n",
-       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'12272632448'\u001b[0m,\n",
+       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'14120164704'\u001b[0m,\n",
        "    \u001b[33mraw_llm_output\u001b[0m=\u001b[32m'My email address is demo@lol.com, and my phone number is 1234567890'\u001b[0m,\n",
        "    \u001b[33mvalidated_output\u001b[0m=\u001b[32m'My email address is \u001b[0m\u001b[32m<\u001b[0m\u001b[32mEMAIL_ADDRESS\u001b[0m\u001b[32m>\u001b[0m\u001b[32m, and my phone number is 1234567890'\u001b[0m,\n",
        "    \u001b[33mreask\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
@@ -175,7 +187,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -186,14 +198,22 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    },
     {
      "data": {
       "text/html": [
        "
ValidationOutcome(\n",
-       "    call_id='11371854608',\n",
+       "    call_id='14120171344',\n",
        "    raw_llm_output='My email address is demo@xyz.com, and my account number is 1234789012367654.',\n",
        "    validated_output='My email address is demo@xyz.com, and my account number is <US_BANK_NUMBER>.',\n",
        "    reask=None,\n",
@@ -204,7 +224,7 @@
       ],
       "text/plain": [
        "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n",
-       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'11371854608'\u001b[0m,\n",
+       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'14120171344'\u001b[0m,\n",
        "    \u001b[33mraw_llm_output\u001b[0m=\u001b[32m'My email address is demo@xyz.com, and my account number is 1234789012367654.'\u001b[0m,\n",
        "    \u001b[33mvalidated_output\u001b[0m=\u001b[32m'My email address is demo@xyz.com, and my account number is \u001b[0m\u001b[32m<\u001b[0m\u001b[32mUS_BANK_NUMBER\u001b[0m\u001b[32m>\u001b[0m\u001b[32m.'\u001b[0m,\n",
        "    \u001b[33mreask\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
@@ -238,14 +258,22 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    },
     {
      "data": {
       "text/html": [
        "
ValidationOutcome(\n",
-       "    call_id='11371849968',\n",
+       "    call_id='14120169344',\n",
        "    raw_llm_output=\"My ITIN is 923756789 and my driver's license number is 87651239\",\n",
        "    validated_output=\"My ITIN is <US_ITIN> and my driver's license number is <US_DRIVER_LICENSE>\",\n",
        "    reask=None,\n",
@@ -256,7 +284,7 @@
       ],
       "text/plain": [
        "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n",
-       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'11371849968'\u001b[0m,\n",
+       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'14120169344'\u001b[0m,\n",
        "    \u001b[33mraw_llm_output\u001b[0m=\u001b[32m\"My\u001b[0m\u001b[32m ITIN is 923756789 and my driver's license number is 87651239\"\u001b[0m,\n",
        "    \u001b[33mvalidated_output\u001b[0m=\u001b[32m\"My\u001b[0m\u001b[32m ITIN is \u001b[0m\u001b[32m<\u001b[0m\u001b[32mUS_ITIN\u001b[0m\u001b[32m> and my driver's license number is \u001b[0m\u001b[32m\"\u001b[0m,\n",
        "    \u001b[33mreask\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
@@ -292,7 +320,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "guard-venv",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -306,7 +334,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.1"
+   "version": "3.12.3"
   }
  },
  "nbformat": 4,
diff --git a/docs/examples/competitors_check.ipynb b/docs/examples/competitors_check.ipynb
index 4b4509e02..9c0ce9dd1 100644
--- a/docs/examples/competitors_check.ipynb
+++ b/docs/examples/competitors_check.ipynb
@@ -19,20 +19,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "\n",
-      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.1\u001b[0m\n",
-      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n",
       "Installing hub:\u001b[35m/\u001b[0m\u001b[35m/guardrails/\u001b[0m\u001b[95mcompetitor_check...\u001b[0m\n",
-      "\n",
-      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.1\u001b[0m\n",
-      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n",
       "✅Successfully installed guardrails/competitor_check!\n",
       "\n",
       "\n"
@@ -46,7 +40,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -73,7 +67,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -107,7 +101,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -142,14 +136,22 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    },
     {
      "data": {
       "text/html": [
        "
ValidationOutcome(\n",
-       "    call_id='10975641136',\n",
+       "    call_id='14233082752',\n",
        "    raw_llm_output='In the dynamic realm of finance, several prominent entities have emerged as key players,leaving\n",
        "an indelible mark on the industry. Acorns, a fintech innovator, has revolutionized saving and investing with its \n",
        "user-friendly app. Citigroup, a multinational investment bank, stands as a pillar of financial expertise, offering \n",
@@ -161,10 +163,16 @@
        "financial partner to individuals and businesses alike. Together, Acorns, Citi, HSBC, JP Morgan, and Santander have \n",
        "redefined the financial landscape, shaping the way we save, invest, and manage our money on a global scale.',\n",
        "    validated_output='In the dynamic realm of finance, several prominent entities have emerged as key \n",
-       "players,leaving an indelible mark on the industry. HSBC, with its extensive global network, has become a powerhouse\n",
-       "in the banking sector, catering to the needs of millions across different countries. Santander, a Spanish \n",
-       "multinational bank, has earned a reputation for its responsible banking practices and customer-centric approach, \n",
-       "serving as a trusted financial partner to individuals and businesses alike.',\n",
+       "players,leaving an indelible mark on the industry.[COMPETITOR], a fintech innovator, has revolutionized saving and \n",
+       "investing with its user-friendly app.[COMPETITOR], a multinational investment bank, stands as a pillar of financial\n",
+       "expertise, offering a wide array of services to clients worldwide.HSBC, with its extensive global network, has \n",
+       "become a powerhouse in the banking sector, catering to the needs of millions across different \n",
+       "countries.[COMPETITOR], a venerable institution with a rich history, has established itself as a comprehensive \n",
+       "financial powerhouse, providing a diverse range of services from investment banking to asset management.Santander, \n",
+       "a Spanish multinational bank, has earned a reputation for its responsible banking practices and customer-centric \n",
+       "approach, serving as a trusted financial partner to individuals and businesses alike.Together, [COMPETITOR], \n",
+       "[COMPETITOR], HSBC, [COMPETITOR], and Santander have redefined the financial landscape, shaping the way we save, \n",
+       "invest, and manage our money on a global scale.',\n",
        "    reask=None,\n",
        "    validation_passed=True,\n",
        "    error=None\n",
@@ -173,7 +181,7 @@
       ],
       "text/plain": [
        "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n",
-       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'10975641136'\u001b[0m,\n",
+       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'14233082752'\u001b[0m,\n",
        "    \u001b[33mraw_llm_output\u001b[0m=\u001b[32m'In the dynamic realm of finance, several prominent entities have emerged as key players,leaving\u001b[0m\n",
        "\u001b[32man indelible mark on the industry. Acorns, a fintech innovator, has revolutionized saving and investing with its \u001b[0m\n",
        "\u001b[32muser-friendly app. Citigroup, a multinational investment bank, stands as a pillar of financial expertise, offering \u001b[0m\n",
@@ -185,10 +193,16 @@
        "\u001b[32mfinancial partner to individuals and businesses alike. Together, Acorns, Citi, HSBC, JP Morgan, and Santander have \u001b[0m\n",
        "\u001b[32mredefined the financial landscape, shaping the way we save, invest, and manage our money on a global scale.'\u001b[0m,\n",
        "    \u001b[33mvalidated_output\u001b[0m=\u001b[32m'In the dynamic realm of finance, several prominent entities have emerged as key \u001b[0m\n",
-       "\u001b[32mplayers,leaving an indelible mark on the industry. HSBC, with its extensive global network, has become a powerhouse\u001b[0m\n",
-       "\u001b[32min the banking sector, catering to the needs of millions across different countries. Santander, a Spanish \u001b[0m\n",
-       "\u001b[32mmultinational bank, has earned a reputation for its responsible banking practices and customer-centric approach, \u001b[0m\n",
-       "\u001b[32mserving as a trusted financial partner to individuals and businesses alike.'\u001b[0m,\n",
+       "\u001b[32mplayers,leaving an indelible mark on the industry.\u001b[0m\u001b[32m[\u001b[0m\u001b[32mCOMPETITOR\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, a fintech innovator, has revolutionized saving and \u001b[0m\n",
+       "\u001b[32minvesting with its user-friendly app.\u001b[0m\u001b[32m[\u001b[0m\u001b[32mCOMPETITOR\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, a multinational investment bank, stands as a pillar of financial\u001b[0m\n",
+       "\u001b[32mexpertise, offering a wide array of services to clients worldwide.HSBC, with its extensive global network, has \u001b[0m\n",
+       "\u001b[32mbecome a powerhouse in the banking sector, catering to the needs of millions across different \u001b[0m\n",
+       "\u001b[32mcountries.\u001b[0m\u001b[32m[\u001b[0m\u001b[32mCOMPETITOR\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, a venerable institution with a rich history, has established itself as a comprehensive \u001b[0m\n",
+       "\u001b[32mfinancial powerhouse, providing a diverse range of services from investment banking to asset management.Santander, \u001b[0m\n",
+       "\u001b[32ma Spanish multinational bank, has earned a reputation for its responsible banking practices and customer-centric \u001b[0m\n",
+       "\u001b[32mapproach, serving as a trusted financial partner to individuals and businesses alike.Together, \u001b[0m\u001b[32m[\u001b[0m\u001b[32mCOMPETITOR\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m\n",
+       "\u001b[32m[\u001b[0m\u001b[32mCOMPETITOR\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, HSBC, \u001b[0m\u001b[32m[\u001b[0m\u001b[32mCOMPETITOR\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, and Santander have redefined the financial landscape, shaping the way we save, \u001b[0m\n",
+       "\u001b[32minvest, and manage our money on a global scale.'\u001b[0m,\n",
        "    \u001b[33mreask\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "    \u001b[33mvalidation_passed\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n",
        "    \u001b[33merror\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
@@ -216,7 +230,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [
     {
@@ -224,11 +238,8 @@
       "text/html": [
        "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ No messages.                                                                                            │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ In the dynamic realm of finance, several prominent entities have emerged as key players,leaving an      │ │\n",
@@ -245,10 +256,17 @@
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ 'In the dynamic realm of finance, several prominent entities have emerged as key players,leaving an     │ │\n",
-       "    │ │ indelible mark on the industry. HSBC, with its extensive global network, has become a powerhouse in the │ │\n",
-       "    │ │ banking sector, catering to the needs of millions across different countries. Santander, a Spanish      │ │\n",
-       "    │ │ multinational bank, has earned a reputation for its responsible banking practices and customer-centric  │ │\n",
-       "    │ │ approach, serving as a trusted financial partner to individuals and businesses alike.'                  │ │\n",
+       "    │ │ indelible mark on the industry.[COMPETITOR], a fintech innovator, has revolutionized saving and         │ │\n",
+       "    │ │ investing with its user-friendly app.[COMPETITOR], a multinational investment bank, stands as a pillar  │ │\n",
+       "    │ │ of financial expertise, offering a wide array of services to clients worldwide.HSBC, with its extensive │ │\n",
+       "    │ │ global network, has become a powerhouse in the banking sector, catering to the needs of millions across │ │\n",
+       "    │ │ different countries.[COMPETITOR], a venerable institution with a rich history, has established itself   │ │\n",
+       "    │ │ as a comprehensive financial powerhouse, providing a diverse range of services from investment banking  │ │\n",
+       "    │ │ to asset management.Santander, a Spanish multinational bank, has earned a reputation for its            │ │\n",
+       "    │ │ responsible banking practices and customer-centric approach, serving as a trusted financial partner to  │ │\n",
+       "    │ │ individuals and businesses alike.Together, [COMPETITOR], [COMPETITOR], HSBC, [COMPETITOR], and          │ │\n",
+       "    │ │ Santander have redefined the financial landscape, shaping the way we save, invest, and manage our money │ │\n",
+       "    │ │ on a global scale.'                                                                                     │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "
\n" @@ -256,11 +274,8 @@ "text/plain": [ "Logs\n", "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n", - " │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n", - " │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n", - " │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo messages.\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", " │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mIn the dynamic realm of finance, several prominent entities have emerged as key players,leaving an \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", @@ -277,10 +292,17 @@ " │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m'In the dynamic realm of finance, several prominent entities have emerged as key players,leaving an \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mindelible mark on the industry. HSBC, with its extensive global network, has become a powerhouse in the\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mbanking sector, catering to the needs of millions across different countries. Santander, a Spanish \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mmultinational bank, has earned a reputation for its responsible banking practices and customer-centric \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mapproach, serving as a trusted financial partner to individuals and businesses alike.'\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mindelible mark on the industry.[COMPETITOR], a fintech innovator, has revolutionized saving and \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240minvesting with its user-friendly app.[COMPETITOR], a multinational investment bank, stands as a pillar \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mof financial expertise, offering a wide array of services to clients worldwide.HSBC, with its extensive\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mglobal network, has become a powerhouse in the banking sector, catering to the needs of millions across\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mdifferent countries.[COMPETITOR], a venerable institution with a rich history, has established itself \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mas a comprehensive financial powerhouse, providing a diverse range of services from investment banking \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mto asset management.Santander, a Spanish multinational bank, has earned a reputation for its \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mresponsible banking practices and customer-centric approach, serving as a trusted financial partner to \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mindividuals and businesses alike.Together, [COMPETITOR], [COMPETITOR], HSBC, [COMPETITOR], and \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mSantander have redefined the financial landscape, shaping the way we save, invest, and manage our money\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mon a global scale.'\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", " │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" ] @@ -297,7 +319,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "litellm", "language": "python", "name": "python3" }, @@ -311,7 +333,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.1" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/examples/constrained_decoding.ipynb b/docs/examples/constrained_decoding.ipynb index 8805fae26..1f82116d3 100644 --- a/docs/examples/constrained_decoding.ipynb +++ b/docs/examples/constrained_decoding.ipynb @@ -2,19 +2,17 @@ "cells": [ { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", - "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", + "To disable this warning, you can either:\n", + "\t- Avoid using `tokenizers` before the fork if possible\n", + "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n" ] } ], @@ -28,18 +26,37 @@ "metadata": {}, "outputs": [ { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "81b91198c45249a2b0a7075d13ebf838", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "model.safetensors: 0%| | 10.5M/2.20G [00:00 \u001b[0m\u001b[32;49m24.1.2\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "Requirement already satisfied: pypdfium2 in /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages (4.30.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } @@ -79,7 +76,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/Users/dtam/.pyenv/versions/3.12.1/lib/python3.12/site-packages/pypdfium2/_helpers/textpage.py:80: UserWarning: get_text_range() call with default params will be implicitly redirected to get_text_bounded()\n", + "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/pypdfium2/_helpers/textpage.py:80: UserWarning: get_text_range() call with default params will be implicitly redirected to get_text_bounded()\n", " warnings.warn(\"get_text_range() call with default params will be implicitly redirected to get_text_bounded()\")\n" ] }, @@ -141,16 +138,7 @@ "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/dtam/.pyenv/versions/3.12.1/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:11: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n", - " from tqdm.autonotebook import tqdm, trange\n" - ] - } - ], + "outputs": [], "source": [ "from guardrails.hub import LowerCase, TwoWords, OneLine\n", "from pydantic import BaseModel, Field\n", @@ -220,9 +208,20 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n", + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] + } + ], "source": [ "# Add your OPENAI_API_KEY as an environment variable if it's not already set\n", "# import os\n", @@ -231,7 +230,7 @@ "raw_llm_response, validated_response, *rest = guard(\n", " messages=[{\"role\":\"user\", \"content\": prompt}],\n", " prompt_params={\"document\": content[:6000]},\n", - " model=\"gpt-3.5-turbo-instruct\",\n", + " model=\"gpt-4o-mini\",\n", " max_tokens=2048,\n", " temperature=0\n", ")" @@ -249,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -257,35 +256,43 @@ "text/html": [ "
{\n",
        "    'fees': [\n",
-       "        {'name': 'annual membership', 'explanation': 'None', 'value': 0},\n",
+       "        {\n",
+       "            'name': 'annual membership',\n",
+       "            'explanation': 'No annual membership fee is charged for this account.',\n",
+       "            'value': 0.0\n",
+       "        },\n",
        "        {\n",
        "            'name': 'my chase',\n",
-       "            'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction or amount \n",
-       "selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee of 1.72% of \n",
-       "the amount of each eligible purchase transaction or amount selected to create a My Chase Plan. The My Chase Plan \n",
-       "Fee will be determined at the time each My Chase Plan is created and will remain the same until the My Chase Plan \n",
-       "is paid in full.',\n",
-       "            'value': 0\n",
+       "            'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction during the 0% \n",
+       "Intro Purchase APR period, then 1.72% after.',\n",
+       "            'value': 1.72\n",
        "        },\n",
        "        {\n",
-       "            'name': 'transaction fees',\n",
-       "            'explanation': 'Balance Transfers Intro fee of either $5 or 3% of the amount of each transfer, \n",
-       "whichever is greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the \n",
-       "amount of each transfer, whichever is greater. Cash Advances Either $10 or 5% of the amount of each transaction, \n",
-       "whichever is greater. Foreign Transactions 3% of the amount of each transaction in U.S. dollars.',\n",
+       "            'name': 'balance transfer',\n",
+       "            'explanation': 'Intro fee of either $5 or 3% of the amount of each transfer, whichever is greater, on \n",
+       "transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount of each transfer, \n",
+       "whichever is greater.',\n",
        "            'value': 5.0\n",
        "        },\n",
        "        {\n",
-       "            'name': 'penalty fees',\n",
-       "            'explanation': 'Late Payment Up to $40. Over-the-Credit-Limit None Return Payment Up to $40. Return \n",
-       "Check None',\n",
-       "            'value': 40.0\n",
-       "        }\n",
+       "            'name': 'cash advance',\n",
+       "            'explanation': 'Either $10 or 5% of the amount of each transaction, whichever is greater.',\n",
+       "            'value': 10.0\n",
+       "        },\n",
+       "        {\n",
+       "            'name': 'foreign transaction',\n",
+       "            'explanation': '3% of the amount of each transaction in U.S. dollars.',\n",
+       "            'value': 3.0\n",
+       "        },\n",
+       "        {'name': 'late payment', 'explanation': 'Up to $40 for late payments.', 'value': 40.0},\n",
+       "        {'name': 'return payment', 'explanation': 'Up to $40 for returned payments.', 'value': 40.0}\n",
        "    ],\n",
        "    'interest_rates': [\n",
-       "        {'account_type': 'purchase/my chase loan/balance transfer', 'rate': 19.49},\n",
+       "        {'account_type': 'purchase', 'rate': 0.0},\n",
+       "        {'account_type': 'balance transfer', 'rate': 0.0},\n",
        "        {'account_type': 'cash advance', 'rate': 29.49},\n",
-       "        {'account_type': 'penalty', 'rate': 26.99}\n",
+       "        {'account_type': 'penalty', 'rate': 29.99},\n",
+       "        {'account_type': 'my chase loan', 'rate': 19.49}\n",
        "    ]\n",
        "}\n",
        "
\n" @@ -293,35 +300,43 @@ "text/plain": [ "\u001b[1m{\u001b[0m\n", " \u001b[32m'fees'\u001b[0m: \u001b[1m[\u001b[0m\n", - " \u001b[1m{\u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'annual membership'\u001b[0m, \u001b[32m'explanation'\u001b[0m: \u001b[32m'None'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[1;36m0\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[1m{\u001b[0m\n", + " \u001b[32m'name'\u001b[0m: \u001b[32m'annual membership'\u001b[0m,\n", + " \u001b[32m'explanation'\u001b[0m: \u001b[32m'No annual membership fee is charged for this account.'\u001b[0m,\n", + " \u001b[32m'value'\u001b[0m: \u001b[1;36m0.0\u001b[0m\n", + " \u001b[1m}\u001b[0m,\n", " \u001b[1m{\u001b[0m\n", " \u001b[32m'name'\u001b[0m: \u001b[32m'my chase'\u001b[0m,\n", - " \u001b[32m'explanation'\u001b[0m: \u001b[32m'Monthly fee of 0% of the amount of each eligible purchase transaction or amount \u001b[0m\n", - "\u001b[32mselected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee of 1.72% of \u001b[0m\n", - "\u001b[32mthe amount of each eligible purchase transaction or amount selected to create a My Chase Plan. The My Chase Plan \u001b[0m\n", - "\u001b[32mFee will be determined at the time each My Chase Plan is created and will remain the same until the My Chase Plan \u001b[0m\n", - "\u001b[32mis paid in full.'\u001b[0m,\n", - " \u001b[32m'value'\u001b[0m: \u001b[1;36m0\u001b[0m\n", + " \u001b[32m'explanation'\u001b[0m: \u001b[32m'Monthly fee of 0% of the amount of each eligible purchase transaction during the 0% \u001b[0m\n", + "\u001b[32mIntro Purchase APR period, then 1.72% after.'\u001b[0m,\n", + " \u001b[32m'value'\u001b[0m: \u001b[1;36m1.72\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[1m{\u001b[0m\n", - " \u001b[32m'name'\u001b[0m: \u001b[32m'transaction fees'\u001b[0m,\n", - " \u001b[32m'explanation'\u001b[0m: \u001b[32m'Balance Transfers Intro fee of either $5 or 3% of the amount of each transfer, \u001b[0m\n", - "\u001b[32mwhichever is greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the \u001b[0m\n", - "\u001b[32mamount of each transfer, whichever is greater. Cash Advances Either $10 or 5% of the amount of each transaction, \u001b[0m\n", - "\u001b[32mwhichever is greater. Foreign Transactions 3% of the amount of each transaction in U.S. dollars.'\u001b[0m,\n", + " \u001b[32m'name'\u001b[0m: \u001b[32m'balance transfer'\u001b[0m,\n", + " \u001b[32m'explanation'\u001b[0m: \u001b[32m'Intro fee of either $5 or 3% of the amount of each transfer, whichever is greater, on \u001b[0m\n", + "\u001b[32mtransfers made within 60 days of account opening. After that: Either $5 or 5% of the amount of each transfer, \u001b[0m\n", + "\u001b[32mwhichever is greater.'\u001b[0m,\n", " \u001b[32m'value'\u001b[0m: \u001b[1;36m5.0\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[1m{\u001b[0m\n", - " \u001b[32m'name'\u001b[0m: \u001b[32m'penalty fees'\u001b[0m,\n", - " \u001b[32m'explanation'\u001b[0m: \u001b[32m'Late Payment Up to $40. Over-the-Credit-Limit None Return Payment Up to $40. Return \u001b[0m\n", - "\u001b[32mCheck None'\u001b[0m,\n", - " \u001b[32m'value'\u001b[0m: \u001b[1;36m40.0\u001b[0m\n", - " \u001b[1m}\u001b[0m\n", + " \u001b[32m'name'\u001b[0m: \u001b[32m'cash advance'\u001b[0m,\n", + " \u001b[32m'explanation'\u001b[0m: \u001b[32m'Either $10 or 5% of the amount of each transaction, whichever is greater.'\u001b[0m,\n", + " \u001b[32m'value'\u001b[0m: \u001b[1;36m10.0\u001b[0m\n", + " \u001b[1m}\u001b[0m,\n", + " \u001b[1m{\u001b[0m\n", + " \u001b[32m'name'\u001b[0m: \u001b[32m'foreign transaction'\u001b[0m,\n", + " \u001b[32m'explanation'\u001b[0m: \u001b[32m'3% of the amount of each transaction in U.S. dollars.'\u001b[0m,\n", + " \u001b[32m'value'\u001b[0m: \u001b[1;36m3.0\u001b[0m\n", + " \u001b[1m}\u001b[0m,\n", + " \u001b[1m{\u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'late payment'\u001b[0m, \u001b[32m'explanation'\u001b[0m: \u001b[32m'Up to $40 for late payments.'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[1;36m40.0\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[1m{\u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'return payment'\u001b[0m, \u001b[32m'explanation'\u001b[0m: \u001b[32m'Up to $40 for returned payments.'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[1;36m40.0\u001b[0m\u001b[1m}\u001b[0m\n", " \u001b[1m]\u001b[0m,\n", " \u001b[32m'interest_rates'\u001b[0m: \u001b[1m[\u001b[0m\n", - " \u001b[1m{\u001b[0m\u001b[32m'account_type'\u001b[0m: \u001b[32m'purchase/my chase loan/balance transfer'\u001b[0m, \u001b[32m'rate'\u001b[0m: \u001b[1;36m19.49\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[1m{\u001b[0m\u001b[32m'account_type'\u001b[0m: \u001b[32m'purchase'\u001b[0m, \u001b[32m'rate'\u001b[0m: \u001b[1;36m0.0\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[1m{\u001b[0m\u001b[32m'account_type'\u001b[0m: \u001b[32m'balance transfer'\u001b[0m, \u001b[32m'rate'\u001b[0m: \u001b[1;36m0.0\u001b[0m\u001b[1m}\u001b[0m,\n", " \u001b[1m{\u001b[0m\u001b[32m'account_type'\u001b[0m: \u001b[32m'cash advance'\u001b[0m, \u001b[32m'rate'\u001b[0m: \u001b[1;36m29.49\u001b[0m\u001b[1m}\u001b[0m,\n", - " \u001b[1m{\u001b[0m\u001b[32m'account_type'\u001b[0m: \u001b[32m'penalty'\u001b[0m, \u001b[32m'rate'\u001b[0m: \u001b[1;36m26.99\u001b[0m\u001b[1m}\u001b[0m\n", + " \u001b[1m{\u001b[0m\u001b[32m'account_type'\u001b[0m: \u001b[32m'penalty'\u001b[0m, \u001b[32m'rate'\u001b[0m: \u001b[1;36m29.99\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[1m{\u001b[0m\u001b[32m'account_type'\u001b[0m: \u001b[32m'my chase loan'\u001b[0m, \u001b[32m'rate'\u001b[0m: \u001b[1;36m19.49\u001b[0m\u001b[1m}\u001b[0m\n", " \u001b[1m]\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] @@ -336,7 +351,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -344,10 +359,7 @@ "text/html": [ "
Logs\n",
        "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "│   │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "│   │ │ No prompt                                                                                               │ │\n",
-       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "│   │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
+       "│   │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
        "│   │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
        "│   │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
        "│   │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
@@ -537,38 +549,51 @@
        "│   │ │   \"fees\": [                                                                                             │ │\n",
        "│   │ │     {                                                                                                   │ │\n",
        "│   │ │       \"name\": \"annual membership fee\",                                                                  │ │\n",
-       "│   │ │       \"explanation\": \"None\",                                                                            │ │\n",
-       "│   │ │       \"value\": 0                                                                                        │ │\n",
+       "│   │ │       \"explanation\": \"No annual membership fee is charged for this account.\",                           │ │\n",
+       "│   │ │       \"value\": 0.0                                                                                      │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"name\": \"my chase plan fee\",                                                                      │ │\n",
+       "│   │ │       \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction during the  │ │\n",
+       "│   │ │ 0% Intro Purchase APR period, then 1.72% after.\",                                                       │ │\n",
+       "│   │ │       \"value\": 1.72                                                                                     │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"name\": \"balance transfer fee\",                                                                   │ │\n",
+       "│   │ │       \"explanation\": \"Intro fee of either $5 or 3% of the amount of each transfer, whichever is         │ │\n",
+       "│   │ │ greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount │ │\n",
+       "│   │ │ of each transfer, whichever is greater.\",                                                               │ │\n",
+       "│   │ │       \"value\": 5.0                                                                                      │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"name\": \"cash advance fee\",                                                                       │ │\n",
+       "│   │ │       \"explanation\": \"Either $10 or 5% of the amount of each transaction, whichever is greater.\",       │ │\n",
+       "│   │ │       \"value\": 10.0                                                                                     │ │\n",
        "│   │ │     },                                                                                                  │ │\n",
        "│   │ │     {                                                                                                   │ │\n",
-       "│   │ │       \"name\": \"my chase plan sm fee\",                                                                   │ │\n",
-       "│   │ │       \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction or amount   │ │\n",
-       "│   │ │ selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee   │ │\n",
-       "│   │ │ of 1.72% of the amount of each eligible purchase transaction or amount selected to create a My Chase    │ │\n",
-       "│   │ │ Plan. The My Chase Plan Fee will be determined at the time each My Chase Plan is created and will       │ │\n",
-       "│   │ │ remain the same until the My Chase Plan is paid in full.\",                                              │ │\n",
-       "│   │ │       \"value\": 0                                                                                        │ │\n",
+       "│   │ │       \"name\": \"foreign transaction fee\",                                                                │ │\n",
+       "│   │ │       \"explanation\": \"3% of the amount of each transaction in U.S. dollars.\",                           │ │\n",
+       "│   │ │       \"value\": 3.0                                                                                      │ │\n",
        "│   │ │     },                                                                                                  │ │\n",
        "│   │ │     {                                                                                                   │ │\n",
-       "│   │ │       \"name\": \"transaction fees\",                                                                       │ │\n",
-       "│   │ │       \"explanation\": \"Balance Transfers Intro fee of either $5 or 3% of the amount of each transfer,    │ │\n",
-       "│   │ │ whichever is greater, on transfers made within 60 days of account opening. After that: Either $5 or 5%  │ │\n",
-       "│   │ │ of the amount of each transfer, whichever is greater. Cash Advances Either $10 or 5% of the amount of   │ │\n",
-       "│   │ │ each transaction, whichever is greater. Foreign Transactions 3% of the amount of each transaction in    │ │\n",
-       "│   │ │ U.S. dollars.\",                                                                                         │ │\n",
-       "│   │ │       \"value\": 5                                                                                        │ │\n",
+       "│   │ │       \"name\": \"late payment fee\",                                                                       │ │\n",
+       "│   │ │       \"explanation\": \"Up to $40 for late payments.\",                                                    │ │\n",
+       "│   │ │       \"value\": 40.0                                                                                     │ │\n",
        "│   │ │     },                                                                                                  │ │\n",
        "│   │ │     {                                                                                                   │ │\n",
-       "│   │ │       \"name\": \"penalty fees\",                                                                           │ │\n",
-       "│   │ │       \"explanation\": \"Late Payment Up to $40. Over-the-Credit-Limit None Return Payment Up to $40.      │ │\n",
-       "│   │ │ Return Check None\",                                                                                     │ │\n",
-       "│   │ │       \"value\": 40                                                                                       │ │\n",
+       "│   │ │       \"name\": \"return payment fee\",                                                                     │ │\n",
+       "│   │ │       \"explanation\": \"Up to $40 for returned payments.\",                                                │ │\n",
+       "│   │ │       \"value\": 40.0                                                                                     │ │\n",
        "│   │ │     }                                                                                                   │ │\n",
        "│   │ │   ],                                                                                                    │ │\n",
        "│   │ │   \"interest_rates\": [                                                                                   │ │\n",
        "│   │ │     {                                                                                                   │ │\n",
-       "│   │ │       \"account_type\": \"purchase/my chase loan/balance transfer\",                                        │ │\n",
-       "│   │ │       \"rate\": 19.49                                                                                     │ │\n",
+       "│   │ │       \"account_type\": \"purchase\",                                                                       │ │\n",
+       "│   │ │       \"rate\": 0.0                                                                                       │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"account_type\": \"balance transfer\",                                                               │ │\n",
+       "│   │ │       \"rate\": 0.0                                                                                       │ │\n",
        "│   │ │     },                                                                                                  │ │\n",
        "│   │ │     {                                                                                                   │ │\n",
        "│   │ │       \"account_type\": \"cash advance\",                                                                   │ │\n",
@@ -576,7 +601,11 @@
        "│   │ │     },                                                                                                  │ │\n",
        "│   │ │     {                                                                                                   │ │\n",
        "│   │ │       \"account_type\": \"penalty\",                                                                        │ │\n",
-       "│   │ │       \"rate\": 26.99                                                                                     │ │\n",
+       "│   │ │       \"rate\": 29.99                                                                                     │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"account_type\": \"my chase loan\",                                                                  │ │\n",
+       "│   │ │       \"rate\": 19.49                                                                                     │ │\n",
        "│   │ │     }                                                                                                   │ │\n",
        "│   │ │   ]                                                                                                     │ │\n",
        "│   │ │ }                                                                                                       │ │\n",
@@ -600,12 +629,12 @@
        "│   │ │                 additional_properties={},                                                               │ │\n",
        "│   │ │                 path=['fees', 0, 'name']                                                                │ │\n",
        "│   │ │             ),                                                                                          │ │\n",
-       "│   │ │             'explanation': 'None',                                                                      │ │\n",
-       "│   │ │             'value': 0                                                                                  │ │\n",
+       "│   │ │             'explanation': 'No annual membership fee is charged for this account.',                     │ │\n",
+       "│   │ │             'value': 0.0                                                                                │ │\n",
        "│   │ │         },                                                                                              │ │\n",
        "│   │ │         {                                                                                               │ │\n",
        "│   │ │             'name': FieldReAsk(                                                                         │ │\n",
-       "│   │ │                 incorrect_value='my chase plan sm fee',                                                 │ │\n",
+       "│   │ │                 incorrect_value='my chase plan fee',                                                    │ │\n",
        "│   │ │                 fail_results=[                                                                          │ │\n",
        "│   │ │                     FailResult(                                                                         │ │\n",
        "│   │ │                         outcome='fail',                                                                 │ │\n",
@@ -619,194 +648,330 @@
        "│   │ │                 additional_properties={},                                                               │ │\n",
        "│   │ │                 path=['fees', 1, 'name']                                                                │ │\n",
        "│   │ │             ),                                                                                          │ │\n",
-       "│   │ │             'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction or    │ │\n",
-       "│   │ │ amount selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that,        │ │\n",
-       "│   │ │ monthly fee of 1.72% of the amount of each eligible purchase transaction or amount selected to create a │ │\n",
-       "│   │ │ My Chase Plan. The My Chase Plan Fee will be determined at the time each My Chase Plan is created and   │ │\n",
-       "│   │ │ will remain the same until the My Chase Plan is paid in full.',                                         │ │\n",
-       "│   │ │             'value': 0                                                                                  │ │\n",
+       "│   │ │             'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction       │ │\n",
+       "│   │ │ during the 0% Intro Purchase APR period, then 1.72% after.',                                            │ │\n",
+       "│   │ │             'value': 1.72                                                                               │ │\n",
        "│   │ │         },                                                                                              │ │\n",
        "│   │ │         {                                                                                               │ │\n",
-       "│   │ │             'name': 'transaction fees',                                                                 │ │\n",
-       "│   │ │             'explanation': 'Balance Transfers Intro fee of either $5 or 3% of the amount of each        │ │\n",
-       "│   │ │ transfer, whichever is greater, on transfers made within 60 days of account opening. After that: Either │ │\n",
-       "│   │ │ $5 or 5% of the amount of each transfer, whichever is greater. Cash Advances Either $10 or 5% of the    │ │\n",
-       "│   │ │ amount of each transaction, whichever is greater. Foreign Transactions 3% of the amount of each         │ │\n",
-       "│   │ │ transaction in U.S. dollars.',                                                                          │ │\n",
+       "│   │ │             'name': FieldReAsk(                                                                         │ │\n",
+       "│   │ │                 incorrect_value='balance transfer fee',                                                 │ │\n",
+       "│   │ │                 fail_results=[                                                                          │ │\n",
+       "│   │ │                     FailResult(                                                                         │ │\n",
+       "│   │ │                         outcome='fail',                                                                 │ │\n",
+       "│   │ │                         error_message='Value must be exactly two words',                                │ │\n",
+       "│   │ │                         fix_value='balance transfer',                                                   │ │\n",
+       "│   │ │                         error_spans=None,                                                               │ │\n",
+       "│   │ │                         metadata=None,                                                                  │ │\n",
+       "│   │ │                         validated_chunk=None                                                            │ │\n",
+       "│   │ │                     )                                                                                   │ │\n",
+       "│   │ │                 ],                                                                                      │ │\n",
+       "│   │ │                 additional_properties={},                                                               │ │\n",
+       "│   │ │                 path=['fees', 2, 'name']                                                                │ │\n",
+       "│   │ │             ),                                                                                          │ │\n",
+       "│   │ │             'explanation': 'Intro fee of either $5 or 3% of the amount of each transfer, whichever is   │ │\n",
+       "│   │ │ greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount │ │\n",
+       "│   │ │ of each transfer, whichever is greater.',                                                               │ │\n",
        "│   │ │             'value': 5.0                                                                                │ │\n",
        "│   │ │         },                                                                                              │ │\n",
        "│   │ │         {                                                                                               │ │\n",
-       "│   │ │             'name': 'penalty fees',                                                                     │ │\n",
-       "│   │ │             'explanation': 'Late Payment Up to $40. Over-the-Credit-Limit None Return Payment Up to     │ │\n",
-       "│   │ │ $40. Return Check None',                                                                                │ │\n",
+       "│   │ │             'name': FieldReAsk(                                                                         │ │\n",
+       "│   │ │                 incorrect_value='cash advance fee',                                                     │ │\n",
+       "│   │ │                 fail_results=[                                                                          │ │\n",
+       "│   │ │                     FailResult(                                                                         │ │\n",
+       "│   │ │                         outcome='fail',                                                                 │ │\n",
+       "│   │ │                         error_message='Value must be exactly two words',                                │ │\n",
+       "│   │ │                         fix_value='cash advance',                                                       │ │\n",
+       "│   │ │                         error_spans=None,                                                               │ │\n",
+       "│   │ │                         metadata=None,                                                                  │ │\n",
+       "│   │ │                         validated_chunk=None                                                            │ │\n",
+       "│   │ │                     )                                                                                   │ │\n",
+       "│   │ │                 ],                                                                                      │ │\n",
+       "│   │ │                 additional_properties={},                                                               │ │\n",
+       "│   │ │                 path=['fees', 3, 'name']                                                                │ │\n",
+       "│   │ │             ),                                                                                          │ │\n",
+       "│   │ │             'explanation': 'Either $10 or 5% of the amount of each transaction, whichever is greater.', │ │\n",
+       "│   │ │             'value': 10.0                                                                               │ │\n",
+       "│   │ │         },                                                                                              │ │\n",
+       "│   │ │         {                                                                                               │ │\n",
+       "│   │ │             'name': FieldReAsk(                                                                         │ │\n",
+       "│   │ │                 incorrect_value='foreign transaction fee',                                              │ │\n",
+       "│   │ │                 fail_results=[                                                                          │ │\n",
+       "│   │ │                     FailResult(                                                                         │ │\n",
+       "│   │ │                         outcome='fail',                                                                 │ │\n",
+       "│   │ │                         error_message='Value must be exactly two words',                                │ │\n",
+       "│   │ │                         fix_value='foreign transaction',                                                │ │\n",
+       "│   │ │                         error_spans=None,                                                               │ │\n",
+       "│   │ │                         metadata=None,                                                                  │ │\n",
+       "│   │ │                         validated_chunk=None                                                            │ │\n",
+       "│   │ │                     )                                                                                   │ │\n",
+       "│   │ │                 ],                                                                                      │ │\n",
+       "│   │ │                 additional_properties={},                                                               │ │\n",
+       "│   │ │                 path=['fees', 4, 'name']                                                                │ │\n",
+       "│   │ │             ),                                                                                          │ │\n",
+       "│   │ │             'explanation': '3% of the amount of each transaction in U.S. dollars.',                     │ │\n",
+       "│   │ │             'value': 3.0                                                                                │ │\n",
+       "│   │ │         },                                                                                              │ │\n",
+       "│   │ │         {                                                                                               │ │\n",
+       "│   │ │             'name': FieldReAsk(                                                                         │ │\n",
+       "│   │ │                 incorrect_value='late payment fee',                                                     │ │\n",
+       "│   │ │                 fail_results=[                                                                          │ │\n",
+       "│   │ │                     FailResult(                                                                         │ │\n",
+       "│   │ │                         outcome='fail',                                                                 │ │\n",
+       "│   │ │                         error_message='Value must be exactly two words',                                │ │\n",
+       "│   │ │                         fix_value='late payment',                                                       │ │\n",
+       "│   │ │                         error_spans=None,                                                               │ │\n",
+       "│   │ │                         metadata=None,                                                                  │ │\n",
+       "│   │ │                         validated_chunk=None                                                            │ │\n",
+       "│   │ │                     )                                                                                   │ │\n",
+       "│   │ │                 ],                                                                                      │ │\n",
+       "│   │ │                 additional_properties={},                                                               │ │\n",
+       "│   │ │                 path=['fees', 5, 'name']                                                                │ │\n",
+       "│   │ │             ),                                                                                          │ │\n",
+       "│   │ │             'explanation': 'Up to $40 for late payments.',                                              │ │\n",
+       "│   │ │             'value': 40.0                                                                               │ │\n",
+       "│   │ │         },                                                                                              │ │\n",
+       "│   │ │         {                                                                                               │ │\n",
+       "│   │ │             'name': FieldReAsk(                                                                         │ │\n",
+       "│   │ │                 incorrect_value='return payment fee',                                                   │ │\n",
+       "│   │ │                 fail_results=[                                                                          │ │\n",
+       "│   │ │                     FailResult(                                                                         │ │\n",
+       "│   │ │                         outcome='fail',                                                                 │ │\n",
+       "│   │ │                         error_message='Value must be exactly two words',                                │ │\n",
+       "│   │ │                         fix_value='return payment',                                                     │ │\n",
+       "│   │ │                         error_spans=None,                                                               │ │\n",
+       "│   │ │                         metadata=None,                                                                  │ │\n",
+       "│   │ │                         validated_chunk=None                                                            │ │\n",
+       "│   │ │                     )                                                                                   │ │\n",
+       "│   │ │                 ],                                                                                      │ │\n",
+       "│   │ │                 additional_properties={},                                                               │ │\n",
+       "│   │ │                 path=['fees', 6, 'name']                                                                │ │\n",
+       "│   │ │             ),                                                                                          │ │\n",
+       "│   │ │             'explanation': 'Up to $40 for returned payments.',                                          │ │\n",
        "│   │ │             'value': 40.0                                                                               │ │\n",
        "│   │ │         }                                                                                               │ │\n",
        "│   │ │     ],                                                                                                  │ │\n",
        "│   │ │     'interest_rates': [                                                                                 │ │\n",
-       "│   │ │         {                                                                                               │ │\n",
-       "│   │ │             'account_type': 'purchase/my chase loan/balance transfer',                                  │ │\n",
-       "│   │ │             'rate': 19.49                                                                               │ │\n",
-       "│   │ │         },                                                                                              │ │\n",
+       "│   │ │         {'account_type': 'purchase', 'rate': 0.0},                                                      │ │\n",
+       "│   │ │         {'account_type': 'balance transfer', 'rate': 0.0},                                              │ │\n",
        "│   │ │         {'account_type': 'cash advance', 'rate': 29.49},                                                │ │\n",
-       "│   │ │         {'account_type': 'penalty', 'rate': 26.99}                                                      │ │\n",
+       "│   │ │         {'account_type': 'penalty', 'rate': 29.99},                                                     │ │\n",
+       "│   │ │         {'account_type': 'my chase loan', 'rate': 19.49}                                                │ │\n",
        "│   │ │     ]                                                                                                   │ │\n",
        "│   │ │ }                                                                                                       │ │\n",
        "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ I was given the following JSON response, which had problems due to incorrect values.                    │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ {                                                                                                       │ │\n",
-       "    │ │   \"fees\": [                                                                                             │ │\n",
-       "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"name\": {                                                                                         │ │\n",
-       "    │ │         \"incorrect_value\": \"annual membership fee\",                                                     │ │\n",
-       "    │ │         \"error_messages\": [                                                                             │ │\n",
-       "    │ │           \"Value must be exactly two words\"                                                             │ │\n",
-       "    │ │         ]                                                                                               │ │\n",
-       "    │ │       },                                                                                                │ │\n",
-       "    │ │       \"explanation\": \"None\",                                                                            │ │\n",
-       "    │ │       \"value\": 0                                                                                        │ │\n",
-       "    │ │     },                                                                                                  │ │\n",
-       "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"name\": {                                                                                         │ │\n",
-       "    │ │         \"incorrect_value\": \"my chase plan sm fee\",                                                      │ │\n",
-       "    │ │         \"error_messages\": [                                                                             │ │\n",
-       "    │ │           \"Value must be exactly two words\"                                                             │ │\n",
-       "    │ │         ]                                                                                               │ │\n",
-       "    │ │       },                                                                                                │ │\n",
-       "    │ │       \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction or amount   │ │\n",
-       "    │ │ selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee   │ │\n",
-       "    │ │ of 1.72% of the amount of each eligible purchase transaction or amount selected to create a My Chase    │ │\n",
-       "    │ │ Plan. The My Chase Plan Fee will be determined at the time each My Chase Plan is created and will       │ │\n",
-       "    │ │ remain the same until the My Chase Plan is paid in full.\",                                              │ │\n",
-       "    │ │       \"value\": 0                                                                                        │ │\n",
-       "    │ │     },                                                                                                  │ │\n",
-       "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"name\": \"transaction fees\",                                                                       │ │\n",
-       "    │ │       \"explanation\": \"Balance Transfers Intro fee of either $5 or 3% of the amount of each transfer,    │ │\n",
-       "    │ │ whichever is greater, on transfers made within 60 days of account opening. After that: Either $5 or 5%  │ │\n",
-       "    │ │ of the amount of each transfer, whichever is greater. Cash Advances Either $10 or 5% of the amount of   │ │\n",
-       "    │ │ each transaction, whichever is greater. Foreign Transactions 3% of the amount of each transaction in    │ │\n",
-       "    │ │ U.S. dollars.\",                                                                                         │ │\n",
-       "    │ │       \"value\": 5.0                                                                                      │ │\n",
-       "    │ │     },                                                                                                  │ │\n",
-       "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"name\": \"penalty fees\",                                                                           │ │\n",
-       "    │ │       \"explanation\": \"Late Payment Up to $40. Over-the-Credit-Limit None Return Payment Up to $40.      │ │\n",
-       "    │ │ Return Check None\",                                                                                     │ │\n",
-       "    │ │       \"value\": 40.0                                                                                     │ │\n",
-       "    │ │     }                                                                                                   │ │\n",
-       "    │ │   ],                                                                                                    │ │\n",
-       "    │ │   \"interest_rates\": [                                                                                   │ │\n",
-       "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"account_type\": \"purchase/my chase loan/balance transfer\",                                        │ │\n",
-       "    │ │       \"rate\": 19.49                                                                                     │ │\n",
-       "    │ │     },                                                                                                  │ │\n",
-       "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"account_type\": \"cash advance\",                                                                   │ │\n",
-       "    │ │       \"rate\": 29.49                                                                                     │ │\n",
-       "    │ │     },                                                                                                  │ │\n",
-       "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"account_type\": \"penalty\",                                                                        │ │\n",
-       "    │ │       \"rate\": 26.99                                                                                     │ │\n",
-       "    │ │     }                                                                                                   │ │\n",
-       "    │ │   ]                                                                                                     │ │\n",
-       "    │ │ }                                                                                                       │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Help me correct the incorrect values based on the given error messages.                                 │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Given below is XML that describes the information to extract from this document and the tags to extract │ │\n",
-       "    │ │ it into.                                                                                                │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ <output>                                                                                                │ │\n",
-       "    │ │   <list description=\"What fees and charges are associated with my account?\" name=\"fees\"                 │ │\n",
-       "    │ │ required=\"true\">                                                                                        │ │\n",
-       "    │ │     <object required=\"true\">                                                                            │ │\n",
-       "    │ │       <string format=\"guardrails/lowercase; guardrails/two_words\" name=\"name\" required=\"true\"></string> │ │\n",
-       "    │ │       <string format=\"guardrails/one_line\" name=\"explanation\" required=\"true\"></string>                 │ │\n",
-       "    │ │       <float description=\"The fee amount in USD or as a percentage.\" name=\"value\"                       │ │\n",
-       "    │ │ required=\"true\"></float>                                                                                │ │\n",
-       "    │ │     </object>                                                                                           │ │\n",
-       "    │ │   </list>                                                                                               │ │\n",
-       "    │ │   <list description=\"What are the interest rates offered by the bank on different kinds of accounts and │ │\n",
-       "    │ │ products?\" name=\"interest_rates\" required=\"true\">                                                       │ │\n",
-       "    │ │     <object required=\"true\">                                                                            │ │\n",
-       "    │ │       <string format=\"guardrails/lowercase\" name=\"account_type\" required=\"true\"></string>               │ │\n",
-       "    │ │       <float description=\"The annual percentage rate (APR) for the account type.\" name=\"rate\"           │ │\n",
-       "    │ │ required=\"true\"></float>                                                                                │ │\n",
-       "    │ │     </object>                                                                                           │ │\n",
-       "    │ │   </list>                                                                                               │ │\n",
-       "    │ │ </output>                                                                                               │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the │ │\n",
-       "    │ │ `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding  │ │\n",
-       "    │ │ XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g.        │ │\n",
-       "    │ │ requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere,     │ │\n",
-       "    │ │ enter `null`.                                                                                           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭───────────────────────────────────────────── Instructions ──────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ You are a helpful assistant only capable of communicating with valid JSON, and no other text.           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the │ │\n",
-       "    │ │ `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding  │ │\n",
-       "    │ │ XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g.        │ │\n",
-       "    │ │ requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere,     │ │\n",
-       "    │ │ enter `null`.                                                                                           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:                          │ │\n",
-       "    │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`                     │ │\n",
-       "    │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO',     │ │\n",
-       "    │ │ etc.]}`                                                                                                 │ │\n",
-       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
-       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃   Role  Content                                                                                    ┃ │ │\n",
+       "    │ │ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ system │                                                                                            │ │ │\n",
+       "    │ │ │        │ You are a helpful assistant only capable of communicating with valid JSON, and no other    │ │ │\n",
+       "    │ │ │        │ text.                                                                                      │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ONLY return a valid JSON object (no other text is necessary), where the key of the field   │ │ │\n",
+       "    │ │ │        │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type     │ │ │\n",
+       "    │ │ │        │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format,         │ │ │\n",
+       "    │ │ │        │ including any types and format requests e.g. requests for lists, objects and specific      │ │ │\n",
+       "    │ │ │        │ types. Be correct and concise. If you are unsure anywhere, enter `null`.                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:             │ │ │\n",
+       "    │ │ │        │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`        │ │ │\n",
+       "    │ │ │        │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',      │ │ │\n",
+       "    │ │ │        │ 'STRING TWO', etc.]}`                                                                      │ │ │\n",
+       "    │ │ │        │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer          │ │ │\n",
+       "    │ │ │        │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':   │ │ │\n",
+       "    │ │ │        │ 1}}`                                                                                       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │ │\n",
+       "    │ │ │   user │                                                                                            │ │ │\n",
+       "    │ │ │        │ I was given the following JSON response, which had problems due to incorrect values.       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ {                                                                                          │ │ │\n",
+       "    │ │ │        │   \"fees\": [                                                                                │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"name\": {                                                                            │ │ │\n",
+       "    │ │ │        │         \"incorrect_value\": \"annual membership fee\",                                        │ │ │\n",
+       "    │ │ │        │         \"error_messages\": [                                                                │ │ │\n",
+       "    │ │ │        │           \"Value must be exactly two words\"                                                │ │ │\n",
+       "    │ │ │        │         ]                                                                                  │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       \"explanation\": \"No annual membership fee is charged for this account.\",              │ │ │\n",
+       "    │ │ │        │       \"value\": 0.0                                                                         │ │ │\n",
+       "    │ │ │        │     },                                                                                     │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"name\": {                                                                            │ │ │\n",
+       "    │ │ │        │         \"incorrect_value\": \"my chase plan fee\",                                            │ │ │\n",
+       "    │ │ │        │         \"error_messages\": [                                                                │ │ │\n",
+       "    │ │ │        │           \"Value must be exactly two words\"                                                │ │ │\n",
+       "    │ │ │        │         ]                                                                                  │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase            │ │ │\n",
+       "    │ │ │        │ transaction during the 0% Intro Purchase APR period, then 1.72% after.\",                   │ │ │\n",
+       "    │ │ │        │       \"value\": 1.72                                                                        │ │ │\n",
+       "    │ │ │        │     },                                                                                     │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"name\": {                                                                            │ │ │\n",
+       "    │ │ │        │         \"incorrect_value\": \"balance transfer fee\",                                         │ │ │\n",
+       "    │ │ │        │         \"error_messages\": [                                                                │ │ │\n",
+       "    │ │ │        │           \"Value must be exactly two words\"                                                │ │ │\n",
+       "    │ │ │        │         ]                                                                                  │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       \"explanation\": \"Intro fee of either $5 or 3% of the amount of each transfer,         │ │ │\n",
+       "    │ │ │        │ whichever is greater, on transfers made within 60 days of account opening. After that:     │ │ │\n",
+       "    │ │ │        │ Either $5 or 5% of the amount of each transfer, whichever is greater.\",                    │ │ │\n",
+       "    │ │ │        │       \"value\": 5.0                                                                         │ │ │\n",
+       "    │ │ │        │     },                                                                                     │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"name\": {                                                                            │ │ │\n",
+       "    │ │ │        │         \"incorrect_value\": \"cash advance fee\",                                             │ │ │\n",
+       "    │ │ │        │         \"error_messages\": [                                                                │ │ │\n",
+       "    │ │ │        │           \"Value must be exactly two words\"                                                │ │ │\n",
+       "    │ │ │        │         ]                                                                                  │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       \"explanation\": \"Either $10 or 5% of the amount of each transaction, whichever is     │ │ │\n",
+       "    │ │ │        │ greater.\",                                                                                 │ │ │\n",
+       "    │ │ │        │       \"value\": 10.0                                                                        │ │ │\n",
+       "    │ │ │        │     },                                                                                     │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"name\": {                                                                            │ │ │\n",
+       "    │ │ │        │         \"incorrect_value\": \"foreign transaction fee\",                                      │ │ │\n",
+       "    │ │ │        │         \"error_messages\": [                                                                │ │ │\n",
+       "    │ │ │        │           \"Value must be exactly two words\"                                                │ │ │\n",
+       "    │ │ │        │         ]                                                                                  │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       \"explanation\": \"3% of the amount of each transaction in U.S. dollars.\",              │ │ │\n",
+       "    │ │ │        │       \"value\": 3.0                                                                         │ │ │\n",
+       "    │ │ │        │     },                                                                                     │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"name\": {                                                                            │ │ │\n",
+       "    │ │ │        │         \"incorrect_value\": \"late payment fee\",                                             │ │ │\n",
+       "    │ │ │        │         \"error_messages\": [                                                                │ │ │\n",
+       "    │ │ │        │           \"Value must be exactly two words\"                                                │ │ │\n",
+       "    │ │ │        │         ]                                                                                  │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       \"explanation\": \"Up to $40 for late payments.\",                                       │ │ │\n",
+       "    │ │ │        │       \"value\": 40.0                                                                        │ │ │\n",
+       "    │ │ │        │     },                                                                                     │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"name\": {                                                                            │ │ │\n",
+       "    │ │ │        │         \"incorrect_value\": \"return payment fee\",                                           │ │ │\n",
+       "    │ │ │        │         \"error_messages\": [                                                                │ │ │\n",
+       "    │ │ │        │           \"Value must be exactly two words\"                                                │ │ │\n",
+       "    │ │ │        │         ]                                                                                  │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       \"explanation\": \"Up to $40 for returned payments.\",                                   │ │ │\n",
+       "    │ │ │        │       \"value\": 40.0                                                                        │ │ │\n",
+       "    │ │ │        │     }                                                                                      │ │ │\n",
+       "    │ │ │        │   ],                                                                                       │ │ │\n",
+       "    │ │ │        │   \"interest_rates\": [                                                                      │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"account_type\": \"purchase\",                                                          │ │ │\n",
+       "    │ │ │        │       \"rate\": 0.0                                                                          │ │ │\n",
+       "    │ │ │        │     },                                                                                     │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"account_type\": \"balance transfer\",                                                  │ │ │\n",
+       "    │ │ │        │       \"rate\": 0.0                                                                          │ │ │\n",
+       "    │ │ │        │     },                                                                                     │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"account_type\": \"cash advance\",                                                      │ │ │\n",
+       "    │ │ │        │       \"rate\": 29.49                                                                        │ │ │\n",
+       "    │ │ │        │     },                                                                                     │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"account_type\": \"penalty\",                                                           │ │ │\n",
+       "    │ │ │        │       \"rate\": 29.99                                                                        │ │ │\n",
+       "    │ │ │        │     },                                                                                     │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"account_type\": \"my chase loan\",                                                     │ │ │\n",
+       "    │ │ │        │       \"rate\": 19.49                                                                        │ │ │\n",
+       "    │ │ │        │     }                                                                                      │ │ │\n",
+       "    │ │ │        │   ]                                                                                        │ │ │\n",
+       "    │ │ │        │ }                                                                                          │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Help me correct the incorrect values based on the given error messages.                    │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Given below is XML that describes the information to extract from this document and the    │ │ │\n",
+       "    │ │ │        │ tags to extract it into.                                                                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ <output>                                                                                   │ │ │\n",
+       "    │ │ │        │   <list description=\"What fees and charges are associated with my account?\" name=\"fees\"    │ │ │\n",
+       "    │ │ │        │ required=\"true\">                                                                           │ │ │\n",
+       "    │ │ │        │     <object required=\"true\">                                                               │ │ │\n",
+       "    │ │ │        │       <string format=\"guardrails/lowercase; guardrails/two_words\" name=\"name\"              │ │ │\n",
+       "    │ │ │        │ required=\"true\"></string>                                                                  │ │ │\n",
+       "    │ │ │        │       <string format=\"guardrails/one_line\" name=\"explanation\" required=\"true\"></string>    │ │ │\n",
+       "    │ │ │        │       <float description=\"The fee amount in USD or as a percentage.\" name=\"value\"          │ │ │\n",
+       "    │ │ │        │ required=\"true\"></float>                                                                   │ │ │\n",
+       "    │ │ │        │     </object>                                                                              │ │ │\n",
+       "    │ │ │        │   </list>                                                                                  │ │ │\n",
+       "    │ │ │        │   <list description=\"What are the interest rates offered by the bank on different kinds of │ │ │\n",
+       "    │ │ │        │ accounts and products?\" name=\"interest_rates\" required=\"true\">                             │ │ │\n",
+       "    │ │ │        │     <object required=\"true\">                                                               │ │ │\n",
+       "    │ │ │        │       <string format=\"guardrails/lowercase\" name=\"account_type\" required=\"true\"></string>  │ │ │\n",
+       "    │ │ │        │       <float description=\"The annual percentage rate (APR) for the account type.\"          │ │ │\n",
+       "    │ │ │        │ name=\"rate\" required=\"true\"></float>                                                       │ │ │\n",
+       "    │ │ │        │     </object>                                                                              │ │ │\n",
+       "    │ │ │        │   </list>                                                                                  │ │ │\n",
+       "    │ │ │        │ </output>                                                                                  │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ONLY return a valid JSON object (no other text is necessary), where the key of the field   │ │ │\n",
+       "    │ │ │        │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type     │ │ │\n",
+       "    │ │ │        │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format,         │ │ │\n",
+       "    │ │ │        │ including any types and format requests e.g. requests for lists, objects and specific      │ │ │\n",
+       "    │ │ │        │ types. Be correct and concise. If you are unsure anywhere, enter `null`.                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │   \"fees\": [                                                                                             │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"name\": \"annual membership fee\",                                                                  │ │\n",
-       "    │ │       \"explanation\": \"None\",                                                                            │ │\n",
-       "    │ │       \"value\": 0                                                                                        │ │\n",
+       "    │ │       \"name\": \"annual membership\",                                                                      │ │\n",
+       "    │ │       \"explanation\": \"No annual membership fee is charged for this account.\",                           │ │\n",
+       "    │ │       \"value\": 0.0                                                                                      │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"name\": \"my chase plan sm fee\",                                                                   │ │\n",
-       "    │ │       \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction or amount   │ │\n",
-       "    │ │ selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee   │ │\n",
-       "    │ │ of 1.72% of the amount of each eligible purchase transaction or amount selected to create a My Chase    │ │\n",
-       "    │ │ Plan. The My Chase Plan Fee will be determined at the time each My Chase Plan is created and will       │ │\n",
-       "    │ │ remain the same until the My Chase Plan is paid in full.\",                                              │ │\n",
-       "    │ │       \"value\": 0                                                                                        │ │\n",
+       "    │ │       \"name\": \"my chase\",                                                                               │ │\n",
+       "    │ │       \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction during the  │ │\n",
+       "    │ │ 0% Intro Purchase APR period, then 1.72% after.\",                                                       │ │\n",
+       "    │ │       \"value\": 1.72                                                                                     │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"name\": \"transaction fees\",                                                                       │ │\n",
-       "    │ │       \"explanation\": \"Balance Transfers Intro fee of either $5 or 3% of the amount of each transfer,    │ │\n",
-       "    │ │ whichever is greater, on transfers made within 60 days of account opening. After that: Either $5 or 5%  │ │\n",
-       "    │ │ of the amount of each transfer, whichever is greater. Cash Advances Either $10 or 5% of the amount of   │ │\n",
-       "    │ │ each transaction, whichever is greater. Foreign Transactions 3% of the amount of each transaction in    │ │\n",
-       "    │ │ U.S. dollars.\",                                                                                         │ │\n",
+       "    │ │       \"name\": \"balance transfer\",                                                                       │ │\n",
+       "    │ │       \"explanation\": \"Intro fee of either $5 or 3% of the amount of each transfer, whichever is         │ │\n",
+       "    │ │ greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount │ │\n",
+       "    │ │ of each transfer, whichever is greater.\",                                                               │ │\n",
        "    │ │       \"value\": 5.0                                                                                      │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"name\": \"penalty fees\",                                                                           │ │\n",
-       "    │ │       \"explanation\": \"Late Payment Up to $40. Over-the-Credit-Limit None Return Payment Up to $40.      │ │\n",
-       "    │ │ Return Check None\",                                                                                     │ │\n",
+       "    │ │       \"name\": \"cash advance\",                                                                           │ │\n",
+       "    │ │       \"explanation\": \"Either $10 or 5% of the amount of each transaction, whichever is greater.\",       │ │\n",
+       "    │ │       \"value\": 10.0                                                                                     │ │\n",
+       "    │ │     },                                                                                                  │ │\n",
+       "    │ │     {                                                                                                   │ │\n",
+       "    │ │       \"name\": \"foreign transaction\",                                                                    │ │\n",
+       "    │ │       \"explanation\": \"3% of the amount of each transaction in U.S. dollars.\",                           │ │\n",
+       "    │ │       \"value\": 3.0                                                                                      │ │\n",
+       "    │ │     },                                                                                                  │ │\n",
+       "    │ │     {                                                                                                   │ │\n",
+       "    │ │       \"name\": \"late payment\",                                                                           │ │\n",
+       "    │ │       \"explanation\": \"Up to $40 for late payments.\",                                                    │ │\n",
+       "    │ │       \"value\": 40.0                                                                                     │ │\n",
+       "    │ │     },                                                                                                  │ │\n",
+       "    │ │     {                                                                                                   │ │\n",
+       "    │ │       \"name\": \"return payment\",                                                                         │ │\n",
+       "    │ │       \"explanation\": \"Up to $40 for returned payments.\",                                                │ │\n",
        "    │ │       \"value\": 40.0                                                                                     │ │\n",
        "    │ │     }                                                                                                   │ │\n",
        "    │ │   ],                                                                                                    │ │\n",
        "    │ │   \"interest_rates\": [                                                                                   │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"account_type\": \"purchase/my chase loan/balance transfer\",                                        │ │\n",
-       "    │ │       \"rate\": 19.49                                                                                     │ │\n",
+       "    │ │       \"account_type\": \"purchase\",                                                                       │ │\n",
+       "    │ │       \"rate\": 0.0                                                                                       │ │\n",
+       "    │ │     },                                                                                                  │ │\n",
+       "    │ │     {                                                                                                   │ │\n",
+       "    │ │       \"account_type\": \"balance transfer\",                                                               │ │\n",
+       "    │ │       \"rate\": 0.0                                                                                       │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
        "    │ │       \"account_type\": \"cash advance\",                                                                   │ │\n",
@@ -814,7 +979,11 @@
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
        "    │ │       \"account_type\": \"penalty\",                                                                        │ │\n",
-       "    │ │       \"rate\": 26.99                                                                                     │ │\n",
+       "    │ │       \"rate\": 29.99                                                                                     │ │\n",
+       "    │ │     },                                                                                                  │ │\n",
+       "    │ │     {                                                                                                   │ │\n",
+       "    │ │       \"account_type\": \"my chase loan\",                                                                  │ │\n",
+       "    │ │       \"rate\": 19.49                                                                                     │ │\n",
        "    │ │     }                                                                                                   │ │\n",
        "    │ │   ]                                                                                                     │ │\n",
        "    │ │ }                                                                                                       │ │\n",
@@ -822,39 +991,51 @@
        "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │     'fees': [                                                                                           │ │\n",
-       "    │ │         {'name': 'annual membership', 'explanation': 'None', 'value': 0},                               │ │\n",
+       "    │ │         {                                                                                               │ │\n",
+       "    │ │             'name': 'annual membership',                                                                │ │\n",
+       "    │ │             'explanation': 'No annual membership fee is charged for this account.',                     │ │\n",
+       "    │ │             'value': 0.0                                                                                │ │\n",
+       "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
        "    │ │             'name': 'my chase',                                                                         │ │\n",
-       "    │ │             'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction or    │ │\n",
-       "    │ │ amount selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that,        │ │\n",
-       "    │ │ monthly fee of 1.72% of the amount of each eligible purchase transaction or amount selected to create a │ │\n",
-       "    │ │ My Chase Plan. The My Chase Plan Fee will be determined at the time each My Chase Plan is created and   │ │\n",
-       "    │ │ will remain the same until the My Chase Plan is paid in full.',                                         │ │\n",
-       "    │ │             'value': 0                                                                                  │ │\n",
+       "    │ │             'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction       │ │\n",
+       "    │ │ during the 0% Intro Purchase APR period, then 1.72% after.',                                            │ │\n",
+       "    │ │             'value': 1.72                                                                               │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             'name': 'transaction fees',                                                                 │ │\n",
-       "    │ │             'explanation': 'Balance Transfers Intro fee of either $5 or 3% of the amount of each        │ │\n",
-       "    │ │ transfer, whichever is greater, on transfers made within 60 days of account opening. After that: Either │ │\n",
-       "    │ │ $5 or 5% of the amount of each transfer, whichever is greater. Cash Advances Either $10 or 5% of the    │ │\n",
-       "    │ │ amount of each transaction, whichever is greater. Foreign Transactions 3% of the amount of each         │ │\n",
-       "    │ │ transaction in U.S. dollars.',                                                                          │ │\n",
+       "    │ │             'name': 'balance transfer',                                                                 │ │\n",
+       "    │ │             'explanation': 'Intro fee of either $5 or 3% of the amount of each transfer, whichever is   │ │\n",
+       "    │ │ greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount │ │\n",
+       "    │ │ of each transfer, whichever is greater.',                                                               │ │\n",
        "    │ │             'value': 5.0                                                                                │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             'name': 'penalty fees',                                                                     │ │\n",
-       "    │ │             'explanation': 'Late Payment Up to $40. Over-the-Credit-Limit None Return Payment Up to     │ │\n",
-       "    │ │ $40. Return Check None',                                                                                │ │\n",
+       "    │ │             'name': 'cash advance',                                                                     │ │\n",
+       "    │ │             'explanation': 'Either $10 or 5% of the amount of each transaction, whichever is greater.', │ │\n",
+       "    │ │             'value': 10.0                                                                               │ │\n",
+       "    │ │         },                                                                                              │ │\n",
+       "    │ │         {                                                                                               │ │\n",
+       "    │ │             'name': 'foreign transaction',                                                              │ │\n",
+       "    │ │             'explanation': '3% of the amount of each transaction in U.S. dollars.',                     │ │\n",
+       "    │ │             'value': 3.0                                                                                │ │\n",
+       "    │ │         },                                                                                              │ │\n",
+       "    │ │         {                                                                                               │ │\n",
+       "    │ │             'name': 'late payment',                                                                     │ │\n",
+       "    │ │             'explanation': 'Up to $40 for late payments.',                                              │ │\n",
+       "    │ │             'value': 40.0                                                                               │ │\n",
+       "    │ │         },                                                                                              │ │\n",
+       "    │ │         {                                                                                               │ │\n",
+       "    │ │             'name': 'return payment',                                                                   │ │\n",
+       "    │ │             'explanation': 'Up to $40 for returned payments.',                                          │ │\n",
        "    │ │             'value': 40.0                                                                               │ │\n",
        "    │ │         }                                                                                               │ │\n",
        "    │ │     ],                                                                                                  │ │\n",
        "    │ │     'interest_rates': [                                                                                 │ │\n",
-       "    │ │         {                                                                                               │ │\n",
-       "    │ │             'account_type': 'purchase/my chase loan/balance transfer',                                  │ │\n",
-       "    │ │             'rate': 19.49                                                                               │ │\n",
-       "    │ │         },                                                                                              │ │\n",
+       "    │ │         {'account_type': 'purchase', 'rate': 0.0},                                                      │ │\n",
+       "    │ │         {'account_type': 'balance transfer', 'rate': 0.0},                                              │ │\n",
        "    │ │         {'account_type': 'cash advance', 'rate': 29.49},                                                │ │\n",
-       "    │ │         {'account_type': 'penalty', 'rate': 26.99}                                                      │ │\n",
+       "    │ │         {'account_type': 'penalty', 'rate': 29.99},                                                     │ │\n",
+       "    │ │         {'account_type': 'my chase loan', 'rate': 19.49}                                                │ │\n",
        "    │ │     ]                                                                                                   │ │\n",
        "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
@@ -864,10 +1045,7 @@
       "text/plain": [
        "Logs\n",
        "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "│   │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
        "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
@@ -1057,38 +1235,51 @@
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"fees\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"annual membership fee\",\u001b[0m\u001b[48;2;245;245;220m                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"None\",\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 0\u001b[0m\u001b[48;2;245;245;220m                                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"No annual membership fee is charged for this account.\",\u001b[0m\u001b[48;2;245;245;220m                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 0.0\u001b[0m\u001b[48;2;245;245;220m                                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"my chase plan fee\",\u001b[0m\u001b[48;2;245;245;220m                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction during the \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m0% Intro Purchase APR period, then 1.72% after.\",\u001b[0m\u001b[48;2;245;245;220m                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 1.72\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"balance transfer fee\",\u001b[0m\u001b[48;2;245;245;220m                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Intro fee of either $5 or 3% of the amount of each transfer, whichever is \u001b[0m\u001b[48;2;245;245;220m       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mgreater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mof each transfer, whichever is greater.\",\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 5.0\u001b[0m\u001b[48;2;245;245;220m                                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"cash advance fee\",\u001b[0m\u001b[48;2;245;245;220m                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Either $10 or 5% of the amount of each transaction, whichever is greater.\",\u001b[0m\u001b[48;2;245;245;220m      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 10.0\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"my chase plan sm fee\",\u001b[0m\u001b[48;2;245;245;220m                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction or amount \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mselected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mof 1.72% of the amount of each eligible purchase transaction or amount selected to create a My Chase \u001b[0m\u001b[48;2;245;245;220m  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mPlan. The My Chase Plan Fee will be determined at the time each My Chase Plan is created and will \u001b[0m\u001b[48;2;245;245;220m     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mremain the same until the My Chase Plan is paid in full.\",\u001b[0m\u001b[48;2;245;245;220m                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 0\u001b[0m\u001b[48;2;245;245;220m                                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"foreign transaction fee\",\u001b[0m\u001b[48;2;245;245;220m                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"3% of the amount of each transaction in U.S. dollars.\",\u001b[0m\u001b[48;2;245;245;220m                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 3.0\u001b[0m\u001b[48;2;245;245;220m                                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"transaction fees\",\u001b[0m\u001b[48;2;245;245;220m                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Balance Transfers Intro fee of either $5 or 3% of the amount of each transfer, \u001b[0m\u001b[48;2;245;245;220m  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mwhichever is greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mof the amount of each transfer, whichever is greater. Cash Advances Either $10 or 5% of the amount of \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220meach transaction, whichever is greater. Foreign Transactions 3% of the amount of each transaction in \u001b[0m\u001b[48;2;245;245;220m  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mU.S. dollars.\",\u001b[0m\u001b[48;2;245;245;220m                                                                                        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 5\u001b[0m\u001b[48;2;245;245;220m                                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"late payment fee\",\u001b[0m\u001b[48;2;245;245;220m                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Up to $40 for late payments.\",\u001b[0m\u001b[48;2;245;245;220m                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 40.0\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"penalty fees\",\u001b[0m\u001b[48;2;245;245;220m                                                                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Late Payment Up to $40. Over-the-Credit-Limit None Return Payment Up to $40. \u001b[0m\u001b[48;2;245;245;220m    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mReturn Check None\",\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 40\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"return payment fee\",\u001b[0m\u001b[48;2;245;245;220m                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Up to $40 for returned payments.\",\u001b[0m\u001b[48;2;245;245;220m                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 40.0\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    }\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  ],\u001b[0m\u001b[48;2;245;245;220m                                                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"interest_rates\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"account_type\": \"purchase/my chase loan/balance transfer\",\u001b[0m\u001b[48;2;245;245;220m                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"rate\": 19.49\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"account_type\": \"purchase\",\u001b[0m\u001b[48;2;245;245;220m                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"rate\": 0.0\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"account_type\": \"balance transfer\",\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"rate\": 0.0\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"account_type\": \"cash advance\",\u001b[0m\u001b[48;2;245;245;220m                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -1096,7 +1287,11 @@
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"account_type\": \"penalty\",\u001b[0m\u001b[48;2;245;245;220m                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"rate\": 26.99\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"rate\": 29.99\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"account_type\": \"my chase loan\",\u001b[0m\u001b[48;2;245;245;220m                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"rate\": 19.49\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    }\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  ]\u001b[0m\u001b[48;2;245;245;220m                                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -1120,12 +1315,12 @@
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                additional_properties={},\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                path=['fees', 0, 'name']\u001b[0m\u001b[48;2;240;255;240m                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            ),\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'None',\u001b[0m\u001b[48;2;240;255;240m                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 0\u001b[0m\u001b[48;2;240;255;240m                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'No annual membership fee is charged for this account.',\u001b[0m\u001b[48;2;240;255;240m                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 0.0\u001b[0m\u001b[48;2;240;255;240m                                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': FieldReAsk(\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                incorrect_value='my chase plan sm fee',\u001b[0m\u001b[48;2;240;255;240m                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                incorrect_value='my chase plan fee',\u001b[0m\u001b[48;2;240;255;240m                                                   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                fail_results=[\u001b[0m\u001b[48;2;240;255;240m                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                    FailResult(\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        outcome='fail',\u001b[0m\u001b[48;2;240;255;240m                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
@@ -1139,194 +1334,330 @@
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                additional_properties={},\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                path=['fees', 1, 'name']\u001b[0m\u001b[48;2;240;255;240m                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            ),\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction or \u001b[0m\u001b[48;2;240;255;240m  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mamount selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, \u001b[0m\u001b[48;2;240;255;240m      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mmonthly fee of 1.72% of the amount of each eligible purchase transaction or amount selected to create a\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mMy Chase Plan. The My Chase Plan Fee will be determined at the time each My Chase Plan is created and \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mwill remain the same until the My Chase Plan is paid in full.',\u001b[0m\u001b[48;2;240;255;240m                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 0\u001b[0m\u001b[48;2;240;255;240m                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction \u001b[0m\u001b[48;2;240;255;240m     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mduring the 0% Intro Purchase APR period, then 1.72% after.',\u001b[0m\u001b[48;2;240;255;240m                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 1.72\u001b[0m\u001b[48;2;240;255;240m                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'transaction fees',\u001b[0m\u001b[48;2;240;255;240m                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Balance Transfers Intro fee of either $5 or 3% of the amount of each \u001b[0m\u001b[48;2;240;255;240m      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mtransfer, whichever is greater, on transfers made within 60 days of account opening. After that: Either\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m$5 or 5% of the amount of each transfer, whichever is greater. Cash Advances Either $10 or 5% of the \u001b[0m\u001b[48;2;240;255;240m  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mamount of each transaction, whichever is greater. Foreign Transactions 3% of the amount of each \u001b[0m\u001b[48;2;240;255;240m       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mtransaction in U.S. dollars.',\u001b[0m\u001b[48;2;240;255;240m                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': FieldReAsk(\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                incorrect_value='balance transfer fee',\u001b[0m\u001b[48;2;240;255;240m                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                fail_results=[\u001b[0m\u001b[48;2;240;255;240m                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                    FailResult(\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        outcome='fail',\u001b[0m\u001b[48;2;240;255;240m                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        error_message='Value must be exactly two words',\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        fix_value='balance transfer',\u001b[0m\u001b[48;2;240;255;240m                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        error_spans=None,\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        metadata=None,\u001b[0m\u001b[48;2;240;255;240m                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        validated_chunk=None\u001b[0m\u001b[48;2;240;255;240m                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                    )\u001b[0m\u001b[48;2;240;255;240m                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                ],\u001b[0m\u001b[48;2;240;255;240m                                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                additional_properties={},\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                path=['fees', 2, 'name']\u001b[0m\u001b[48;2;240;255;240m                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            ),\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Intro fee of either $5 or 3% of the amount of each transfer, whichever is \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mgreater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mof each transfer, whichever is greater.',\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 5.0\u001b[0m\u001b[48;2;240;255;240m                                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'penalty fees',\u001b[0m\u001b[48;2;240;255;240m                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Late Payment Up to $40. Over-the-Credit-Limit None Return Payment Up to \u001b[0m\u001b[48;2;240;255;240m   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m$40. Return Check None',\u001b[0m\u001b[48;2;240;255;240m                                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': FieldReAsk(\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                incorrect_value='cash advance fee',\u001b[0m\u001b[48;2;240;255;240m                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                fail_results=[\u001b[0m\u001b[48;2;240;255;240m                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                    FailResult(\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        outcome='fail',\u001b[0m\u001b[48;2;240;255;240m                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        error_message='Value must be exactly two words',\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        fix_value='cash advance',\u001b[0m\u001b[48;2;240;255;240m                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        error_spans=None,\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        metadata=None,\u001b[0m\u001b[48;2;240;255;240m                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        validated_chunk=None\u001b[0m\u001b[48;2;240;255;240m                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                    )\u001b[0m\u001b[48;2;240;255;240m                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                ],\u001b[0m\u001b[48;2;240;255;240m                                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                additional_properties={},\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                path=['fees', 3, 'name']\u001b[0m\u001b[48;2;240;255;240m                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            ),\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Either $10 or 5% of the amount of each transaction, whichever is greater.',\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 10.0\u001b[0m\u001b[48;2;240;255;240m                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': FieldReAsk(\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                incorrect_value='foreign transaction fee',\u001b[0m\u001b[48;2;240;255;240m                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                fail_results=[\u001b[0m\u001b[48;2;240;255;240m                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                    FailResult(\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        outcome='fail',\u001b[0m\u001b[48;2;240;255;240m                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        error_message='Value must be exactly two words',\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        fix_value='foreign transaction',\u001b[0m\u001b[48;2;240;255;240m                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        error_spans=None,\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        metadata=None,\u001b[0m\u001b[48;2;240;255;240m                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        validated_chunk=None\u001b[0m\u001b[48;2;240;255;240m                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                    )\u001b[0m\u001b[48;2;240;255;240m                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                ],\u001b[0m\u001b[48;2;240;255;240m                                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                additional_properties={},\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                path=['fees', 4, 'name']\u001b[0m\u001b[48;2;240;255;240m                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            ),\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': '3% of the amount of each transaction in U.S. dollars.',\u001b[0m\u001b[48;2;240;255;240m                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 3.0\u001b[0m\u001b[48;2;240;255;240m                                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': FieldReAsk(\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                incorrect_value='late payment fee',\u001b[0m\u001b[48;2;240;255;240m                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                fail_results=[\u001b[0m\u001b[48;2;240;255;240m                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                    FailResult(\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        outcome='fail',\u001b[0m\u001b[48;2;240;255;240m                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        error_message='Value must be exactly two words',\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        fix_value='late payment',\u001b[0m\u001b[48;2;240;255;240m                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        error_spans=None,\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        metadata=None,\u001b[0m\u001b[48;2;240;255;240m                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        validated_chunk=None\u001b[0m\u001b[48;2;240;255;240m                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                    )\u001b[0m\u001b[48;2;240;255;240m                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                ],\u001b[0m\u001b[48;2;240;255;240m                                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                additional_properties={},\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                path=['fees', 5, 'name']\u001b[0m\u001b[48;2;240;255;240m                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            ),\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Up to $40 for late payments.',\u001b[0m\u001b[48;2;240;255;240m                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 40.0\u001b[0m\u001b[48;2;240;255;240m                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': FieldReAsk(\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                incorrect_value='return payment fee',\u001b[0m\u001b[48;2;240;255;240m                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                fail_results=[\u001b[0m\u001b[48;2;240;255;240m                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                    FailResult(\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        outcome='fail',\u001b[0m\u001b[48;2;240;255;240m                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        error_message='Value must be exactly two words',\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        fix_value='return payment',\u001b[0m\u001b[48;2;240;255;240m                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        error_spans=None,\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        metadata=None,\u001b[0m\u001b[48;2;240;255;240m                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                        validated_chunk=None\u001b[0m\u001b[48;2;240;255;240m                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                    )\u001b[0m\u001b[48;2;240;255;240m                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                ],\u001b[0m\u001b[48;2;240;255;240m                                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                additional_properties={},\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                path=['fees', 6, 'name']\u001b[0m\u001b[48;2;240;255;240m                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            ),\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Up to $40 for returned payments.',\u001b[0m\u001b[48;2;240;255;240m                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 40.0\u001b[0m\u001b[48;2;240;255;240m                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        }\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ],\u001b[0m\u001b[48;2;240;255;240m                                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'interest_rates': [\u001b[0m\u001b[48;2;240;255;240m                                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'account_type': 'purchase/my chase loan/balance transfer',\u001b[0m\u001b[48;2;240;255;240m                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'rate': 19.49\u001b[0m\u001b[48;2;240;255;240m                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'account_type': 'purchase', 'rate': 0.0},\u001b[0m\u001b[48;2;240;255;240m                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'account_type': 'balance transfer', 'rate': 0.0},\u001b[0m\u001b[48;2;240;255;240m                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'account_type': 'cash advance', 'rate': 29.49},\u001b[0m\u001b[48;2;240;255;240m                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'account_type': 'penalty', 'rate': 26.99}\u001b[0m\u001b[48;2;240;255;240m                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'account_type': 'penalty', 'rate': 29.99},\u001b[0m\u001b[48;2;240;255;240m                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'account_type': 'my chase loan', 'rate': 19.49}\u001b[0m\u001b[48;2;240;255;240m                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ]\u001b[0m\u001b[48;2;240;255;240m                                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mI was given the following JSON response, which had problems due to incorrect values.\u001b[0m\u001b[48;2;240;248;255m                   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m{\u001b[0m\u001b[48;2;240;248;255m                                                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \"fees\": [\u001b[0m\u001b[48;2;240;248;255m                                                                                            \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    {\u001b[0m\u001b[48;2;240;248;255m                                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"name\": {\u001b[0m\u001b[48;2;240;248;255m                                                                                        \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m        \"incorrect_value\": \"annual membership fee\",\u001b[0m\u001b[48;2;240;248;255m                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m        \"error_messages\": [\u001b[0m\u001b[48;2;240;248;255m                                                                            \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m          \"Value must be exactly two words\"\u001b[0m\u001b[48;2;240;248;255m                                                            \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m        ]\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      },\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"explanation\": \"None\",\u001b[0m\u001b[48;2;240;248;255m                                                                           \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"value\": 0\u001b[0m\u001b[48;2;240;248;255m                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    },\u001b[0m\u001b[48;2;240;248;255m                                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    {\u001b[0m\u001b[48;2;240;248;255m                                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"name\": {\u001b[0m\u001b[48;2;240;248;255m                                                                                        \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m        \"incorrect_value\": \"my chase plan sm fee\",\u001b[0m\u001b[48;2;240;248;255m                                                     \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m        \"error_messages\": [\u001b[0m\u001b[48;2;240;248;255m                                                                            \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m          \"Value must be exactly two words\"\u001b[0m\u001b[48;2;240;248;255m                                                            \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m        ]\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      },\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction or amount \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mselected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mof 1.72% of the amount of each eligible purchase transaction or amount selected to create a My Chase \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mPlan. The My Chase Plan Fee will be determined at the time each My Chase Plan is created and will \u001b[0m\u001b[48;2;240;248;255m     \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mremain the same until the My Chase Plan is paid in full.\",\u001b[0m\u001b[48;2;240;248;255m                                             \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"value\": 0\u001b[0m\u001b[48;2;240;248;255m                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    },\u001b[0m\u001b[48;2;240;248;255m                                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    {\u001b[0m\u001b[48;2;240;248;255m                                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"name\": \"transaction fees\",\u001b[0m\u001b[48;2;240;248;255m                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"explanation\": \"Balance Transfers Intro fee of either $5 or 3% of the amount of each transfer, \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mwhichever is greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mof the amount of each transfer, whichever is greater. Cash Advances Either $10 or 5% of the amount of \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255meach transaction, whichever is greater. Foreign Transactions 3% of the amount of each transaction in \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mU.S. dollars.\",\u001b[0m\u001b[48;2;240;248;255m                                                                                        \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"value\": 5.0\u001b[0m\u001b[48;2;240;248;255m                                                                                     \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    },\u001b[0m\u001b[48;2;240;248;255m                                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    {\u001b[0m\u001b[48;2;240;248;255m                                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"name\": \"penalty fees\",\u001b[0m\u001b[48;2;240;248;255m                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"explanation\": \"Late Payment Up to $40. Over-the-Credit-Limit None Return Payment Up to $40. \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mReturn Check None\",\u001b[0m\u001b[48;2;240;248;255m                                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"value\": 40.0\u001b[0m\u001b[48;2;240;248;255m                                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    }\u001b[0m\u001b[48;2;240;248;255m                                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  ],\u001b[0m\u001b[48;2;240;248;255m                                                                                                   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \"interest_rates\": [\u001b[0m\u001b[48;2;240;248;255m                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    {\u001b[0m\u001b[48;2;240;248;255m                                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"account_type\": \"purchase/my chase loan/balance transfer\",\u001b[0m\u001b[48;2;240;248;255m                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"rate\": 19.49\u001b[0m\u001b[48;2;240;248;255m                                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    },\u001b[0m\u001b[48;2;240;248;255m                                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    {\u001b[0m\u001b[48;2;240;248;255m                                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"account_type\": \"cash advance\",\u001b[0m\u001b[48;2;240;248;255m                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"rate\": 29.49\u001b[0m\u001b[48;2;240;248;255m                                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    },\u001b[0m\u001b[48;2;240;248;255m                                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    {\u001b[0m\u001b[48;2;240;248;255m                                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"account_type\": \"penalty\",\u001b[0m\u001b[48;2;240;248;255m                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"rate\": 26.99\u001b[0m\u001b[48;2;240;248;255m                                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    }\u001b[0m\u001b[48;2;240;248;255m                                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  ]\u001b[0m\u001b[48;2;240;248;255m                                                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m}\u001b[0m\u001b[48;2;240;248;255m                                                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mHelp me correct the incorrect values based on the given error messages.\u001b[0m\u001b[48;2;240;248;255m                                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mGiven below is XML that describes the information to extract from this document and the tags to extract\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mit into.\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                           \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                           \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m`name` attribute of the corresponding XML, and the value is of the type specified by the corresponding \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mXML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mrequests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, \u001b[0m\u001b[48;2;240;248;255m   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255menter `null`.\u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m╭─\u001b[0m\u001b[48;2;255;240;242m────────────────────────────────────────────\u001b[0m\u001b[48;2;255;240;242m Instructions \u001b[0m\u001b[48;2;255;240;242m─────────────────────────────────────────────\u001b[0m\u001b[48;2;255;240;242m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mYou are a helpful assistant only capable of communicating with valid JSON, and no other text.\u001b[0m\u001b[48;2;255;240;242m          \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m`name` attribute of the corresponding XML, and the value is of the type specified by the corresponding \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mXML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. \u001b[0m\u001b[48;2;255;240;242m      \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mrequests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, \u001b[0m\u001b[48;2;255;240;242m   \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242menter `null`.\u001b[0m\u001b[48;2;255;240;242m                                                                                          \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mHere are examples of simple (XML, JSON) pairs that show the expected behavior:\u001b[0m\u001b[48;2;255;240;242m                         \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m- `` => `{'foo': 'example one'}`\u001b[0m\u001b[48;2;255;240;242m                    \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m- `` => `{\"bar\": ['STRING ONE', 'STRING TWO', \u001b[0m\u001b[48;2;255;240;242m   \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242metc.]}`\u001b[0m\u001b[48;2;255;240;242m                                                                                                \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;255;240;242m                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235m  Role\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                   \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235msystem\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYou are a helpful assistant only capable of communicating with valid JSON, and no other   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtext.                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235min JSON is the `name` attribute of the corresponding XML, and the value is of the type    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format,        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluding any types and format requests e.g. requests for lists, objects and specific     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtypes. Be correct and concise. If you are unsure anywhere, enter `null`.                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior:            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}`       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE',     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}`                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index':  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}`                                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  user\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mI was given the following JSON response, which had problems due to incorrect values.      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m{                                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  \"fees\": [                                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"name\": {                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"incorrect_value\": \"annual membership fee\",                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"error_messages\": [                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m          \"Value must be exactly two words\"                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        ]                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"explanation\": \"No annual membership fee is charged for this account.\",             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"value\": 0.0                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    },                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"name\": {                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"incorrect_value\": \"my chase plan fee\",                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"error_messages\": [                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m          \"Value must be exactly two words\"                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        ]                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtransaction during the 0% Intro Purchase APR period, then 1.72% after.\",                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"value\": 1.72                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    },                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"name\": {                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"incorrect_value\": \"balance transfer fee\",                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"error_messages\": [                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m          \"Value must be exactly two words\"                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        ]                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"explanation\": \"Intro fee of either $5 or 3% of the amount of each transfer,        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mwhichever is greater, on transfers made within 60 days of account opening. After that:    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mEither $5 or 5% of the amount of each transfer, whichever is greater.\",                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"value\": 5.0                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    },                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"name\": {                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"incorrect_value\": \"cash advance fee\",                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"error_messages\": [                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m          \"Value must be exactly two words\"                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        ]                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"explanation\": \"Either $10 or 5% of the amount of each transaction, whichever is    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mgreater.\",                                                                                \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"value\": 10.0                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    },                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"name\": {                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"incorrect_value\": \"foreign transaction fee\",                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"error_messages\": [                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m          \"Value must be exactly two words\"                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        ]                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"explanation\": \"3% of the amount of each transaction in U.S. dollars.\",             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"value\": 3.0                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    },                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"name\": {                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"incorrect_value\": \"late payment fee\",                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"error_messages\": [                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m          \"Value must be exactly two words\"                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        ]                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"explanation\": \"Up to $40 for late payments.\",                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"value\": 40.0                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    },                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"name\": {                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"incorrect_value\": \"return payment fee\",                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"error_messages\": [                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m          \"Value must be exactly two words\"                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        ]                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"explanation\": \"Up to $40 for returned payments.\",                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"value\": 40.0                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    }                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  ],                                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  \"interest_rates\": [                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"account_type\": \"purchase\",                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"rate\": 0.0                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    },                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"account_type\": \"balance transfer\",                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"rate\": 0.0                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    },                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"account_type\": \"cash advance\",                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"rate\": 29.49                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    },                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"account_type\": \"penalty\",                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"rate\": 29.99                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    },                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"account_type\": \"my chase loan\",                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"rate\": 19.49                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    }                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  ]                                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m}                                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHelp me correct the incorrect values based on the given error messages.                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtags to extract it into.                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235min JSON is the `name` attribute of the corresponding XML, and the value is of the type    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format,        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluding any types and format requests e.g. requests for lists, objects and specific     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtypes. Be correct and concise. If you are unsure anywhere, enter `null`.                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└────────┴────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m                                                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"fees\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"annual membership fee\",\u001b[0m\u001b[48;2;245;245;220m                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"None\",\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 0\u001b[0m\u001b[48;2;245;245;220m                                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"annual membership\",\u001b[0m\u001b[48;2;245;245;220m                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"No annual membership fee is charged for this account.\",\u001b[0m\u001b[48;2;245;245;220m                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 0.0\u001b[0m\u001b[48;2;245;245;220m                                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"my chase plan sm fee\",\u001b[0m\u001b[48;2;245;245;220m                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction or amount \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mselected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mof 1.72% of the amount of each eligible purchase transaction or amount selected to create a My Chase \u001b[0m\u001b[48;2;245;245;220m  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mPlan. The My Chase Plan Fee will be determined at the time each My Chase Plan is created and will \u001b[0m\u001b[48;2;245;245;220m     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mremain the same until the My Chase Plan is paid in full.\",\u001b[0m\u001b[48;2;245;245;220m                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 0\u001b[0m\u001b[48;2;245;245;220m                                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"my chase\",\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction during the \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m0% Intro Purchase APR period, then 1.72% after.\",\u001b[0m\u001b[48;2;245;245;220m                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 1.72\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"transaction fees\",\u001b[0m\u001b[48;2;245;245;220m                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Balance Transfers Intro fee of either $5 or 3% of the amount of each transfer, \u001b[0m\u001b[48;2;245;245;220m  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mwhichever is greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mof the amount of each transfer, whichever is greater. Cash Advances Either $10 or 5% of the amount of \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220meach transaction, whichever is greater. Foreign Transactions 3% of the amount of each transaction in \u001b[0m\u001b[48;2;245;245;220m  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mU.S. dollars.\",\u001b[0m\u001b[48;2;245;245;220m                                                                                        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"balance transfer\",\u001b[0m\u001b[48;2;245;245;220m                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Intro fee of either $5 or 3% of the amount of each transfer, whichever is \u001b[0m\u001b[48;2;245;245;220m       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mgreater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mof each transfer, whichever is greater.\",\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 5.0\u001b[0m\u001b[48;2;245;245;220m                                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"penalty fees\",\u001b[0m\u001b[48;2;245;245;220m                                                                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Late Payment Up to $40. Over-the-Credit-Limit None Return Payment Up to $40. \u001b[0m\u001b[48;2;245;245;220m    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mReturn Check None\",\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"cash advance\",\u001b[0m\u001b[48;2;245;245;220m                                                                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Either $10 or 5% of the amount of each transaction, whichever is greater.\",\u001b[0m\u001b[48;2;245;245;220m      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 10.0\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"foreign transaction\",\u001b[0m\u001b[48;2;245;245;220m                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"3% of the amount of each transaction in U.S. dollars.\",\u001b[0m\u001b[48;2;245;245;220m                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 3.0\u001b[0m\u001b[48;2;245;245;220m                                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"late payment\",\u001b[0m\u001b[48;2;245;245;220m                                                                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Up to $40 for late payments.\",\u001b[0m\u001b[48;2;245;245;220m                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 40.0\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"return payment\",\u001b[0m\u001b[48;2;245;245;220m                                                                        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"explanation\": \"Up to $40 for returned payments.\",\u001b[0m\u001b[48;2;245;245;220m                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 40.0\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    }\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  ],\u001b[0m\u001b[48;2;245;245;220m                                                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"interest_rates\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"account_type\": \"purchase/my chase loan/balance transfer\",\u001b[0m\u001b[48;2;245;245;220m                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"rate\": 19.49\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"account_type\": \"purchase\",\u001b[0m\u001b[48;2;245;245;220m                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"rate\": 0.0\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"account_type\": \"balance transfer\",\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"rate\": 0.0\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"account_type\": \"cash advance\",\u001b[0m\u001b[48;2;245;245;220m                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -1334,7 +1665,11 @@
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"account_type\": \"penalty\",\u001b[0m\u001b[48;2;245;245;220m                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"rate\": 26.99\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"rate\": 29.99\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"account_type\": \"my chase loan\",\u001b[0m\u001b[48;2;245;245;220m                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"rate\": 19.49\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    }\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  ]\u001b[0m\u001b[48;2;245;245;220m                                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -1342,46 +1677,58 @@
        "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'fees': [\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'name': 'annual membership', 'explanation': 'None', 'value': 0},\u001b[0m\u001b[48;2;240;255;240m                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'annual membership',\u001b[0m\u001b[48;2;240;255;240m                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'No annual membership fee is charged for this account.',\u001b[0m\u001b[48;2;240;255;240m                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 0.0\u001b[0m\u001b[48;2;240;255;240m                                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'my chase',\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction or \u001b[0m\u001b[48;2;240;255;240m  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mamount selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, \u001b[0m\u001b[48;2;240;255;240m      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mmonthly fee of 1.72% of the amount of each eligible purchase transaction or amount selected to create a\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mMy Chase Plan. The My Chase Plan Fee will be determined at the time each My Chase Plan is created and \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mwill remain the same until the My Chase Plan is paid in full.',\u001b[0m\u001b[48;2;240;255;240m                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 0\u001b[0m\u001b[48;2;240;255;240m                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction \u001b[0m\u001b[48;2;240;255;240m     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mduring the 0% Intro Purchase APR period, then 1.72% after.',\u001b[0m\u001b[48;2;240;255;240m                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 1.72\u001b[0m\u001b[48;2;240;255;240m                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'transaction fees',\u001b[0m\u001b[48;2;240;255;240m                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Balance Transfers Intro fee of either $5 or 3% of the amount of each \u001b[0m\u001b[48;2;240;255;240m      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mtransfer, whichever is greater, on transfers made within 60 days of account opening. After that: Either\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m$5 or 5% of the amount of each transfer, whichever is greater. Cash Advances Either $10 or 5% of the \u001b[0m\u001b[48;2;240;255;240m  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mamount of each transaction, whichever is greater. Foreign Transactions 3% of the amount of each \u001b[0m\u001b[48;2;240;255;240m       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mtransaction in U.S. dollars.',\u001b[0m\u001b[48;2;240;255;240m                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'balance transfer',\u001b[0m\u001b[48;2;240;255;240m                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Intro fee of either $5 or 3% of the amount of each transfer, whichever is \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mgreater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mof each transfer, whichever is greater.',\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 5.0\u001b[0m\u001b[48;2;240;255;240m                                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'penalty fees',\u001b[0m\u001b[48;2;240;255;240m                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Late Payment Up to $40. Over-the-Credit-Limit None Return Payment Up to \u001b[0m\u001b[48;2;240;255;240m   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m$40. Return Check None',\u001b[0m\u001b[48;2;240;255;240m                                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'cash advance',\u001b[0m\u001b[48;2;240;255;240m                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Either $10 or 5% of the amount of each transaction, whichever is greater.',\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 10.0\u001b[0m\u001b[48;2;240;255;240m                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'foreign transaction',\u001b[0m\u001b[48;2;240;255;240m                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': '3% of the amount of each transaction in U.S. dollars.',\u001b[0m\u001b[48;2;240;255;240m                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 3.0\u001b[0m\u001b[48;2;240;255;240m                                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'late payment',\u001b[0m\u001b[48;2;240;255;240m                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Up to $40 for late payments.',\u001b[0m\u001b[48;2;240;255;240m                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 40.0\u001b[0m\u001b[48;2;240;255;240m                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'return payment',\u001b[0m\u001b[48;2;240;255;240m                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'explanation': 'Up to $40 for returned payments.',\u001b[0m\u001b[48;2;240;255;240m                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 40.0\u001b[0m\u001b[48;2;240;255;240m                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        }\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ],\u001b[0m\u001b[48;2;240;255;240m                                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'interest_rates': [\u001b[0m\u001b[48;2;240;255;240m                                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'account_type': 'purchase/my chase loan/balance transfer',\u001b[0m\u001b[48;2;240;255;240m                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'rate': 19.49\u001b[0m\u001b[48;2;240;255;240m                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'account_type': 'purchase', 'rate': 0.0},\u001b[0m\u001b[48;2;240;255;240m                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'account_type': 'balance transfer', 'rate': 0.0},\u001b[0m\u001b[48;2;240;255;240m                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'account_type': 'cash advance', 'rate': 29.49},\u001b[0m\u001b[48;2;240;255;240m                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'account_type': 'penalty', 'rate': 26.99}\u001b[0m\u001b[48;2;240;255;240m                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'account_type': 'penalty', 'rate': 29.99},\u001b[0m\u001b[48;2;240;255;240m                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'account_type': 'my chase loan', 'rate': 19.49}\u001b[0m\u001b[48;2;240;255;240m                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ]\u001b[0m\u001b[48;2;240;255;240m                                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n"
       ]
      },
-     "execution_count": 7,
+     "execution_count": 10,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1393,7 +1740,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -1407,12 +1754,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.1"
-  },
-  "vscode": {
-   "interpreter": {
-    "hash": "ef14f49bbc779f2fde64ca0552c2a99d578405052f5b73f61279551da311a8a1"
-   }
+   "version": "3.12.3"
   }
  },
  "nbformat": 4,
diff --git a/docs/examples/generate_structured_data.ipynb b/docs/examples/generate_structured_data.ipynb
index 3eb27b3d9..e52d6dc29 100644
--- a/docs/examples/generate_structured_data.ipynb
+++ b/docs/examples/generate_structured_data.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 15,
    "metadata": {},
    "outputs": [
     {
@@ -63,16 +63,7 @@
    "cell_type": "code",
    "execution_count": 2,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/Users/dtam/.pyenv/versions/3.12.1/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:11: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
-      "  from tqdm.autonotebook import tqdm, trange\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "from pydantic import BaseModel, Field\n",
     "from guardrails.hub import ValidLength, TwoWords, ValidRange\n",
@@ -145,9 +136,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 9,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    }
+   ],
    "source": [
     "# Add your OPENAI_API_KEY as an environment variable if it's not already set\n",
     "# import os\n",
@@ -170,7 +170,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [
     {
@@ -248,12 +248,12 @@
     }
    ],
    "source": [
-    "print(guard.history.last.iterations.last.inputs.msg_history[0][\"content\"])"
+    "print(guard.history.last.iterations.last.inputs.messages[0][\"content\"])"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [
     {
@@ -263,54 +263,54 @@
        "{\n",
        "  \"user_orders\": [\n",
        "    {\n",
-       "      \"user_id\": \"u001\",\n",
+       "      \"user_id\": \"U001\",\n",
        "      \"user_name\": \"John Doe\",\n",
-       "      \"num_orders\": 15\n",
+       "      \"num_orders\": 12\n",
        "    },\n",
        "    {\n",
-       "      \"user_id\": \"u002\",\n",
+       "      \"user_id\": \"U002\",\n",
        "      \"user_name\": \"Jane Smith\",\n",
-       "      \"num_orders\": 22\n",
+       "      \"num_orders\": 8\n",
        "    },\n",
        "    {\n",
-       "      \"user_id\": \"u003\",\n",
+       "      \"user_id\": \"U003\",\n",
        "      \"user_name\": \"Alice Johnson\",\n",
-       "      \"num_orders\": 8\n",
+       "      \"num_orders\": 25\n",
        "    },\n",
        "    {\n",
-       "      \"user_id\": \"u004\",\n",
+       "      \"user_id\": \"U004\",\n",
        "      \"user_name\": \"Bob Brown\",\n",
-       "      \"num_orders\": 30\n",
+       "      \"num_orders\": 15\n",
        "    },\n",
        "    {\n",
-       "      \"user_id\": \"u005\",\n",
+       "      \"user_id\": \"U005\",\n",
        "      \"user_name\": \"Charlie Davis\",\n",
-       "      \"num_orders\": 12\n",
+       "      \"num_orders\": 30\n",
        "    },\n",
        "    {\n",
-       "      \"user_id\": \"u006\",\n",
-       "      \"user_name\": \"Diana Evans\",\n",
-       "      \"num_orders\": 25\n",
+       "      \"user_id\": \"U006\",\n",
+       "      \"user_name\": \"Emily White\",\n",
+       "      \"num_orders\": 5\n",
        "    },\n",
        "    {\n",
-       "      \"user_id\": \"u007\",\n",
-       "      \"user_name\": \"Eve Foster\",\n",
-       "      \"num_orders\": 18\n",
+       "      \"user_id\": \"U007\",\n",
+       "      \"user_name\": \"Frank Harris\",\n",
+       "      \"num_orders\": 20\n",
        "    },\n",
        "    {\n",
-       "      \"user_id\": \"u008\",\n",
-       "      \"user_name\": \"Frank Green\",\n",
-       "      \"num_orders\": 10\n",
+       "      \"user_id\": \"U008\",\n",
+       "      \"user_name\": \"Grace Lee\",\n",
+       "      \"num_orders\": 18\n",
        "    },\n",
        "    {\n",
-       "      \"user_id\": \"u009\",\n",
-       "      \"user_name\": \"Grace Hill\",\n",
-       "      \"num_orders\": 5\n",
+       "      \"user_id\": \"U009\",\n",
+       "      \"user_name\": \"Henry Clark\",\n",
+       "      \"num_orders\": 22\n",
        "    },\n",
        "    {\n",
-       "      \"user_id\": \"u010\",\n",
-       "      \"user_name\": \"Henry King\",\n",
-       "      \"num_orders\": 20\n",
+       "      \"user_id\": \"U010\",\n",
+       "      \"user_name\": \"Ivy Walker\",\n",
+       "      \"num_orders\": 10\n",
        "    }\n",
        "  ]\n",
        "}\n",
@@ -322,54 +322,54 @@
        "\u001b[1m{\u001b[0m\n",
        "  \u001b[32m\"user_orders\"\u001b[0m: \u001b[1m[\u001b[0m\n",
        "    \u001b[1m{\u001b[0m\n",
-       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"u001\"\u001b[0m,\n",
+       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"U001\"\u001b[0m,\n",
        "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"John Doe\"\u001b[0m,\n",
-       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m15\u001b[0m\n",
+       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m12\u001b[0m\n",
        "    \u001b[1m}\u001b[0m,\n",
        "    \u001b[1m{\u001b[0m\n",
-       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"u002\"\u001b[0m,\n",
+       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"U002\"\u001b[0m,\n",
        "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Jane Smith\"\u001b[0m,\n",
-       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m22\u001b[0m\n",
+       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m8\u001b[0m\n",
        "    \u001b[1m}\u001b[0m,\n",
        "    \u001b[1m{\u001b[0m\n",
-       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"u003\"\u001b[0m,\n",
+       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"U003\"\u001b[0m,\n",
        "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Alice Johnson\"\u001b[0m,\n",
-       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m8\u001b[0m\n",
+       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m25\u001b[0m\n",
        "    \u001b[1m}\u001b[0m,\n",
        "    \u001b[1m{\u001b[0m\n",
-       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"u004\"\u001b[0m,\n",
+       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"U004\"\u001b[0m,\n",
        "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Bob Brown\"\u001b[0m,\n",
-       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m30\u001b[0m\n",
+       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m15\u001b[0m\n",
        "    \u001b[1m}\u001b[0m,\n",
        "    \u001b[1m{\u001b[0m\n",
-       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"u005\"\u001b[0m,\n",
+       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"U005\"\u001b[0m,\n",
        "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Charlie Davis\"\u001b[0m,\n",
-       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m12\u001b[0m\n",
+       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m30\u001b[0m\n",
        "    \u001b[1m}\u001b[0m,\n",
        "    \u001b[1m{\u001b[0m\n",
-       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"u006\"\u001b[0m,\n",
-       "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Diana Evans\"\u001b[0m,\n",
-       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m25\u001b[0m\n",
+       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"U006\"\u001b[0m,\n",
+       "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Emily White\"\u001b[0m,\n",
+       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m5\u001b[0m\n",
        "    \u001b[1m}\u001b[0m,\n",
        "    \u001b[1m{\u001b[0m\n",
-       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"u007\"\u001b[0m,\n",
-       "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Eve Foster\"\u001b[0m,\n",
-       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m18\u001b[0m\n",
+       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"U007\"\u001b[0m,\n",
+       "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Frank Harris\"\u001b[0m,\n",
+       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m20\u001b[0m\n",
        "    \u001b[1m}\u001b[0m,\n",
        "    \u001b[1m{\u001b[0m\n",
-       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"u008\"\u001b[0m,\n",
-       "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Frank Green\"\u001b[0m,\n",
-       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m10\u001b[0m\n",
+       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"U008\"\u001b[0m,\n",
+       "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Grace Lee\"\u001b[0m,\n",
+       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m18\u001b[0m\n",
        "    \u001b[1m}\u001b[0m,\n",
        "    \u001b[1m{\u001b[0m\n",
-       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"u009\"\u001b[0m,\n",
-       "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Grace Hill\"\u001b[0m,\n",
-       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m5\u001b[0m\n",
+       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"U009\"\u001b[0m,\n",
+       "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Henry Clark\"\u001b[0m,\n",
+       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m22\u001b[0m\n",
        "    \u001b[1m}\u001b[0m,\n",
        "    \u001b[1m{\u001b[0m\n",
-       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"u010\"\u001b[0m,\n",
-       "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Henry King\"\u001b[0m,\n",
-       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m20\u001b[0m\n",
+       "      \u001b[32m\"user_id\"\u001b[0m: \u001b[32m\"U010\"\u001b[0m,\n",
+       "      \u001b[32m\"user_name\"\u001b[0m: \u001b[32m\"Ivy Walker\"\u001b[0m,\n",
+       "      \u001b[32m\"num_orders\"\u001b[0m: \u001b[1;36m10\u001b[0m\n",
        "    \u001b[1m}\u001b[0m\n",
        "  \u001b[1m]\u001b[0m\n",
        "\u001b[1m}\u001b[0m\n",
@@ -382,21 +382,21 @@
     {
      "data": {
       "text/plain": [
-       "{'user_orders': [{'user_id': 'u001',\n",
+       "{'user_orders': [{'user_id': 'U001',\n",
        "   'user_name': 'John Doe',\n",
-       "   'num_orders': 15},\n",
-       "  {'user_id': 'u002', 'user_name': 'Jane Smith', 'num_orders': 22},\n",
-       "  {'user_id': 'u003', 'user_name': 'Alice Johnson', 'num_orders': 8},\n",
-       "  {'user_id': 'u004', 'user_name': 'Bob Brown', 'num_orders': 30},\n",
-       "  {'user_id': 'u005', 'user_name': 'Charlie Davis', 'num_orders': 12},\n",
-       "  {'user_id': 'u006', 'user_name': 'Diana Evans', 'num_orders': 25},\n",
-       "  {'user_id': 'u007', 'user_name': 'Eve Foster', 'num_orders': 18},\n",
-       "  {'user_id': 'u008', 'user_name': 'Frank Green', 'num_orders': 10},\n",
-       "  {'user_id': 'u009', 'user_name': 'Grace Hill', 'num_orders': 5},\n",
-       "  {'user_id': 'u010', 'user_name': 'Henry King', 'num_orders': 20}]}"
+       "   'num_orders': 12},\n",
+       "  {'user_id': 'U002', 'user_name': 'Jane Smith', 'num_orders': 8},\n",
+       "  {'user_id': 'U003', 'user_name': 'Alice Johnson', 'num_orders': 25},\n",
+       "  {'user_id': 'U004', 'user_name': 'Bob Brown', 'num_orders': 15},\n",
+       "  {'user_id': 'U005', 'user_name': 'Charlie Davis', 'num_orders': 30},\n",
+       "  {'user_id': 'U006', 'user_name': 'Emily White', 'num_orders': 5},\n",
+       "  {'user_id': 'U007', 'user_name': 'Frank Harris', 'num_orders': 20},\n",
+       "  {'user_id': 'U008', 'user_name': 'Grace Lee', 'num_orders': 18},\n",
+       "  {'user_id': 'U009', 'user_name': 'Henry Clark', 'num_orders': 22},\n",
+       "  {'user_id': 'U010', 'user_name': 'Ivy Walker', 'num_orders': 10}]}"
       ]
      },
-     "execution_count": 7,
+     "execution_count": 13,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -418,7 +418,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [
     {
@@ -426,10 +426,7 @@
       "text/html": [
        "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
        "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
        "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
        "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
@@ -475,54 +472,54 @@
        "    │ │ {                                                                                                       │ │\n",
        "    │ │   \"user_orders\": [                                                                                      │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"user_id\": \"u001\",                                                                                │ │\n",
+       "    │ │       \"user_id\": \"U001\",                                                                                │ │\n",
        "    │ │       \"user_name\": \"John Doe\",                                                                          │ │\n",
-       "    │ │       \"num_orders\": 15                                                                                  │ │\n",
+       "    │ │       \"num_orders\": 12                                                                                  │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"user_id\": \"u002\",                                                                                │ │\n",
+       "    │ │       \"user_id\": \"U002\",                                                                                │ │\n",
        "    │ │       \"user_name\": \"Jane Smith\",                                                                        │ │\n",
-       "    │ │       \"num_orders\": 22                                                                                  │ │\n",
+       "    │ │       \"num_orders\": 8                                                                                   │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"user_id\": \"u003\",                                                                                │ │\n",
+       "    │ │       \"user_id\": \"U003\",                                                                                │ │\n",
        "    │ │       \"user_name\": \"Alice Johnson\",                                                                     │ │\n",
-       "    │ │       \"num_orders\": 8                                                                                   │ │\n",
+       "    │ │       \"num_orders\": 25                                                                                  │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"user_id\": \"u004\",                                                                                │ │\n",
+       "    │ │       \"user_id\": \"U004\",                                                                                │ │\n",
        "    │ │       \"user_name\": \"Bob Brown\",                                                                         │ │\n",
-       "    │ │       \"num_orders\": 30                                                                                  │ │\n",
+       "    │ │       \"num_orders\": 15                                                                                  │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"user_id\": \"u005\",                                                                                │ │\n",
+       "    │ │       \"user_id\": \"U005\",                                                                                │ │\n",
        "    │ │       \"user_name\": \"Charlie Davis\",                                                                     │ │\n",
-       "    │ │       \"num_orders\": 12                                                                                  │ │\n",
+       "    │ │       \"num_orders\": 30                                                                                  │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"user_id\": \"u006\",                                                                                │ │\n",
-       "    │ │       \"user_name\": \"Diana Evans\",                                                                       │ │\n",
-       "    │ │       \"num_orders\": 25                                                                                  │ │\n",
+       "    │ │       \"user_id\": \"U006\",                                                                                │ │\n",
+       "    │ │       \"user_name\": \"Emily White\",                                                                       │ │\n",
+       "    │ │       \"num_orders\": 5                                                                                   │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"user_id\": \"u007\",                                                                                │ │\n",
-       "    │ │       \"user_name\": \"Eve Foster\",                                                                        │ │\n",
-       "    │ │       \"num_orders\": 18                                                                                  │ │\n",
+       "    │ │       \"user_id\": \"U007\",                                                                                │ │\n",
+       "    │ │       \"user_name\": \"Frank Harris\",                                                                      │ │\n",
+       "    │ │       \"num_orders\": 20                                                                                  │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"user_id\": \"u008\",                                                                                │ │\n",
-       "    │ │       \"user_name\": \"Frank Green\",                                                                       │ │\n",
-       "    │ │       \"num_orders\": 10                                                                                  │ │\n",
+       "    │ │       \"user_id\": \"U008\",                                                                                │ │\n",
+       "    │ │       \"user_name\": \"Grace Lee\",                                                                         │ │\n",
+       "    │ │       \"num_orders\": 18                                                                                  │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"user_id\": \"u009\",                                                                                │ │\n",
-       "    │ │       \"user_name\": \"Grace Hill\",                                                                        │ │\n",
-       "    │ │       \"num_orders\": 5                                                                                   │ │\n",
+       "    │ │       \"user_id\": \"U009\",                                                                                │ │\n",
+       "    │ │       \"user_name\": \"Henry Clark\",                                                                       │ │\n",
+       "    │ │       \"num_orders\": 22                                                                                  │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
-       "    │ │       \"user_id\": \"u010\",                                                                                │ │\n",
-       "    │ │       \"user_name\": \"Henry King\",                                                                        │ │\n",
-       "    │ │       \"num_orders\": 20                                                                                  │ │\n",
+       "    │ │       \"user_id\": \"U010\",                                                                                │ │\n",
+       "    │ │       \"user_name\": \"Ivy Walker\",                                                                        │ │\n",
+       "    │ │       \"num_orders\": 10                                                                                  │ │\n",
        "    │ │     }                                                                                                   │ │\n",
        "    │ │   ]                                                                                                     │ │\n",
        "    │ │ }                                                                                                       │ │\n",
@@ -531,16 +528,16 @@
        "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │     'user_orders': [                                                                                    │ │\n",
-       "    │ │         {'user_id': 'u001', 'user_name': 'John Doe', 'num_orders': 15},                                 │ │\n",
-       "    │ │         {'user_id': 'u002', 'user_name': 'Jane Smith', 'num_orders': 22},                               │ │\n",
-       "    │ │         {'user_id': 'u003', 'user_name': 'Alice Johnson', 'num_orders': 8},                             │ │\n",
-       "    │ │         {'user_id': 'u004', 'user_name': 'Bob Brown', 'num_orders': 30},                                │ │\n",
-       "    │ │         {'user_id': 'u005', 'user_name': 'Charlie Davis', 'num_orders': 12},                            │ │\n",
-       "    │ │         {'user_id': 'u006', 'user_name': 'Diana Evans', 'num_orders': 25},                              │ │\n",
-       "    │ │         {'user_id': 'u007', 'user_name': 'Eve Foster', 'num_orders': 18},                               │ │\n",
-       "    │ │         {'user_id': 'u008', 'user_name': 'Frank Green', 'num_orders': 10},                              │ │\n",
-       "    │ │         {'user_id': 'u009', 'user_name': 'Grace Hill', 'num_orders': 5},                                │ │\n",
-       "    │ │         {'user_id': 'u010', 'user_name': 'Henry King', 'num_orders': 20}                                │ │\n",
+       "    │ │         {'user_id': 'U001', 'user_name': 'John Doe', 'num_orders': 12},                                 │ │\n",
+       "    │ │         {'user_id': 'U002', 'user_name': 'Jane Smith', 'num_orders': 8},                                │ │\n",
+       "    │ │         {'user_id': 'U003', 'user_name': 'Alice Johnson', 'num_orders': 25},                            │ │\n",
+       "    │ │         {'user_id': 'U004', 'user_name': 'Bob Brown', 'num_orders': 15},                                │ │\n",
+       "    │ │         {'user_id': 'U005', 'user_name': 'Charlie Davis', 'num_orders': 30},                            │ │\n",
+       "    │ │         {'user_id': 'U006', 'user_name': 'Emily White', 'num_orders': 5},                               │ │\n",
+       "    │ │         {'user_id': 'U007', 'user_name': 'Frank Harris', 'num_orders': 20},                             │ │\n",
+       "    │ │         {'user_id': 'U008', 'user_name': 'Grace Lee', 'num_orders': 18},                                │ │\n",
+       "    │ │         {'user_id': 'U009', 'user_name': 'Henry Clark', 'num_orders': 22},                              │ │\n",
+       "    │ │         {'user_id': 'U010', 'user_name': 'Ivy Walker', 'num_orders': 10}                                │ │\n",
        "    │ │     ]                                                                                                   │ │\n",
        "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
@@ -550,10 +547,7 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
@@ -599,54 +593,54 @@
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"user_orders\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"u001\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"U001\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"John Doe\",\u001b[0m\u001b[48;2;245;245;220m                                                                         \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 15\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 12\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"u002\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"U002\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Jane Smith\",\u001b[0m\u001b[48;2;245;245;220m                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 22\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 8\u001b[0m\u001b[48;2;245;245;220m                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"u003\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"U003\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Alice Johnson\",\u001b[0m\u001b[48;2;245;245;220m                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 8\u001b[0m\u001b[48;2;245;245;220m                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 25\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"u004\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"U004\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Bob Brown\",\u001b[0m\u001b[48;2;245;245;220m                                                                        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 30\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 15\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"u005\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"U005\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Charlie Davis\",\u001b[0m\u001b[48;2;245;245;220m                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 12\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 30\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"u006\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Diana Evans\",\u001b[0m\u001b[48;2;245;245;220m                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 25\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"U006\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Emily White\",\u001b[0m\u001b[48;2;245;245;220m                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 5\u001b[0m\u001b[48;2;245;245;220m                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"u007\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Eve Foster\",\u001b[0m\u001b[48;2;245;245;220m                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 18\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"U007\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Frank Harris\",\u001b[0m\u001b[48;2;245;245;220m                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 20\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"u008\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Frank Green\",\u001b[0m\u001b[48;2;245;245;220m                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 10\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"U008\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Grace Lee\",\u001b[0m\u001b[48;2;245;245;220m                                                                        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 18\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"u009\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Grace Hill\",\u001b[0m\u001b[48;2;245;245;220m                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 5\u001b[0m\u001b[48;2;245;245;220m                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"U009\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Henry Clark\",\u001b[0m\u001b[48;2;245;245;220m                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 22\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"u010\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Henry King\",\u001b[0m\u001b[48;2;245;245;220m                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 20\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_id\": \"U010\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"user_name\": \"Ivy Walker\",\u001b[0m\u001b[48;2;245;245;220m                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"num_orders\": 10\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    }\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  ]\u001b[0m\u001b[48;2;245;245;220m                                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -655,16 +649,16 @@
        "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'user_orders': [\u001b[0m\u001b[48;2;240;255;240m                                                                                   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'u001', 'user_name': 'John Doe', 'num_orders': 15},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'u002', 'user_name': 'Jane Smith', 'num_orders': 22},\u001b[0m\u001b[48;2;240;255;240m                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'u003', 'user_name': 'Alice Johnson', 'num_orders': 8},\u001b[0m\u001b[48;2;240;255;240m                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'u004', 'user_name': 'Bob Brown', 'num_orders': 30},\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'u005', 'user_name': 'Charlie Davis', 'num_orders': 12},\u001b[0m\u001b[48;2;240;255;240m                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'u006', 'user_name': 'Diana Evans', 'num_orders': 25},\u001b[0m\u001b[48;2;240;255;240m                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'u007', 'user_name': 'Eve Foster', 'num_orders': 18},\u001b[0m\u001b[48;2;240;255;240m                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'u008', 'user_name': 'Frank Green', 'num_orders': 10},\u001b[0m\u001b[48;2;240;255;240m                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'u009', 'user_name': 'Grace Hill', 'num_orders': 5},\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'u010', 'user_name': 'Henry King', 'num_orders': 20}\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'U001', 'user_name': 'John Doe', 'num_orders': 12},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'U002', 'user_name': 'Jane Smith', 'num_orders': 8},\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'U003', 'user_name': 'Alice Johnson', 'num_orders': 25},\u001b[0m\u001b[48;2;240;255;240m                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'U004', 'user_name': 'Bob Brown', 'num_orders': 15},\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'U005', 'user_name': 'Charlie Davis', 'num_orders': 30},\u001b[0m\u001b[48;2;240;255;240m                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'U006', 'user_name': 'Emily White', 'num_orders': 5},\u001b[0m\u001b[48;2;240;255;240m                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'U007', 'user_name': 'Frank Harris', 'num_orders': 20},\u001b[0m\u001b[48;2;240;255;240m                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'U008', 'user_name': 'Grace Lee', 'num_orders': 18},\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'U009', 'user_name': 'Henry Clark', 'num_orders': 22},\u001b[0m\u001b[48;2;240;255;240m                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 'U010', 'user_name': 'Ivy Walker', 'num_orders': 10}\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ]\u001b[0m\u001b[48;2;240;255;240m                                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
@@ -682,7 +676,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "tiff-env",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -696,7 +690,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.1"
+   "version": "3.12.3"
   },
   "orig_nbformat": 4
  },
diff --git a/docs/examples/generate_structured_data_cohere.ipynb b/docs/examples/generate_structured_data_cohere.ipynb
index 4f984dc36..9d36c84eb 100644
--- a/docs/examples/generate_structured_data_cohere.ipynb
+++ b/docs/examples/generate_structured_data_cohere.ipynb
@@ -41,7 +41,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 8,
    "id": "6a7c7d4a",
    "metadata": {},
    "outputs": [
@@ -60,10 +60,7 @@
       "Installing hub:\u001b[35m/\u001b[0m\u001b[35m/guardrails/\u001b[0m\u001b[95mvalid_range...\u001b[0m\n",
       "✅Successfully installed guardrails/valid_range!\n",
       "\n",
-      "\n",
-      "\n",
-      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.1\u001b[0m\n",
-      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n"
+      "\n"
      ]
     }
    ],
@@ -87,7 +84,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": 3,
    "id": "3088fd99",
    "metadata": {},
    "outputs": [],
@@ -127,14 +124,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 5,
    "id": "840006ca-21ca-4f76-9ce1-e406d5d68412",
    "metadata": {},
    "outputs": [],
    "source": [
     "# Add your OPENAI_API_KEY as an environment variable if it's not already set\n",
     "# import os\n",
-    "# os.environ[\"OPENAI_API_KEY\"] = \"YOUR_API_KEY\""
+    "# os.environ[\"COHERE_API_KEY\"] = \"YOUR_COHERE_API_KEY\""
    ]
   },
   {
@@ -147,10 +144,23 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": 6,
    "id": "42766922-14d0-4b5e-853a-23f05b896a09",
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_base.py:567: UserWarning: Validator with id 1-indexed was not found in the registry!  Ignoring...\n",
+      "  warn(f\"Validator with id {name} was not found in the registry!  Ignoring...\")\n",
+      "WARNING:guardrails-ai:Validator with id 1-indexed was not found in the registry!  Ignoring...\n",
+      "WARNING:guardrails-ai:Invalid arguments! ('1-indexed', 'noop')\n",
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    }
+   ],
    "source": [
     "from rich import print\n",
     "import guardrails as gd\n",
@@ -174,7 +184,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": 7,
    "id": "0e910d87",
    "metadata": {},
    "outputs": [
@@ -183,108 +193,115 @@
       "text/html": [
        "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Generate a dataset of fake user orders. Each row of the dataset should be valid. The format should not  │ │\n",
-       "    │ │ be a list, it should be a JSON object.                                                                  │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Given below is XML that describes the information to extract from this document and the tags to extract │ │\n",
-       "    │ │ it into.                                                                                                │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ <output>                                                                                                │ │\n",
-       "    │ │   <list description=\"Generate a list of users and how many orders they have placed in the past.\"        │ │\n",
-       "    │ │ format=\"guardrails/valid_length: 10 10\" name=\"user_orders\" required=\"true\">                             │ │\n",
-       "    │ │     <object format=\"guardrails/valid_length: 10 10\" required=\"true\">                                    │ │\n",
-       "    │ │       <integer description=\"The user's id.\" name=\"user_id\" required=\"true\"></integer>                   │ │\n",
-       "    │ │       <string description=\"The user's first name and last name\" format=\"guardrails/two_words\"           │ │\n",
-       "    │ │ name=\"user_name\" required=\"true\"></string>                                                              │ │\n",
-       "    │ │       <integer description=\"The number of orders the user has placed\" format=\"guardrails/valid_range: 0 │ │\n",
-       "    │ │ 50\" name=\"num_orders\" required=\"true\"></integer>                                                        │ │\n",
-       "    │ │     </object>                                                                                           │ │\n",
-       "    │ │   </list>                                                                                               │ │\n",
-       "    │ │ </output>                                                                                               │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the │ │\n",
-       "    │ │ `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding  │ │\n",
-       "    │ │ XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g.        │ │\n",
-       "    │ │ requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere,     │ │\n",
-       "    │ │ enter `null`.                                                                                           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:                          │ │\n",
-       "    │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`                     │ │\n",
-       "    │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO',     │ │\n",
-       "    │ │ etc.]}`                                                                                                 │ │\n",
-       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
-       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ an example of output may look like this:                                                                │ │\n",
-       "    │ │ {                                                                                                       │ │\n",
-       "    │ │         \"user_orders\": [{                                                                               │ │\n",
-       "    │ │ │ │                                                                                                     │ │\n",
-       "    │ │         \"user_id\": 1,                                                                                   │ │\n",
-       "    │ │         \"user_name\": \"John Mcdonald\",                                                                   │ │\n",
-       "    │ │         \"num_orders\": 6                                                                                 │ │\n",
-       "    │ │     }]                                                                                                  │ │\n",
-       "    │ │ }                                                                                                       │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
+       "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ user │                                                                                              │ │ │\n",
+       "    │ │ │      │ Generate a dataset of fake user orders. Each row of the dataset should be valid. The format  │ │ │\n",
+       "    │ │ │      │ should not be a list, it should be a JSON object.                                            │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Given below is XML that describes the information to extract from this document and the tags │ │ │\n",
+       "    │ │ │      │ to extract it into.                                                                          │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ <output>                                                                                     │ │ │\n",
+       "    │ │ │      │   <list description=\"Generate a list of users and how many orders they have placed in the    │ │ │\n",
+       "    │ │ │      │ past.\" format=\"guardrails/valid_length: 10 10\" name=\"user_orders\" required=\"true\">           │ │ │\n",
+       "    │ │ │      │     <object format=\"guardrails/valid_length: 10 10\" required=\"true\">                         │ │ │\n",
+       "    │ │ │      │       <integer description=\"The user's id.\" name=\"user_id\" required=\"true\"></integer>        │ │ │\n",
+       "    │ │ │      │       <string description=\"The user's first name and last name\"                              │ │ │\n",
+       "    │ │ │      │ format=\"guardrails/two_words\" name=\"user_name\" required=\"true\"></string>                     │ │ │\n",
+       "    │ │ │      │       <integer description=\"The number of orders the user has placed\"                        │ │ │\n",
+       "    │ │ │      │ format=\"guardrails/valid_range: 0 50\" name=\"num_orders\" required=\"true\"></integer>           │ │ │\n",
+       "    │ │ │      │     </object>                                                                                │ │ │\n",
+       "    │ │ │      │   </list>                                                                                    │ │ │\n",
+       "    │ │ │      │ </output>                                                                                    │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in  │ │ │\n",
+       "    │ │ │      │ JSON is the `name` attribute of the corresponding XML, and the value is of the type          │ │ │\n",
+       "    │ │ │      │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │ │\n",
+       "    │ │ │      │ any types and format requests e.g. requests for lists, objects and specific types. Be        │ │ │\n",
+       "    │ │ │      │ correct and concise. If you are unsure anywhere, enter `null`.                               │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:               │ │ │\n",
+       "    │ │ │      │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`          │ │ │\n",
+       "    │ │ │      │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',        │ │ │\n",
+       "    │ │ │      │ 'STRING TWO', etc.]}`                                                                        │ │ │\n",
+       "    │ │ │      │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer            │ │ │\n",
+       "    │ │ │      │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':     │ │ │\n",
+       "    │ │ │      │ 1}}`                                                                                         │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ an example of output may look like this:                                                     │ │ │\n",
+       "    │ │ │      │ {                                                                                            │ │ │\n",
+       "    │ │ │      │         \"user_orders\": [{                                                                    │ │ │\n",
+       "    │ │ │      │ │ │                                                                                          │ │ │\n",
+       "    │ │ │      │         \"user_id\": 1,                                                                        │ │ │\n",
+       "    │ │ │      │         \"user_name\": \"John Mcdonald\",                                                        │ │ │\n",
+       "    │ │ │      │         \"num_orders\": 6                                                                      │ │ │\n",
+       "    │ │ │      │     }]                                                                                       │ │ │\n",
+       "    │ │ │      │ }                                                                                            │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │     \"user_orders\": [                                                                                    │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 3,                                                                               │ │\n",
+       "    │ │             \"user_id\": 2,                                                                               │ │\n",
        "    │ │             \"user_name\": \"Jane Smith\",                                                                  │ │\n",
        "    │ │             \"num_orders\": 12                                                                            │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 1,                                                                               │ │\n",
-       "    │ │             \"user_name\": \"Michael Jones\",                                                               │ │\n",
-       "    │ │             \"num_orders\": 18                                                                            │ │\n",
+       "    │ │             \"user_id\": 22,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Alice Johnson\",                                                               │ │\n",
+       "    │ │             \"num_orders\": 5                                                                             │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 4,                                                                               │ │\n",
-       "    │ │             \"user_name\": \"Mary Brown\",                                                                  │ │\n",
-       "    │ │             \"num_orders\": 9                                                                             │ │\n",
+       "    │ │             \"user_id\": 11,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Bob Williams\",                                                                │ │\n",
+       "    │ │             \"num_orders\": 23                                                                            │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 2,                                                                               │ │\n",
-       "    │ │             \"user_name\": \"David Miller\",                                                                │ │\n",
-       "    │ │             \"num_orders\": 21                                                                            │ │\n",
+       "    │ │             \"user_id\": 6,                                                                               │ │\n",
+       "    │ │             \"user_name\": \"David Jones\",                                                                 │ │\n",
+       "    │ │             \"num_orders\": 14                                                                            │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 5,                                                                               │ │\n",
-       "    │ │             \"user_name\": \"Linda Martin\",                                                                │ │\n",
-       "    │ │             \"num_orders\": 15                                                                            │ │\n",
+       "    │ │             \"user_id\": 19,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Michelle Brown\",                                                              │ │\n",
+       "    │ │             \"num_orders\": 10                                                                            │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 6,                                                                               │ │\n",
-       "    │ │             \"user_name\": \"Robert Wilson\",                                                               │ │\n",
-       "    │ │             \"num_orders\": 7                                                                             │ │\n",
+       "    │ │             \"user_id\": 10,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Michael Miller\",                                                              │ │\n",
+       "    │ │             \"num_orders\": 18                                                                            │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 7,                                                                               │ │\n",
-       "    │ │             \"user_name\": \"Jennifer Taylor\",                                                             │ │\n",
-       "    │ │             \"num_orders\": 10                                                                            │ │\n",
+       "    │ │             \"user_id\": 15,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Jessica Taylor\",                                                              │ │\n",
+       "    │ │             \"num_orders\": 2                                                                             │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 8,                                                                               │ │\n",
-       "    │ │             \"user_name\": \"Kevin Anderson\",                                                              │ │\n",
-       "    │ │             \"num_orders\": 4                                                                             │ │\n",
+       "    │ │             \"user_id\": 21,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"William Ian\",                                                                 │ │\n",
+       "    │ │             \"num_orders\": 16                                                                            │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 9,                                                                               │ │\n",
-       "    │ │             \"user_name\": \"Sarah Thompson\",                                                              │ │\n",
-       "    │ │             \"num_orders\": 23                                                                            │ │\n",
+       "    │ │             \"user_id\": 16,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Sophia Martinez\",                                                             │ │\n",
+       "    │ │             \"num_orders\": 7                                                                             │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 10,                                                                              │ │\n",
-       "    │ │             \"user_name\": \"Frank Davis\",                                                                 │ │\n",
-       "    │ │             \"num_orders\": 11                                                                            │ │\n",
+       "    │ │             \"user_id\": 8,                                                                               │ │\n",
+       "    │ │             \"user_name\": \"Daniel Park\",                                                                 │ │\n",
+       "    │ │             \"num_orders\": 28                                                                            │ │\n",
+       "    │ │         },                                                                                              │ │\n",
+       "    │ │         {                                                                                               │ │\n",
+       "    │ │             \"user_id\": 14,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Olivia Robinson\",                                                             │ │\n",
+       "    │ │             \"num_orders\": 4                                                                             │ │\n",
        "    │ │         }                                                                                               │ │\n",
        "    │ │     ]                                                                                                   │ │\n",
        "    │ │ }                                                                                                       │ │\n",
@@ -292,16 +309,17 @@
        "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │     'user_orders': [                                                                                    │ │\n",
-       "    │ │         {'user_id': 3, 'user_name': 'Jane Smith', 'num_orders': 12},                                    │ │\n",
-       "    │ │         {'user_id': 1, 'user_name': 'Michael Jones', 'num_orders': 18},                                 │ │\n",
-       "    │ │         {'user_id': 4, 'user_name': 'Mary Brown', 'num_orders': 9},                                     │ │\n",
-       "    │ │         {'user_id': 2, 'user_name': 'David Miller', 'num_orders': 21},                                  │ │\n",
-       "    │ │         {'user_id': 5, 'user_name': 'Linda Martin', 'num_orders': 15},                                  │ │\n",
-       "    │ │         {'user_id': 6, 'user_name': 'Robert Wilson', 'num_orders': 7},                                  │ │\n",
-       "    │ │         {'user_id': 7, 'user_name': 'Jennifer Taylor', 'num_orders': 10},                               │ │\n",
-       "    │ │         {'user_id': 8, 'user_name': 'Kevin Anderson', 'num_orders': 4},                                 │ │\n",
-       "    │ │         {'user_id': 9, 'user_name': 'Sarah Thompson', 'num_orders': 23},                                │ │\n",
-       "    │ │         {'user_id': 10, 'user_name': 'Frank Davis', 'num_orders': 11}                                   │ │\n",
+       "    │ │         {'user_id': 2, 'user_name': 'Jane Smith', 'num_orders': 12},                                    │ │\n",
+       "    │ │         {'user_id': 22, 'user_name': 'Alice Johnson', 'num_orders': 5},                                 │ │\n",
+       "    │ │         {'user_id': 11, 'user_name': 'Bob Williams', 'num_orders': 23},                                 │ │\n",
+       "    │ │         {'user_id': 6, 'user_name': 'David Jones', 'num_orders': 14},                                   │ │\n",
+       "    │ │         {'user_id': 19, 'user_name': 'Michelle Brown', 'num_orders': 10},                               │ │\n",
+       "    │ │         {'user_id': 10, 'user_name': 'Michael Miller', 'num_orders': 18},                               │ │\n",
+       "    │ │         {'user_id': 15, 'user_name': 'Jessica Taylor', 'num_orders': 2},                                │ │\n",
+       "    │ │         {'user_id': 21, 'user_name': 'William Ian', 'num_orders': 16},                                  │ │\n",
+       "    │ │         {'user_id': 16, 'user_name': 'Sophia Martinez', 'num_orders': 7},                               │ │\n",
+       "    │ │         {'user_id': 8, 'user_name': 'Daniel Park', 'num_orders': 28},                                   │ │\n",
+       "    │ │         {'user_id': 14, 'user_name': 'Olivia Robinson', 'num_orders': 4}                                │ │\n",
        "    │ │     ]                                                                                                   │ │\n",
        "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
@@ -311,108 +329,115 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mGenerate a dataset of fake user orders. Each row of the dataset should be valid. The format should not \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mbe a list, it should be a JSON object.\u001b[0m\u001b[48;2;240;248;255m                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mGiven below is XML that describes the information to extract from this document and the tags to extract\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mit into.\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                            \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                             \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m`name` attribute of the corresponding XML, and the value is of the type specified by the corresponding \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mXML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mrequests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, \u001b[0m\u001b[48;2;240;248;255m   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255menter `null`.\u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mHere are examples of simple (XML, JSON) pairs that show the expected behavior:\u001b[0m\u001b[48;2;240;248;255m                         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m- `` => `{'foo': 'example one'}`\u001b[0m\u001b[48;2;240;248;255m                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m- `` => `{\"bar\": ['STRING ONE', 'STRING TWO', \u001b[0m\u001b[48;2;240;248;255m   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255metc.]}`\u001b[0m\u001b[48;2;240;248;255m                                                                                                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;240;248;255m                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255man example of output may look like this:\u001b[0m\u001b[48;2;240;248;255m                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m{\u001b[0m\u001b[48;2;240;248;255m                                                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m        \"user_orders\": [{                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│ │\u001b[0m\u001b[48;2;240;248;255m                                                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m        \"user_id\": 1,\u001b[0m\u001b[48;2;240;248;255m                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m        \"user_name\": \"John Mcdonald\",\u001b[0m\u001b[48;2;240;248;255m                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m        \"num_orders\": 6\u001b[0m\u001b[48;2;240;248;255m                                                                                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    }]\u001b[0m\u001b[48;2;240;248;255m                                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m}\u001b[0m\u001b[48;2;240;248;255m                                                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGenerate a dataset of fake user orders. Each row of the dataset should be valid. The format \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mshould not be a list, it should be a JSON object.                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the tags\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mto extract it into.                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field in \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mJSON is the `name` attribute of the corresponding XML, and the value is of the type         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, including\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many types and format requests e.g. requests for lists, objects and specific types. Be       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcorrect and concise. If you are unsure anywhere, enter `null`.                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior:              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}`         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE',       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}`                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index':    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}`                                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235man example of output may look like this:                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m{                                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"user_orders\": [{                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│ │                                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"user_id\": 1,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"user_name\": \"John Mcdonald\",                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"num_orders\": 6                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    }]                                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m}                                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"user_orders\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 3,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 2,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Jane Smith\",\u001b[0m\u001b[48;2;245;245;220m                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 12\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 1,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Michael Jones\",\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 18\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 22,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Alice Johnson\",\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 5\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 4,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Mary Brown\",\u001b[0m\u001b[48;2;245;245;220m                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 9\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 11,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Bob Williams\",\u001b[0m\u001b[48;2;245;245;220m                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 23\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 2,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"David Miller\",\u001b[0m\u001b[48;2;245;245;220m                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 21\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 6,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"David Jones\",\u001b[0m\u001b[48;2;245;245;220m                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 14\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 5,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Linda Martin\",\u001b[0m\u001b[48;2;245;245;220m                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 15\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 19,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Michelle Brown\",\u001b[0m\u001b[48;2;245;245;220m                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 10\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 6,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Robert Wilson\",\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 7\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 10,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Michael Miller\",\u001b[0m\u001b[48;2;245;245;220m                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 18\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 7,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Jennifer Taylor\",\u001b[0m\u001b[48;2;245;245;220m                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 10\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 15,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Jessica Taylor\",\u001b[0m\u001b[48;2;245;245;220m                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 2\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 8,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Kevin Anderson\",\u001b[0m\u001b[48;2;245;245;220m                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 4\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 21,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"William Ian\",\u001b[0m\u001b[48;2;245;245;220m                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 16\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 9,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Sarah Thompson\",\u001b[0m\u001b[48;2;245;245;220m                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 23\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 16,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Sophia Martinez\",\u001b[0m\u001b[48;2;245;245;220m                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 7\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 10,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Frank Davis\",\u001b[0m\u001b[48;2;245;245;220m                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 11\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 8,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Daniel Park\",\u001b[0m\u001b[48;2;245;245;220m                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 28\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 14,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Olivia Robinson\",\u001b[0m\u001b[48;2;245;245;220m                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 4\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        }\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    ]\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -420,16 +445,17 @@
        "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'user_orders': [\u001b[0m\u001b[48;2;240;255;240m                                                                                   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 3, 'user_name': 'Jane Smith', 'num_orders': 12},\u001b[0m\u001b[48;2;240;255;240m                                   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 1, 'user_name': 'Michael Jones', 'num_orders': 18},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 4, 'user_name': 'Mary Brown', 'num_orders': 9},\u001b[0m\u001b[48;2;240;255;240m                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 2, 'user_name': 'David Miller', 'num_orders': 21},\u001b[0m\u001b[48;2;240;255;240m                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 5, 'user_name': 'Linda Martin', 'num_orders': 15},\u001b[0m\u001b[48;2;240;255;240m                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 6, 'user_name': 'Robert Wilson', 'num_orders': 7},\u001b[0m\u001b[48;2;240;255;240m                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 7, 'user_name': 'Jennifer Taylor', 'num_orders': 10},\u001b[0m\u001b[48;2;240;255;240m                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 8, 'user_name': 'Kevin Anderson', 'num_orders': 4},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 9, 'user_name': 'Sarah Thompson', 'num_orders': 23},\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 10, 'user_name': 'Frank Davis', 'num_orders': 11}\u001b[0m\u001b[48;2;240;255;240m                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 2, 'user_name': 'Jane Smith', 'num_orders': 12},\u001b[0m\u001b[48;2;240;255;240m                                   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 22, 'user_name': 'Alice Johnson', 'num_orders': 5},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 11, 'user_name': 'Bob Williams', 'num_orders': 23},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 6, 'user_name': 'David Jones', 'num_orders': 14},\u001b[0m\u001b[48;2;240;255;240m                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 19, 'user_name': 'Michelle Brown', 'num_orders': 10},\u001b[0m\u001b[48;2;240;255;240m                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 10, 'user_name': 'Michael Miller', 'num_orders': 18},\u001b[0m\u001b[48;2;240;255;240m                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 15, 'user_name': 'Jessica Taylor', 'num_orders': 2},\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 21, 'user_name': 'William Ian', 'num_orders': 16},\u001b[0m\u001b[48;2;240;255;240m                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 16, 'user_name': 'Sophia Martinez', 'num_orders': 7},\u001b[0m\u001b[48;2;240;255;240m                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 8, 'user_name': 'Daniel Park', 'num_orders': 28},\u001b[0m\u001b[48;2;240;255;240m                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 14, 'user_name': 'Olivia Robinson', 'num_orders': 4}\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ]\u001b[0m\u001b[48;2;240;255;240m                                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
@@ -449,7 +475,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -463,7 +489,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.1"
+   "version": "3.12.3"
   }
  },
  "nbformat": 4,
diff --git a/docs/examples/guardrails_server.ipynb b/docs/examples/guardrails_server.ipynb
index 86d04bd11..ce61fac4e 100644
--- a/docs/examples/guardrails_server.ipynb
+++ b/docs/examples/guardrails_server.ipynb
@@ -38,7 +38,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [
     {
@@ -46,9 +46,7 @@
      "output_type": "stream",
      "text": [
       "Installing hub:\u001b[35m/\u001b[0m\u001b[35m/guardrails/\u001b[0m\u001b[95mregex_match...\u001b[0m\n",
-      "✅Successfully installed guardrails/regex_match!\n",
-      "\n",
-      "\n"
+      "ERROR:guardrails-cli:No module named 'guardrails.hub.guardrails.regex_match'\n"
      ]
     }
    ],
@@ -68,14 +66,13 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "some-token\n",
       "http://localhost:8000\n"
      ]
     }
@@ -91,15 +88,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
        "
ValidationOutcome(\n",
-       "    call_id='5103958320',\n",
+       "    call_id='14555109792',\n",
        "    raw_llm_output='Guardrails AI',\n",
+       "    validation_summaries=[],\n",
        "    validated_output='Guardrails AI',\n",
        "    reask=None,\n",
        "    validation_passed=True,\n",
@@ -109,8 +107,9 @@
       ],
       "text/plain": [
        "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n",
-       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'5103958320'\u001b[0m,\n",
+       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'14555109792'\u001b[0m,\n",
        "    \u001b[33mraw_llm_output\u001b[0m=\u001b[32m'Guardrails AI'\u001b[0m,\n",
+       "    \u001b[33mvalidation_summaries\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
        "    \u001b[33mvalidated_output\u001b[0m=\u001b[32m'Guardrails AI'\u001b[0m,\n",
        "    \u001b[33mreask\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "    \u001b[33mvalidation_passed\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n",
@@ -142,7 +141,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [
     {
@@ -150,17 +149,18 @@
       "text/html": [
        "
[\n",
        "    Call(\n",
-       "        id='5103958320',\n",
+       "        id='14416771056',\n",
        "        iterations=[\n",
        "            Iteration(\n",
-       "                id='5107862496',\n",
+       "                id='14545443632',\n",
        "                index=0,\n",
-       "                call_id='5103958320',\n",
+       "                call_id='14416771056',\n",
        "                inputs=Inputs(\n",
        "                    llm_api=None,\n",
        "                    llm_output='Guardrails AI',\n",
        "                    instructions=None,\n",
        "                    prompt=None,\n",
+       "                    messages=None,\n",
        "                    msg_history=None,\n",
        "                    prompt_params={},\n",
        "                    num_reasks=0,\n",
@@ -185,19 +185,167 @@
        "                        ValidatorLogs(\n",
        "                            validator_name='RegexMatch',\n",
        "                            registered_name='guardrails/regex_match',\n",
-       "                            instance_id=4636712336,\n",
+       "                            instance_id=6127616944,\n",
        "                            property_path='$',\n",
        "                            value_before_validation='Guardrails AI',\n",
        "                            value_after_validation='Guardrails AI',\n",
        "                            validation_result=PassResult(\n",
        "                                outcome='pass',\n",
        "                                value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                                metadata=None,\n",
+       "                                validated_chunk=None\n",
+       "                            ),\n",
+       "                            start_time=datetime.datetime(2024, 10, 10, 14, 24, 31, 706666),\n",
+       "                            end_time=datetime.datetime(2024, 10, 10, 14, 24, 31, 790514)\n",
+       "                        )\n",
+       "                    ],\n",
+       "                    error=None,\n",
+       "                    exception=None\n",
+       "                )\n",
+       "            )\n",
+       "        ],\n",
+       "        inputs=CallInputs(\n",
+       "            llm_api=None,\n",
+       "            llm_output=None,\n",
+       "            instructions=None,\n",
+       "            prompt=None,\n",
+       "            msg_history=None,\n",
+       "            messages=None,\n",
+       "            prompt_params={},\n",
+       "            num_reasks=0,\n",
+       "            metadata={},\n",
+       "            full_schema_reask=False,\n",
+       "            stream=False,\n",
+       "            args=[],\n",
+       "            kwargs={'api_key': '****************************************************EnZS'}\n",
+       "        ),\n",
+       "        exception=None\n",
+       "    ),\n",
+       "    Call(\n",
+       "        id='14555105232',\n",
+       "        iterations=[\n",
+       "            Iteration(\n",
+       "                id='14555107312',\n",
+       "                index=0,\n",
+       "                call_id='14555105232',\n",
+       "                inputs=Inputs(\n",
+       "                    llm_api=None,\n",
+       "                    llm_output='Guardrails AI',\n",
+       "                    instructions=None,\n",
+       "                    prompt=None,\n",
+       "                    messages=None,\n",
+       "                    msg_history=None,\n",
+       "                    prompt_params={},\n",
+       "                    num_reasks=0,\n",
+       "                    metadata={},\n",
+       "                    full_schema_reask=False,\n",
+       "                    stream=False\n",
+       "                ),\n",
+       "                outputs=Outputs(\n",
+       "                    llm_response_info=LLMResponse(\n",
+       "                        prompt_token_count=None,\n",
+       "                        response_token_count=None,\n",
+       "                        output='Guardrails AI',\n",
+       "                        stream_output=None,\n",
+       "                        async_stream_output=None\n",
+       "                    ),\n",
+       "                    raw_output=None,\n",
+       "                    parsed_output='Guardrails AI',\n",
+       "                    validation_response='Guardrails AI',\n",
+       "                    guarded_output='Guardrails AI',\n",
+       "                    reasks=[],\n",
+       "                    validator_logs=[\n",
+       "                        ValidatorLogs(\n",
+       "                            validator_name='RegexMatch',\n",
+       "                            registered_name='guardrails/regex_match',\n",
+       "                            instance_id=6127616944,\n",
+       "                            property_path='$',\n",
+       "                            value_before_validation='Guardrails AI',\n",
+       "                            value_after_validation='Guardrails AI',\n",
+       "                            validation_result=PassResult(\n",
+       "                                outcome='pass',\n",
+       "                                value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                                metadata=None,\n",
+       "                                validated_chunk=None\n",
+       "                            ),\n",
+       "                            start_time=datetime.datetime(2024, 10, 10, 14, 24, 41, 134226),\n",
+       "                            end_time=datetime.datetime(2024, 10, 10, 14, 24, 41, 204882)\n",
+       "                        )\n",
+       "                    ],\n",
+       "                    error=None,\n",
+       "                    exception=None\n",
+       "                )\n",
+       "            )\n",
+       "        ],\n",
+       "        inputs=CallInputs(\n",
+       "            llm_api=None,\n",
+       "            llm_output=None,\n",
+       "            instructions=None,\n",
+       "            prompt=None,\n",
+       "            msg_history=None,\n",
+       "            messages=None,\n",
+       "            prompt_params={},\n",
+       "            num_reasks=0,\n",
+       "            metadata={},\n",
+       "            full_schema_reask=False,\n",
+       "            stream=False,\n",
+       "            args=[],\n",
+       "            kwargs={'api_key': '****************************************************EnZS'}\n",
+       "        ),\n",
+       "        exception=None\n",
+       "    ),\n",
+       "    Call(\n",
+       "        id='14555109792',\n",
+       "        iterations=[\n",
+       "            Iteration(\n",
+       "                id='14555110912',\n",
+       "                index=0,\n",
+       "                call_id='14555109792',\n",
+       "                inputs=Inputs(\n",
+       "                    llm_api=None,\n",
+       "                    llm_output='Guardrails AI',\n",
+       "                    instructions=None,\n",
+       "                    prompt=None,\n",
+       "                    messages=None,\n",
+       "                    msg_history=None,\n",
+       "                    prompt_params={},\n",
+       "                    num_reasks=0,\n",
+       "                    metadata={},\n",
+       "                    full_schema_reask=False,\n",
+       "                    stream=False\n",
+       "                ),\n",
+       "                outputs=Outputs(\n",
+       "                    llm_response_info=LLMResponse(\n",
+       "                        prompt_token_count=None,\n",
+       "                        response_token_count=None,\n",
+       "                        output='Guardrails AI',\n",
+       "                        stream_output=None,\n",
+       "                        async_stream_output=None\n",
+       "                    ),\n",
+       "                    raw_output=None,\n",
+       "                    parsed_output='Guardrails AI',\n",
+       "                    validation_response='Guardrails AI',\n",
+       "                    guarded_output='Guardrails AI',\n",
+       "                    reasks=[],\n",
+       "                    validator_logs=[\n",
+       "                        ValidatorLogs(\n",
+       "                            validator_name='RegexMatch',\n",
+       "                            registered_name='guardrails/regex_match',\n",
+       "                            instance_id=6127616944,\n",
+       "                            property_path='$',\n",
+       "                            value_before_validation='Guardrails AI',\n",
+       "                            value_after_validation='Guardrails AI',\n",
+       "                            validation_result=PassResult(\n",
+       "                                outcome='pass',\n",
+       "                                value_override=<class \n",
        "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
        "                                metadata=None,\n",
        "                                validated_chunk=None\n",
        "                            ),\n",
-       "                            start_time=datetime.datetime(2024, 6, 27, 14, 14, 20, 649099),\n",
-       "                            end_time=datetime.datetime(2024, 6, 27, 14, 14, 20, 651227)\n",
+       "                            start_time=datetime.datetime(2024, 10, 10, 14, 25, 46, 566512),\n",
+       "                            end_time=datetime.datetime(2024, 10, 10, 14, 25, 46, 637393)\n",
        "                        )\n",
        "                    ],\n",
        "                    error=None,\n",
@@ -211,13 +359,14 @@
        "            instructions=None,\n",
        "            prompt=None,\n",
        "            msg_history=None,\n",
+       "            messages=None,\n",
        "            prompt_params={},\n",
        "            num_reasks=0,\n",
        "            metadata={},\n",
        "            full_schema_reask=False,\n",
        "            stream=False,\n",
        "            args=[],\n",
-       "            kwargs={'api_key': '***********************************************69ck'}\n",
+       "            kwargs={'api_key': '****************************************************EnZS'}\n",
        "        ),\n",
        "        exception=None\n",
        "    )\n",
@@ -227,17 +376,18 @@
       "text/plain": [
        "\u001b[1m[\u001b[0m\n",
        "    \u001b[1;35mCall\u001b[0m\u001b[1m(\u001b[0m\n",
-       "        \u001b[33mid\u001b[0m=\u001b[32m'5103958320'\u001b[0m,\n",
+       "        \u001b[33mid\u001b[0m=\u001b[32m'14416771056'\u001b[0m,\n",
        "        \u001b[33miterations\u001b[0m=\u001b[1m[\u001b[0m\n",
        "            \u001b[1;35mIteration\u001b[0m\u001b[1m(\u001b[0m\n",
-       "                \u001b[33mid\u001b[0m=\u001b[32m'5107862496'\u001b[0m,\n",
+       "                \u001b[33mid\u001b[0m=\u001b[32m'14545443632'\u001b[0m,\n",
        "                \u001b[33mindex\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "                \u001b[33mcall_id\u001b[0m=\u001b[32m'5103958320'\u001b[0m,\n",
+       "                \u001b[33mcall_id\u001b[0m=\u001b[32m'14416771056'\u001b[0m,\n",
        "                \u001b[33minputs\u001b[0m=\u001b[1;35mInputs\u001b[0m\u001b[1m(\u001b[0m\n",
        "                    \u001b[33mllm_api\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "                    \u001b[33mllm_output\u001b[0m=\u001b[32m'Guardrails AI'\u001b[0m,\n",
        "                    \u001b[33minstructions\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "                    \u001b[33mprompt\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+       "                    \u001b[33mmessages\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "                    \u001b[33mmsg_history\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "                    \u001b[33mprompt_params\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n",
        "                    \u001b[33mnum_reasks\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
@@ -262,19 +412,167 @@
        "                        \u001b[1;35mValidatorLogs\u001b[0m\u001b[1m(\u001b[0m\n",
        "                            \u001b[33mvalidator_name\u001b[0m=\u001b[32m'RegexMatch'\u001b[0m,\n",
        "                            \u001b[33mregistered_name\u001b[0m=\u001b[32m'guardrails/regex_match'\u001b[0m,\n",
-       "                            \u001b[33minstance_id\u001b[0m=\u001b[1;36m4636712336\u001b[0m,\n",
+       "                            \u001b[33minstance_id\u001b[0m=\u001b[1;36m6127616944\u001b[0m,\n",
        "                            \u001b[33mproperty_path\u001b[0m=\u001b[32m'$'\u001b[0m,\n",
        "                            \u001b[33mvalue_before_validation\u001b[0m=\u001b[32m'Guardrails AI'\u001b[0m,\n",
        "                            \u001b[33mvalue_after_validation\u001b[0m=\u001b[32m'Guardrails AI'\u001b[0m,\n",
        "                            \u001b[33mvalidation_result\u001b[0m=\u001b[1;35mPassResult\u001b[0m\u001b[1m(\u001b[0m\n",
        "                                \u001b[33moutcome\u001b[0m=\u001b[32m'pass'\u001b[0m,\n",
        "                                \u001b[33mvalue_override\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\n",
+       "\u001b[32m'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'\u001b[0m\u001b[39m>,\u001b[0m\n",
+       "\u001b[39m                                \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                                \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m24\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m706666\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m24\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m790514\u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33merror\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mexception\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[39m        \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m        \u001b[0m\u001b[33minputs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mCallInputs\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mllm_api\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mllm_output\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33minstructions\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mprompt\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mmsg_history\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mmessages\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mprompt_params\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m{\u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mnum_reasks\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m{\u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mfull_schema_reask\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mstream\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33margs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mkwargs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m{\u001b[0m\u001b[32m'api_key'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'****************************************************EnZS'\u001b[0m\u001b[1;39m}\u001b[0m\n",
+       "\u001b[39m        \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m        \u001b[0m\u001b[33mexception\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[39m    \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m    \u001b[0m\u001b[1;35mCall\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m        \u001b[0m\u001b[33mid\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'14555105232'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m        \u001b[0m\u001b[33miterations\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[1;35mIteration\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[33mid\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'14555107312'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[33mindex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[33mcall_id\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'14555105232'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[33minputs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mInputs\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mllm_api\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mllm_output\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33minstructions\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mprompt\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mmessages\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mmsg_history\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mprompt_params\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m{\u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mnum_reasks\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m{\u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mfull_schema_reask\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mstream\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[33moutputs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mOutputs\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mllm_response_info\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mLLMResponse\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[33mprompt_token_count\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[33mresponse_token_count\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[33moutput\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[33mstream_output\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[33masync_stream_output\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mraw_output\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mparsed_output\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mvalidation_response\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mguarded_output\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mreasks\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mvalidator_logs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'RegexMatch'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/regex_match'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m6127616944\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m                                \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                                \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[39m                                \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                                \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m24\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m41\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m134226\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m24\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m41\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m204882\u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33merror\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mexception\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[39m        \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m        \u001b[0m\u001b[33minputs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mCallInputs\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mllm_api\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mllm_output\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33minstructions\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mprompt\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mmsg_history\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mmessages\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mprompt_params\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m{\u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mnum_reasks\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m{\u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mfull_schema_reask\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mstream\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33margs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[33mkwargs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m{\u001b[0m\u001b[32m'api_key'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'****************************************************EnZS'\u001b[0m\u001b[1;39m}\u001b[0m\n",
+       "\u001b[39m        \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m        \u001b[0m\u001b[33mexception\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[39m    \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m    \u001b[0m\u001b[1;35mCall\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m        \u001b[0m\u001b[33mid\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'14555109792'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m        \u001b[0m\u001b[33miterations\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[39m            \u001b[0m\u001b[1;35mIteration\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[33mid\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'14555110912'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[33mindex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[33mcall_id\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'14555109792'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[33minputs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mInputs\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mllm_api\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mllm_output\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33minstructions\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mprompt\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mmessages\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mmsg_history\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mprompt_params\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m{\u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mnum_reasks\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m{\u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mfull_schema_reask\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mstream\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                \u001b[0m\u001b[33moutputs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mOutputs\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mllm_response_info\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mLLMResponse\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[33mprompt_token_count\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[33mresponse_token_count\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[33moutput\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[33mstream_output\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[33masync_stream_output\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mraw_output\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mparsed_output\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mvalidation_response\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mguarded_output\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mreasks\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                    \u001b[0m\u001b[33mvalidator_logs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[39m                        \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'RegexMatch'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/regex_match'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m6127616944\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Guardrails AI'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                            \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[39m                                \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[39m                                \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=\u001b[0m,\n",
        "                                \u001b[33mmetadata\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "                                \u001b[33mvalidated_chunk\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
        "                            \u001b[1m)\u001b[0m,\n",
-       "                            \u001b[33mstart_time\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m6\u001b[0m, \u001b[1;36m27\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m20\u001b[0m, \u001b[1;36m649099\u001b[0m\u001b[1m)\u001b[0m,\n",
-       "                            \u001b[33mend_time\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m6\u001b[0m, \u001b[1;36m27\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m20\u001b[0m, \u001b[1;36m651227\u001b[0m\u001b[1m)\u001b[0m\n",
+       "                            \u001b[33mstart_time\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m25\u001b[0m, \u001b[1;36m46\u001b[0m, \u001b[1;36m566512\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "                            \u001b[33mend_time\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m25\u001b[0m, \u001b[1;36m46\u001b[0m, \u001b[1;36m637393\u001b[0m\u001b[1m)\u001b[0m\n",
        "                        \u001b[1m)\u001b[0m\n",
        "                    \u001b[1m]\u001b[0m,\n",
        "                    \u001b[33merror\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
@@ -288,13 +586,14 @@
        "            \u001b[33minstructions\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "            \u001b[33mprompt\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "            \u001b[33mmsg_history\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+       "            \u001b[33mmessages\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "            \u001b[33mprompt_params\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n",
        "            \u001b[33mnum_reasks\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
        "            \u001b[33mmetadata\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n",
        "            \u001b[33mfull_schema_reask\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
        "            \u001b[33mstream\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
        "            \u001b[33margs\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "            \u001b[33mkwargs\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'api_key'\u001b[0m: \u001b[32m'***********************************************69ck'\u001b[0m\u001b[1m}\u001b[0m\n",
+       "            \u001b[33mkwargs\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'api_key'\u001b[0m: \u001b[32m'****************************************************EnZS'\u001b[0m\u001b[1m}\u001b[0m\n",
        "        \u001b[1m)\u001b[0m,\n",
        "        \u001b[33mexception\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
        "    \u001b[1m)\u001b[0m\n",
@@ -312,7 +611,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": ".venv",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -326,7 +625,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.1"
+   "version": "3.12.3"
   }
  },
  "nbformat": 4,
diff --git a/docs/examples/guardrails_with_chat_models.ipynb b/docs/examples/guardrails_with_chat_models.ipynb
index e5d93c12a..a9d89d002 100644
--- a/docs/examples/guardrails_with_chat_models.ipynb
+++ b/docs/examples/guardrails_with_chat_models.ipynb
@@ -62,14 +62,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/Users/dtam/.pyenv/versions/3.12.1/lib/python3.12/site-packages/pypdfium2/_helpers/textpage.py:80: UserWarning: get_text_range() call with default params will be implicitly redirected to get_text_bounded()\n",
+      "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/pypdfium2/_helpers/textpage.py:80: UserWarning: get_text_range() call with default params will be implicitly redirected to get_text_bounded()\n",
       "  warnings.warn(\"get_text_range() call with default params will be implicitly redirected to get_text_bounded()\")\n"
      ]
     },
@@ -119,24 +119,21 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## Step 1: Create the RAIL Spec with `` tags\n",
+    "## Step 1: Create the RAIL Spec with `` tags\n",
     "\n",
-    "In order to use Guardrails with a chat model, we need to add `` tags to the RAIL spec. These tags will be used to generate the system message for the chat model.\n",
+    "In order to use Guardrails with a chat model, we need to add `` tags to the RAIL spec. Here's an example illustrating the differences using a system message and user messages.\n",
     "\n",
-    "Ordinarily, everything that is contained in the `` tag will be split across `` and `` tags. Here's an example illustrating the differences.\n",
     "\n",
-    "\n",
-    "=== \"RAIL Spec with instruction tag\"\n",
+    "=== \"RAIL Spec with system role message\"\n",
     "\n",
     "    ```xml\n",
-    "    \n",
+    "    \n",
+    "    \n",
     "    You are a helpful assistant only capable of communicating with valid JSON, and no other text.\n",
     "\n",
     "    ${gr.json_suffix_prompt_examples}\n",
-    "    \n",
-    "\n",
-    "\n",
-    "    \n",
+    "    \n",
+    "    \n",
     "    Given the following document, answer the following questions. If the answer doesn't exist in the document, enter \n",
     "    `null`.\n",
     "\n",
@@ -147,10 +144,11 @@
     "    ${gr.xml_prefix_prompt}\n",
     "\n",
     "    ${output_schema}\n",
-    "    \n",
+    "    \n",
+    "    \n",
     "    ```\n",
     "\n",
-    "=== \"Pydantic with instructions\"\n",
+    "=== \"Pydantic with messages\"\n",
     "    ```py\n",
     "    instructions = \"\"\"You are a helpful assistant only capable of communicating with valid JSON, and no other text.\n",
     "\n",
@@ -167,10 +165,11 @@
     "    ${output_schema}\"\"\"\n",
     "    ```\n",
     "\n",
-    "=== \"RAIL Spec without instruction tag\"\n",
+    "=== \"RAIL Spec without user message\"\n",
     "    \n",
     "    ```xml\n",
-    "    \n",
+    "    \n",
+    "    \n",
     "    Given the following document, answer the following questions. If the answer doesn't exist in the document, enter `null`.\n",
     "\n",
     "    ${document}\n",
@@ -180,7 +179,8 @@
     "    ${output_schema}\n",
     "\n",
     "    ${gr.json_suffix_prompt_v2_wo_none}\n",
-    "    \n",
+    "    \n",
+    "    \n",
     "    ```\n",
     "\n",
     "=== \"Pydantic without instructions\"\n",
@@ -253,7 +253,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -273,15 +273,13 @@
     "    \n",
     "\n",
     "\n",
-    "\n",
-    "\n",
+    "\n",
+    "    \n",
     "You are a helpful assistant only capable of communicating with valid JSON, and no other text.\n",
     "\n",
     "${gr.json_suffix_prompt_examples}\n",
-    "\n",
-    "\n",
-    "\n",
-    "\n",
+    "    \n",
+    "    \n",
     "Given the following document, answer the following questions. If the answer doesn't exist in the document, enter \n",
     "`null`.\n",
     "\n",
@@ -292,7 +290,8 @@
     "${gr.xml_prefix_prompt}\n",
     "\n",
     "${output_schema}\n",
-    "\n",
+    "    \n",
+    "\n",
     "\n",
     "\n",
     "\"\"\""
@@ -307,18 +306,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 3,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/Users/dtam/.pyenv/versions/3.12.1/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:11: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
-      "  from tqdm.autonotebook import tqdm, trange\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "from guardrails.hub import LowerCase, TwoWords, OneLine\n",
     "from pydantic import BaseModel, Field\n",
@@ -367,7 +357,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -383,7 +373,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -399,9 +389,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 6,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    }
+   ],
    "source": [
     "# Add your OPENAI_API_KEY as an environment variable if it's not already set\n",
     "# import os\n",
@@ -425,7 +424,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [
     {
@@ -735,7 +734,7 @@
     }
    ],
    "source": [
-    "print(guard.history.last.iterations.last.inputs.msg_history[0][\"content\"])"
+    "print(guard.history.last.iterations.last.inputs.messages[0][\"content\"])"
    ]
   },
   {
@@ -749,7 +748,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [
     {
@@ -763,7 +762,7 @@
        "            'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction or amount \n",
        "selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee of 1.72% of \n",
        "the amount of each eligible purchase transaction or amount selected to create a My Chase Plan.',\n",
-       "            'value': 0.0\n",
+       "            'value': 1.72\n",
        "        },\n",
        "        {\n",
        "            'name': 'balance transfers',\n",
@@ -804,7 +803,7 @@
        "            \u001b[32m'explanation'\u001b[0m: \u001b[32m'Monthly fee of 0% of the amount of each eligible purchase transaction or amount \u001b[0m\n",
        "\u001b[32mselected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee of 1.72% of \u001b[0m\n",
        "\u001b[32mthe amount of each eligible purchase transaction or amount selected to create a My Chase Plan.'\u001b[0m,\n",
-       "            \u001b[32m'value'\u001b[0m: \u001b[1;36m0.0\u001b[0m\n",
+       "            \u001b[32m'value'\u001b[0m: \u001b[1;36m1.72\u001b[0m\n",
        "        \u001b[1m}\u001b[0m,\n",
        "        \u001b[1m{\u001b[0m\n",
        "            \u001b[32m'name'\u001b[0m: \u001b[32m'balance transfers'\u001b[0m,\n",
@@ -846,7 +845,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 10,
    "metadata": {},
    "outputs": [
     {
@@ -854,10 +853,7 @@
       "text/html": [
        "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
        "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
        "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
        "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
@@ -1057,7 +1053,7 @@
        "    │ │ selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee   │ │\n",
        "    │ │ of 1.72% of the amount of each eligible purchase transaction or amount selected to create a My Chase    │ │\n",
        "    │ │ Plan.\",                                                                                                 │ │\n",
-       "    │ │       \"value\": 0.0                                                                                      │ │\n",
+       "    │ │       \"value\": 1.72                                                                                     │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
        "    │ │       \"name\": \"balance transfers\",                                                                      │ │\n",
@@ -1122,7 +1118,7 @@
        "    │ │ amount selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that,        │ │\n",
        "    │ │ monthly fee of 1.72% of the amount of each eligible purchase transaction or amount selected to create a │ │\n",
        "    │ │ My Chase Plan.',                                                                                        │ │\n",
-       "    │ │             'value': 0.0                                                                                │ │\n",
+       "    │ │             'value': 1.72                                                                               │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
        "    │ │             'name': 'balance transfers',                                                                │ │\n",
@@ -1159,10 +1155,7 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
@@ -1362,7 +1355,7 @@
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mselected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mof 1.72% of the amount of each eligible purchase transaction or amount selected to create a My Chase \u001b[0m\u001b[48;2;245;245;220m  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mPlan.\",\u001b[0m\u001b[48;2;245;245;220m                                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 0.0\u001b[0m\u001b[48;2;245;245;220m                                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"value\": 1.72\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"balance transfers\",\u001b[0m\u001b[48;2;245;245;220m                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -1427,7 +1420,7 @@
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mamount selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, \u001b[0m\u001b[48;2;240;255;240m      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mmonthly fee of 1.72% of the amount of each eligible purchase transaction or amount selected to create a\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mMy Chase Plan.',\u001b[0m\u001b[48;2;240;255;240m                                                                                       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 0.0\u001b[0m\u001b[48;2;240;255;240m                                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'value': 1.72\u001b[0m\u001b[48;2;240;255;240m                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'balance transfers',\u001b[0m\u001b[48;2;240;255;240m                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
@@ -1461,7 +1454,7 @@
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n"
       ]
      },
-     "execution_count": 11,
+     "execution_count": 10,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1473,7 +1466,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "tiff-env",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -1487,7 +1480,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.1"
+   "version": "3.12.3"
   },
   "orig_nbformat": 4
  },
diff --git a/docs/examples/input_validation.ipynb b/docs/examples/input_validation.ipynb
index df7f50b7d..c7535a611 100644
--- a/docs/examples/input_validation.ipynb
+++ b/docs/examples/input_validation.ipynb
@@ -38,7 +38,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 1,
    "metadata": {
     "is_executing": true
    },
@@ -48,12 +48,15 @@
     "\n",
     "rail_spec = \"\"\"\n",
     "\n",
-    "\n",
+    "\n",
     "This is not two words\n",
-    "\n",
+    "\n",
+    "\n",
+    "\n",
     "\n",
     "\n",
     "\n",
@@ -73,11 +76,22 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 2,
    "metadata": {
     "is_executing": true
    },
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n",
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    }
+   ],
    "source": [
     "from guardrails.errors import ValidationError\n",
     "\n",
@@ -111,6 +125,14 @@
      "text": [
       "Validation failed for field with errors: Value must be exactly two words\n"
      ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
     }
    ],
    "source": [
@@ -124,12 +146,12 @@
     "\n",
     "\n",
     "guard = Guard.for_pydantic(Pet)\n",
-    "guard.use(TwoWords(on_fail=\"exception\"), on=\"prompt\")\n",
+    "guard.use(TwoWords(on_fail=\"exception\"), on=\"messages\")\n",
     "\n",
     "try:\n",
     "    guard(\n",
     "        model=\"gpt-4o\",\n",
-    "        prompt=\"This is not two words\",\n",
+    "        messages=[{\"role\":\"user\",\"content\":\"This is not two words\"}],\n",
     "    )\n",
     "except ValidationError as e:\n",
     "    print(e)"
@@ -138,7 +160,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -152,7 +174,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.1"
+   "version": "3.12.3"
   }
  },
  "nbformat": 4,
diff --git a/docs/examples/json_function_calling_tools.ipynb b/docs/examples/json_function_calling_tools.ipynb
index ebb7a8bae..136d7870c 100644
--- a/docs/examples/json_function_calling_tools.ipynb
+++ b/docs/examples/json_function_calling_tools.ipynb
@@ -22,7 +22,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -48,7 +48,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [
     {
@@ -225,9 +225,105 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 3,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "
[\n",
+       "    {\n",
+       "        'type': 'function',\n",
+       "        'function': {\n",
+       "            'name': 'gd_response_tool',\n",
+       "            'description': 'A tool for generating responses to guardrails. It must be called last in every \n",
+       "response.',\n",
+       "            'parameters': {\n",
+       "                'properties': {\n",
+       "                    'deliveries': {\n",
+       "                        'items': {\n",
+       "                            'properties': {\n",
+       "                                'customer_name': {'type': 'string', 'description': 'customer name'},\n",
+       "                                'pickup_time': {'type': 'string', 'description': 'date and time of pickup'},\n",
+       "                                'pickup_location': {'type': 'string', 'description': 'address of pickup'},\n",
+       "                                'dropoff_time': {'type': 'string', 'description': 'date and time of dropoff'},\n",
+       "                                'dropoff_location': {'type': 'string', 'description': 'address of dropoff'},\n",
+       "                                'price': {\n",
+       "                                    'type': 'string',\n",
+       "                                    'description': 'price of delivery with currency symbol included'\n",
+       "                                }\n",
+       "                            },\n",
+       "                            'required': [\n",
+       "                                'customer_name',\n",
+       "                                'pickup_time',\n",
+       "                                'pickup_location',\n",
+       "                                'dropoff_time',\n",
+       "                                'dropoff_location',\n",
+       "                                'price'\n",
+       "                            ],\n",
+       "                            'type': 'object'\n",
+       "                        },\n",
+       "                        'type': 'array'\n",
+       "                    }\n",
+       "                },\n",
+       "                'required': ['deliveries'],\n",
+       "                'type': 'object'\n",
+       "            },\n",
+       "            'required': ['deliveries']\n",
+       "        }\n",
+       "    }\n",
+       "]\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m[\u001b[0m\n", + " \u001b[1m{\u001b[0m\n", + " \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m,\n", + " \u001b[32m'function'\u001b[0m: \u001b[1m{\u001b[0m\n", + " \u001b[32m'name'\u001b[0m: \u001b[32m'gd_response_tool'\u001b[0m,\n", + " \u001b[32m'description'\u001b[0m: \u001b[32m'A tool for generating responses to guardrails. It must be called last in every \u001b[0m\n", + "\u001b[32mresponse.'\u001b[0m,\n", + " \u001b[32m'parameters'\u001b[0m: \u001b[1m{\u001b[0m\n", + " \u001b[32m'properties'\u001b[0m: \u001b[1m{\u001b[0m\n", + " \u001b[32m'deliveries'\u001b[0m: \u001b[1m{\u001b[0m\n", + " \u001b[32m'items'\u001b[0m: \u001b[1m{\u001b[0m\n", + " \u001b[32m'properties'\u001b[0m: \u001b[1m{\u001b[0m\n", + " \u001b[32m'customer_name'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'type'\u001b[0m: \u001b[32m'string'\u001b[0m, \u001b[32m'description'\u001b[0m: \u001b[32m'customer name'\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[32m'pickup_time'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'type'\u001b[0m: \u001b[32m'string'\u001b[0m, \u001b[32m'description'\u001b[0m: \u001b[32m'date and time of pickup'\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[32m'pickup_location'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'type'\u001b[0m: \u001b[32m'string'\u001b[0m, \u001b[32m'description'\u001b[0m: \u001b[32m'address of pickup'\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[32m'dropoff_time'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'type'\u001b[0m: \u001b[32m'string'\u001b[0m, \u001b[32m'description'\u001b[0m: \u001b[32m'date and time of dropoff'\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[32m'dropoff_location'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'type'\u001b[0m: \u001b[32m'string'\u001b[0m, \u001b[32m'description'\u001b[0m: \u001b[32m'address of dropoff'\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[32m'price'\u001b[0m: \u001b[1m{\u001b[0m\n", + " \u001b[32m'type'\u001b[0m: \u001b[32m'string'\u001b[0m,\n", + " \u001b[32m'description'\u001b[0m: \u001b[32m'price of delivery with currency symbol included'\u001b[0m\n", + " \u001b[1m}\u001b[0m\n", + " \u001b[1m}\u001b[0m,\n", + " \u001b[32m'required'\u001b[0m: \u001b[1m[\u001b[0m\n", + " \u001b[32m'customer_name'\u001b[0m,\n", + " \u001b[32m'pickup_time'\u001b[0m,\n", + " \u001b[32m'pickup_location'\u001b[0m,\n", + " \u001b[32m'dropoff_time'\u001b[0m,\n", + " \u001b[32m'dropoff_location'\u001b[0m,\n", + " \u001b[32m'price'\u001b[0m\n", + " \u001b[1m]\u001b[0m,\n", + " \u001b[32m'type'\u001b[0m: \u001b[32m'object'\u001b[0m\n", + " \u001b[1m}\u001b[0m,\n", + " \u001b[32m'type'\u001b[0m: \u001b[32m'array'\u001b[0m\n", + " \u001b[1m}\u001b[0m\n", + " \u001b[1m}\u001b[0m,\n", + " \u001b[32m'required'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'deliveries'\u001b[0m\u001b[1m]\u001b[0m,\n", + " \u001b[32m'type'\u001b[0m: \u001b[32m'object'\u001b[0m\n", + " \u001b[1m}\u001b[0m,\n", + " \u001b[32m'required'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'deliveries'\u001b[0m\u001b[1m]\u001b[0m\n", + " \u001b[1m}\u001b[0m\n", + " \u001b[1m}\u001b[0m\n", + "\u001b[1m]\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "rail = \"\"\"\n", "\n", @@ -257,20 +353,51 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] + }, { "data": { "text/html": [ "
ValidationOutcome(\n",
-       "    call_id='4586524096',\n",
+       "    call_id='13988399296',\n",
        "    raw_llm_output='{\"deliveries\":[{\"custome_name\":\"nelson and murdock\",\"pickup_time\":\"June 3 \n",
        "10:00am\",\"pickup_location\":\"797 9th Avenue\",\"dropoff_time\":\"June 3 10:30am\",\"dropoff_location\":\"Courthouse, 61 \n",
        "Center Street C/O frank james\",\"price\":\"$23.00\"},{\"custome_name\":\"abc flowers\",\"pickup_time\":\"June 2 \n",
        "11:00am\",\"pickup_location\":\"21 3rd street\",\"dropoff_time\":\"June 2 5:30pm\",\"dropoff_location\":\"75th \n",
        "Ave\",\"price\":\"$14.50\"},{\"custome_name\":\"polk and wardell\",\"pickup_time\":\"June 3 11:00am\",\"pickup_location\":\"331 5th\n",
        "street\",\"dropoff_time\":\"June 3 5:30pm\",\"dropoff_location\":\"75th Ave\",\"price\":\"$34.50\"}]}',\n",
+       "    validation_summaries=[\n",
+       "        ValidationSummary(\n",
+       "            validator_name='RegexMatch',\n",
+       "            validator_status='fail',\n",
+       "            property_path='$.deliveries.0.custome_name',\n",
+       "            failure_reason='Result must match ^[A-Z][a-z]+\\\\s[A-Z][a-z]+$',\n",
+       "            error_spans=None\n",
+       "        ),\n",
+       "        ValidationSummary(\n",
+       "            validator_name='RegexMatch',\n",
+       "            validator_status='fail',\n",
+       "            property_path='$.deliveries.1.custome_name',\n",
+       "            failure_reason='Result must match ^[A-Z][a-z]+\\\\s[A-Z][a-z]+$',\n",
+       "            error_spans=None\n",
+       "        ),\n",
+       "        ValidationSummary(\n",
+       "            validator_name='RegexMatch',\n",
+       "            validator_status='fail',\n",
+       "            property_path='$.deliveries.2.custome_name',\n",
+       "            failure_reason='Result must match ^[A-Z][a-z]+\\\\s[A-Z][a-z]+$',\n",
+       "            error_spans=None\n",
+       "        )\n",
+       "    ],\n",
        "    validated_output={\n",
        "        'deliveries': [\n",
        "            {\n",
@@ -307,13 +434,36 @@
       ],
       "text/plain": [
        "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n",
-       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'4586524096'\u001b[0m,\n",
+       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'13988399296'\u001b[0m,\n",
        "    \u001b[33mraw_llm_output\u001b[0m=\u001b[32m'\u001b[0m\u001b[32m{\u001b[0m\u001b[32m\"deliveries\":\u001b[0m\u001b[32m[\u001b[0m\u001b[32m{\u001b[0m\u001b[32m\"custome_name\":\"nelson and murdock\",\"pickup_time\":\"June 3 \u001b[0m\n",
        "\u001b[32m10:00am\",\"pickup_location\":\"797 9th Avenue\",\"dropoff_time\":\"June 3 10:30am\",\"dropoff_location\":\"Courthouse, 61 \u001b[0m\n",
        "\u001b[32mCenter Street C/O frank james\",\"price\":\"$23.00\"\u001b[0m\u001b[32m}\u001b[0m\u001b[32m,\u001b[0m\u001b[32m{\u001b[0m\u001b[32m\"custome_name\":\"abc flowers\",\"pickup_time\":\"June 2 \u001b[0m\n",
        "\u001b[32m11:00am\",\"pickup_location\":\"21 3rd street\",\"dropoff_time\":\"June 2 5:30pm\",\"dropoff_location\":\"75th \u001b[0m\n",
        "\u001b[32mAve\",\"price\":\"$14.50\"\u001b[0m\u001b[32m}\u001b[0m\u001b[32m,\u001b[0m\u001b[32m{\u001b[0m\u001b[32m\"custome_name\":\"polk and wardell\",\"pickup_time\":\"June 3 11:00am\",\"pickup_location\":\"331 5th\u001b[0m\n",
        "\u001b[32mstreet\",\"dropoff_time\":\"June 3 5:30pm\",\"dropoff_location\":\"75th Ave\",\"price\":\"$34.50\"\u001b[0m\u001b[32m}\u001b[0m\u001b[32m]\u001b[0m\u001b[32m}\u001b[0m\u001b[32m'\u001b[0m,\n",
+       "    \u001b[33mvalidation_summaries\u001b[0m=\u001b[1m[\u001b[0m\n",
+       "        \u001b[1;35mValidationSummary\u001b[0m\u001b[1m(\u001b[0m\n",
+       "            \u001b[33mvalidator_name\u001b[0m=\u001b[32m'RegexMatch'\u001b[0m,\n",
+       "            \u001b[33mvalidator_status\u001b[0m=\u001b[32m'fail'\u001b[0m,\n",
+       "            \u001b[33mproperty_path\u001b[0m=\u001b[32m'$.deliveries.0.custome_name'\u001b[0m,\n",
+       "            \u001b[33mfailure_reason\u001b[0m=\u001b[32m'Result must match ^\u001b[0m\u001b[32m[\u001b[0m\u001b[32mA-Z\u001b[0m\u001b[32m]\u001b[0m\u001b[32m[\u001b[0m\u001b[32ma-z\u001b[0m\u001b[32m]\u001b[0m\u001b[32m+\\\\s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mA-Z\u001b[0m\u001b[32m]\u001b[0m\u001b[32m[\u001b[0m\u001b[32ma-z\u001b[0m\u001b[32m]\u001b[0m\u001b[32m+$'\u001b[0m,\n",
+       "            \u001b[33merror_spans\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
+       "        \u001b[1m)\u001b[0m,\n",
+       "        \u001b[1;35mValidationSummary\u001b[0m\u001b[1m(\u001b[0m\n",
+       "            \u001b[33mvalidator_name\u001b[0m=\u001b[32m'RegexMatch'\u001b[0m,\n",
+       "            \u001b[33mvalidator_status\u001b[0m=\u001b[32m'fail'\u001b[0m,\n",
+       "            \u001b[33mproperty_path\u001b[0m=\u001b[32m'$.deliveries.1.custome_name'\u001b[0m,\n",
+       "            \u001b[33mfailure_reason\u001b[0m=\u001b[32m'Result must match ^\u001b[0m\u001b[32m[\u001b[0m\u001b[32mA-Z\u001b[0m\u001b[32m]\u001b[0m\u001b[32m[\u001b[0m\u001b[32ma-z\u001b[0m\u001b[32m]\u001b[0m\u001b[32m+\\\\s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mA-Z\u001b[0m\u001b[32m]\u001b[0m\u001b[32m[\u001b[0m\u001b[32ma-z\u001b[0m\u001b[32m]\u001b[0m\u001b[32m+$'\u001b[0m,\n",
+       "            \u001b[33merror_spans\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
+       "        \u001b[1m)\u001b[0m,\n",
+       "        \u001b[1;35mValidationSummary\u001b[0m\u001b[1m(\u001b[0m\n",
+       "            \u001b[33mvalidator_name\u001b[0m=\u001b[32m'RegexMatch'\u001b[0m,\n",
+       "            \u001b[33mvalidator_status\u001b[0m=\u001b[32m'fail'\u001b[0m,\n",
+       "            \u001b[33mproperty_path\u001b[0m=\u001b[32m'$.deliveries.2.custome_name'\u001b[0m,\n",
+       "            \u001b[33mfailure_reason\u001b[0m=\u001b[32m'Result must match ^\u001b[0m\u001b[32m[\u001b[0m\u001b[32mA-Z\u001b[0m\u001b[32m]\u001b[0m\u001b[32m[\u001b[0m\u001b[32ma-z\u001b[0m\u001b[32m]\u001b[0m\u001b[32m+\\\\s\u001b[0m\u001b[32m[\u001b[0m\u001b[32mA-Z\u001b[0m\u001b[32m]\u001b[0m\u001b[32m[\u001b[0m\u001b[32ma-z\u001b[0m\u001b[32m]\u001b[0m\u001b[32m+$'\u001b[0m,\n",
+       "            \u001b[33merror_spans\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
+       "        \u001b[1m)\u001b[0m\n",
+       "    \u001b[1m]\u001b[0m,\n",
        "    \u001b[33mvalidated_output\u001b[0m=\u001b[1m{\u001b[0m\n",
        "        \u001b[32m'deliveries'\u001b[0m: \u001b[1m[\u001b[0m\n",
        "            \u001b[1m{\u001b[0m\n",
@@ -359,7 +509,6 @@
     "\n",
     "response = pydantic_guard(\n",
     "    model=\"gpt-4o\",\n",
-    "    instructions=\"You are a helpful assistant.\",\n",
     "    messages=[{\"role\":\"user\", \"content\": prompt}],\n",
     "    prompt_params={\"chat_history\": chat_history},\n",
     "    tools=pydantic_guard_tools,\n",
@@ -371,7 +520,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [
     {
@@ -379,32 +528,30 @@
       "text/html": [
        "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ From the chat exchanges below extract a schedule of deliveries.                                         │ │\n",
-       "    │ │ Chats:                                                                                                  │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ nelson and murdock: i need a pickup 797 9th Avenue, manila envelope, June 3 10:00am with dropoff        │ │\n",
-       "    │ │ 10:30am Courthouse, 61 Center Street C/O frank james                                                    │ │\n",
-       "    │ │ operator: quote - $23.00                                                                                │ │\n",
-       "    │ │ neslon and murdock: perfect, we accept the quote                                                        │ │\n",
-       "    │ │ operator: 797 9th ave, 10:00am pickup comfirmed                                                         │ │\n",
-       "    │ │ abc flowers: i need a pickup of a flowers from abc flowers at 21 3rd street at 11:00am on june 2 with a │ │\n",
-       "    │ │ dropoff at 75th Ave at 5:30pm same day                                                                  │ │\n",
-       "    │ │ operator: 21 3rd street flowers quote - $14.50                                                          │ │\n",
-       "    │ │ abc flowers: accepted                                                                                   │ │\n",
-       "    │ │ polk and wardell: i need a pickup of a bagels from Bakers Co at 331 5th street at 11:00am on june 3     │ │\n",
-       "    │ │ with a dropoff at 75th Ave at 5:30pm same day                                                           │ │\n",
-       "    │ │ operator: 331 5th street bagels quote - $34.50                                                          │ │\n",
-       "    │ │ polk and wardell: accepted                                                                              │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭───────────────────────────────────────────── Instructions ──────────────────────────────────────────────╮ │\n",
-       "    │ │ You are a helpful assistant.                                                                            │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
+       "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ user │                                                                                              │ │ │\n",
+       "    │ │ │      │ From the chat exchanges below extract a schedule of deliveries.                              │ │ │\n",
+       "    │ │ │      │ Chats:                                                                                       │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ nelson and murdock: i need a pickup 797 9th Avenue, manila envelope, June 3 10:00am with     │ │ │\n",
+       "    │ │ │      │ dropoff 10:30am Courthouse, 61 Center Street C/O frank james                                 │ │ │\n",
+       "    │ │ │      │ operator: quote - $23.00                                                                     │ │ │\n",
+       "    │ │ │      │ neslon and murdock: perfect, we accept the quote                                             │ │ │\n",
+       "    │ │ │      │ operator: 797 9th ave, 10:00am pickup comfirmed                                              │ │ │\n",
+       "    │ │ │      │ abc flowers: i need a pickup of a flowers from abc flowers at 21 3rd street at 11:00am on    │ │ │\n",
+       "    │ │ │      │ june 2 with a dropoff at 75th Ave at 5:30pm same day                                         │ │ │\n",
+       "    │ │ │      │ operator: 21 3rd street flowers quote - $14.50                                               │ │ │\n",
+       "    │ │ │      │ abc flowers: accepted                                                                        │ │ │\n",
+       "    │ │ │      │ polk and wardell: i need a pickup of a bagels from Bakers Co at 331 5th street at 11:00am on │ │ │\n",
+       "    │ │ │      │ june 3 with a dropoff at 75th Ave at 5:30pm same day                                         │ │ │\n",
+       "    │ │ │      │ operator: 331 5th street bagels quote - $34.50                                               │ │ │\n",
+       "    │ │ │      │ polk and wardell: accepted                                                                   │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ {\"deliveries\":[{\"custome_name\":\"nelson and murdock\",\"pickup_time\":\"June 3                               │ │\n",
@@ -452,32 +599,30 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mFrom the chat exchanges below extract a schedule of deliveries.\u001b[0m\u001b[48;2;240;248;255m                                        \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mChats:\u001b[0m\u001b[48;2;240;248;255m                                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mnelson and murdock: i need a pickup 797 9th Avenue, manila envelope, June 3 10:00am with dropoff \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m10:30am Courthouse, 61 Center Street C/O frank james\u001b[0m\u001b[48;2;240;248;255m                                                   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255moperator: quote - $23.00\u001b[0m\u001b[48;2;240;248;255m                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mneslon and murdock: perfect, we accept the quote\u001b[0m\u001b[48;2;240;248;255m                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255moperator: 797 9th ave, 10:00am pickup comfirmed\u001b[0m\u001b[48;2;240;248;255m                                                        \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mabc flowers: i need a pickup of a flowers from abc flowers at 21 3rd street at 11:00am on june 2 with a\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mdropoff at 75th Ave at 5:30pm same day\u001b[0m\u001b[48;2;240;248;255m                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255moperator: 21 3rd street flowers quote - $14.50\u001b[0m\u001b[48;2;240;248;255m                                                         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mabc flowers: accepted\u001b[0m\u001b[48;2;240;248;255m                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mpolk and wardell: i need a pickup of a bagels from Bakers Co at 331 5th street at 11:00am on june 3 \u001b[0m\u001b[48;2;240;248;255m   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mwith a dropoff at 75th Ave at 5:30pm same day\u001b[0m\u001b[48;2;240;248;255m                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255moperator: 331 5th street bagels quote - $34.50\u001b[0m\u001b[48;2;240;248;255m                                                         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mpolk and wardell: accepted\u001b[0m\u001b[48;2;240;248;255m                                                                             \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m╭─\u001b[0m\u001b[48;2;255;240;242m────────────────────────────────────────────\u001b[0m\u001b[48;2;255;240;242m Instructions \u001b[0m\u001b[48;2;255;240;242m─────────────────────────────────────────────\u001b[0m\u001b[48;2;255;240;242m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mYou are a helpful assistant.\u001b[0m\u001b[48;2;255;240;242m                                                                           \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mFrom the chat exchanges below extract a schedule of deliveries.                             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mChats:                                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mnelson and murdock: i need a pickup 797 9th Avenue, manila envelope, June 3 10:00am with    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mdropoff 10:30am Courthouse, 61 Center Street C/O frank james                                \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235moperator: quote - $23.00                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mneslon and murdock: perfect, we accept the quote                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235moperator: 797 9th ave, 10:00am pickup comfirmed                                             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mabc flowers: i need a pickup of a flowers from abc flowers at 21 3rd street at 11:00am on   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mjune 2 with a dropoff at 75th Ave at 5:30pm same day                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235moperator: 21 3rd street flowers quote - $14.50                                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mabc flowers: accepted                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mpolk and wardell: i need a pickup of a bagels from Bakers Co at 331 5th street at 11:00am on\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mjune 3 with a dropoff at 75th Ave at 5:30pm same day                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235moperator: 331 5th street bagels quote - $34.50                                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mpolk and wardell: accepted                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\"deliveries\":[{\"custome_name\":\"nelson and murdock\",\"pickup_time\":\"June 3 \u001b[0m\u001b[48;2;245;245;220m                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -522,7 +667,7 @@
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n"
       ]
      },
-     "execution_count": 6,
+     "execution_count": 5,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -539,7 +684,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": ".venv",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -553,7 +698,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.11.7"
+   "version": "3.12.3"
   }
  },
  "nbformat": 4,
diff --git a/docs/examples/lite_llm_defaults.ipynb b/docs/examples/lite_llm_defaults.ipynb
index acddd90fa..b173f9cde 100644
--- a/docs/examples/lite_llm_defaults.ipynb
+++ b/docs/examples/lite_llm_defaults.ipynb
@@ -22,20 +22,29 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    },
     {
      "data": {
       "text/html": [
        "
ValidationOutcome(\n",
-       "    call_id='6112958560',\n",
-       "    raw_llm_output=\"As of my last update in 2023, Jupiter has 95 confirmed moons. The number of known moons can \n",
-       "change as new moons are discovered and confirmed, so it's always a good idea to check the latest information from \n",
-       "reliable sources such as NASA or other astronomical organizations.\",\n",
-       "    validated_output=\"As of my last update in 2023, Jupiter has 95 confirmed moons. The number of known moons can \n",
-       "change as new moons are discovered and confirmed, so it's always a good idea to check the latest information from \n",
-       "reliable sources such as NASA or other astronomical organizations.\",\n",
+       "    call_id='14256398304',\n",
+       "    raw_llm_output=\"As of the latest data available, Jupiter has 95 confirmed moons. This number can change as new \n",
+       "moons are discovered and confirmed by astronomers. Jupiter's largest moons, known as the Galilean moons, are Io, \n",
+       "Europa, Ganymede, and Callisto.\",\n",
+       "    validation_summaries=[],\n",
+       "    validated_output=\"As of the latest data available, Jupiter has 95 confirmed moons. This number can change as \n",
+       "new moons are discovered and confirmed by astronomers. Jupiter's largest moons, known as the Galilean moons, are \n",
+       "Io, Europa, Ganymede, and Callisto.\",\n",
        "    reask=None,\n",
        "    validation_passed=True,\n",
        "    error=None\n",
@@ -44,13 +53,14 @@
       ],
       "text/plain": [
        "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n",
-       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'6112958560'\u001b[0m,\n",
-       "    \u001b[33mraw_llm_output\u001b[0m=\u001b[32m\"As\u001b[0m\u001b[32m of my last update in 2023, Jupiter has 95 confirmed moons. The number of known moons can \u001b[0m\n",
-       "\u001b[32mchange as new moons are discovered and confirmed, so it's always a good idea to check the latest information from \u001b[0m\n",
-       "\u001b[32mreliable sources such as NASA or other astronomical organizations.\"\u001b[0m,\n",
-       "    \u001b[33mvalidated_output\u001b[0m=\u001b[32m\"As\u001b[0m\u001b[32m of my last update in 2023, Jupiter has 95 confirmed moons. The number of known moons can \u001b[0m\n",
-       "\u001b[32mchange as new moons are discovered and confirmed, so it's always a good idea to check the latest information from \u001b[0m\n",
-       "\u001b[32mreliable sources such as NASA or other astronomical organizations.\"\u001b[0m,\n",
+       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'14256398304'\u001b[0m,\n",
+       "    \u001b[33mraw_llm_output\u001b[0m=\u001b[32m\"As\u001b[0m\u001b[32m of the latest data available, Jupiter has 95 confirmed moons. This number can change as new \u001b[0m\n",
+       "\u001b[32mmoons are discovered and confirmed by astronomers. Jupiter's largest moons, known as the Galilean moons, are Io, \u001b[0m\n",
+       "\u001b[32mEuropa, Ganymede, and Callisto.\"\u001b[0m,\n",
+       "    \u001b[33mvalidation_summaries\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
+       "    \u001b[33mvalidated_output\u001b[0m=\u001b[32m\"As\u001b[0m\u001b[32m of the latest data available, Jupiter has 95 confirmed moons. This number can change as \u001b[0m\n",
+       "\u001b[32mnew moons are discovered and confirmed by astronomers. Jupiter's largest moons, known as the Galilean moons, are \u001b[0m\n",
+       "\u001b[32mIo, Europa, Ganymede, and Callisto.\"\u001b[0m,\n",
        "    \u001b[33mreask\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "    \u001b[33mvalidation_passed\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n",
        "    \u001b[33merror\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
@@ -74,8 +84,6 @@
     "\n",
     "response = guard(\n",
     "    model=\"gpt-4o\",\n",
-    "    instructions=\"You are a helpful assistant.\",\n",
-    "    prompt=\"How many moons does jupiter have?\",\n",
     "    messages=[{\n",
     "        \"role\": \"system\",\n",
     "        \"content\": \"You are a helpful assistant.\"\n",
@@ -91,7 +99,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": ".venv",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -105,7 +113,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.1"
+   "version": "3.12.3"
   }
  },
  "nbformat": 4,
diff --git a/docs/examples/no_secrets_in_generated_text.ipynb b/docs/examples/no_secrets_in_generated_text.ipynb
index ec82302c0..77b595111 100644
--- a/docs/examples/no_secrets_in_generated_text.ipynb
+++ b/docs/examples/no_secrets_in_generated_text.ipynb
@@ -93,13 +93,14 @@
     "    \n",
     "\n",
     "\n",
-    "\n",
-    "\n",
+    "\n",
+    "\n",
     "\n",
     "How do I use OpenAI's Completion API?\n",
     "\n",
     "${gr.complete_xml_suffix}\n",
-    "\n",
+    "\n",
+    "\n",
     "\n",
     "\n",
     "\n",
@@ -212,16 +213,25 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 16,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    }
+   ],
    "source": [
     "# Set your OPENAI_API_KEY as an environment variable\n",
     "# import os\n",
     "# os.environ[\"OPENAI_API_KEY\"] = \"YOUR_API_KEY\"\n",
     "\n",
     "raw_llm_response, validated_response, *rest = guard(\n",
-    "   model=\"gpt-3.5-turbo-instruct\",\n",
+    "   model=\"gpt-4o-mini\",\n",
     "   max_tokens=3548,\n",
     "   temperature=0,\n",
     "   messages=[{\"role\":\"user\", \"content\": prompt}],\n",
@@ -302,7 +312,7 @@
     }
    ],
    "source": [
-    "print(guard.history.last.iterations.first.inputs.msg_history[0][\"content\"])"
+    "print(guard.history.last.iterations.first.inputs.messages[0][\"content\"])"
    ]
   },
   {
@@ -314,15 +324,17 @@
      "data": {
       "text/html": [
        "
{\n",
-       "    'api_help': 'curl -X POST -H \"Content-Type: application/json\" -H \"Authorization: Bearer YOUR_API_KEY\" -d \n",
-       "\\'{\"prompt\": \"The quick brown fox\", \"max_tokens\": 5}\\' \"https://api.openai.com/v1/engines/davinci/completions\"'\n",
+       "    'api_help': 'curl https://api.openai.com/v1/completions -H \\'Content-Type: application/json\\' -H \n",
+       "\\'Authorization: Bearer YOUR_API_KEY\\' -d \\'{\"model\": \"text-davinci-003\", \"prompt\": \"Once upon a time\", \n",
+       "\"max_tokens\": 50}\\''\n",
        "}\n",
        "
\n" ], "text/plain": [ "\u001b[1m{\u001b[0m\n", - " \u001b[32m'api_help'\u001b[0m: \u001b[32m'curl -X POST -H \"Content-Type: application/json\" -H \"Authorization: Bearer YOUR_API_KEY\" -d \u001b[0m\n", - "\u001b[32m\\'\u001b[0m\u001b[32m{\u001b[0m\u001b[32m\"prompt\": \"The quick brown fox\", \"max_tokens\": 5\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\' \"https://api.openai.com/v1/engines/davinci/completions\"'\u001b[0m\n", + " \u001b[32m'api_help'\u001b[0m: \u001b[32m'curl https://api.openai.com/v1/completions -H \\'Content-Type: application/json\\' -H \u001b[0m\n", + "\u001b[32m\\'Authorization: Bearer YOUR_API_KEY\\' -d \\'\u001b[0m\u001b[32m{\u001b[0m\u001b[32m\"model\": \"text-davinci-003\", \"prompt\": \"Once upon a time\", \u001b[0m\n", + "\u001b[32m\"max_tokens\": 50\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\''\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, @@ -343,143 +355,53 @@ "data": { "text/html": [ "
Logs\n",
-       "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "│   │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "│   │ │ No prompt                                                                                               │ │\n",
-       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "│   │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "│   │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
-       "│   │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
-       "│   │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
-       "│   │ │ │ user │                                                                                              │ │ │\n",
-       "│   │ │ │      │                                                                                              │ │ │\n",
-       "│   │ │ │      │ How do I use OpenAI's Completion API?                                                        │ │ │\n",
-       "│   │ │ │      │                                                                                              │ │ │\n",
-       "│   │ │ │      │                                                                                              │ │ │\n",
-       "│   │ │ │      │ Given below is XML that describes the information to extract from this document and the tags │ │ │\n",
-       "│   │ │ │      │ to extract it into.                                                                          │ │ │\n",
-       "│   │ │ │      │                                                                                              │ │ │\n",
-       "│   │ │ │      │ <output>                                                                                     │ │ │\n",
-       "│   │ │ │      │   <string description=\"Show an example curl command for using openai Completion API\"         │ │ │\n",
-       "│   │ │ │      │ format=\"no-code-secrets\" name=\"api_help\" required=\"true\"></string>                           │ │ │\n",
-       "│   │ │ │      │ </output>                                                                                    │ │ │\n",
-       "│   │ │ │      │                                                                                              │ │ │\n",
-       "│   │ │ │      │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in  │ │ │\n",
-       "│   │ │ │      │ JSON is the `name` attribute of the corresponding XML, and the value is of the type          │ │ │\n",
-       "│   │ │ │      │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │ │\n",
-       "│   │ │ │      │ any types and format requests e.g. requests for lists, objects and specific types. Be        │ │ │\n",
-       "│   │ │ │      │ correct and concise. If you are unsure anywhere, enter `null`.                               │ │ │\n",
-       "│   │ │ │      │                                                                                              │ │ │\n",
-       "│   │ │ │      │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:               │ │ │\n",
-       "│   │ │ │      │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`          │ │ │\n",
-       "│   │ │ │      │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',        │ │ │\n",
-       "│   │ │ │      │ 'STRING TWO', etc.]}`                                                                        │ │ │\n",
-       "│   │ │ │      │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer            │ │ │\n",
-       "│   │ │ │      │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':     │ │ │\n",
-       "│   │ │ │      │ 1}}`                                                                                         │ │ │\n",
-       "│   │ │ │      │                                                                                              │ │ │\n",
-       "│   │ │ │      │                                                                                              │ │ │\n",
-       "│   │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
-       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "│   │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
-       "│   │ │ {                                                                                                       │ │\n",
-       "│   │ │   \"api_help\": {                                                                                         │ │\n",
-       "│   │ │     \"description\": \"Show an example curl command for using openai Completion API\",                      │ │\n",
-       "│   │ │     \"format\": \"no-code-secrets\",                                                                        │ │\n",
-       "│   │ │     \"name\": \"api_help\",                                                                                 │ │\n",
-       "│   │ │     \"required\": true                                                                                    │ │\n",
-       "│   │ │   }                                                                                                     │ │\n",
-       "│   │ │ }                                                                                                       │ │\n",
-       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "│   │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
-       "│   │ │ SkeletonReAsk(                                                                                          │ │\n",
-       "│   │ │     incorrect_value={'api_help': {}},                                                                   │ │\n",
-       "│   │ │     fail_results=[                                                                                      │ │\n",
-       "│   │ │         FailResult(                                                                                     │ │\n",
-       "│   │ │             outcome='fail',                                                                             │ │\n",
-       "│   │ │             error_message='JSON does not match schema:\\n{\\n  \"$.api_help\": [\\n    \"{} is not of type    │ │\n",
-       "│   │ │ \\'string\\'\"\\n  ]\\n}',                                                                                   │ │\n",
-       "│   │ │             fix_value=None,                                                                             │ │\n",
-       "│   │ │             error_spans=None,                                                                           │ │\n",
-       "│   │ │             metadata=None,                                                                              │ │\n",
-       "│   │ │             validated_chunk=None                                                                        │ │\n",
-       "│   │ │         )                                                                                               │ │\n",
-       "│   │ │     ],                                                                                                  │ │\n",
-       "│   │ │     additional_properties={}                                                                            │ │\n",
-       "│   │ │ )                                                                                                       │ │\n",
-       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
-       "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ I was given the following JSON response, which had problems due to incorrect values.                    │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ {                                                                                                       │ │\n",
-       "    │ │   \"incorrect_value\": {                                                                                  │ │\n",
-       "    │ │     \"api_help\": {}                                                                                      │ │\n",
-       "    │ │   },                                                                                                    │ │\n",
-       "    │ │   \"error_messages\": [                                                                                   │ │\n",
-       "    │ │     \"JSON does not match schema:\\n{\\n  \\\"$.api_help\\\": [\\n    \\\"{} is not of type 'string'\\\"\\n  ]\\n}\"   │ │\n",
-       "    │ │   ]                                                                                                     │ │\n",
-       "    │ │ }                                                                                                       │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Help me correct the incorrect values based on the given error messages.                                 │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Given below is XML that describes the information to extract from this document and the tags to extract │ │\n",
-       "    │ │ it into.                                                                                                │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ <output>                                                                                                │ │\n",
-       "    │ │   <string description=\"Show an example curl command for using openai Completion API\"                    │ │\n",
-       "    │ │ format=\"no-code-secrets\" name=\"api_help\" required=\"true\"></string>                                      │ │\n",
-       "    │ │ </output>                                                                                               │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the │ │\n",
-       "    │ │ `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding  │ │\n",
-       "    │ │ XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g.        │ │\n",
-       "    │ │ requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere,     │ │\n",
-       "    │ │ enter `null`.                                                                                           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Here's an example of the structure:                                                                     │ │\n",
-       "    │ │ {                                                                                                       │ │\n",
-       "    │ │   \"api_help\": \"spend\"                                                                                   │ │\n",
-       "    │ │ }                                                                                                       │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭───────────────────────────────────────────── Instructions ──────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ You are a helpful assistant only capable of communicating with valid JSON, and no other text.           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the │ │\n",
-       "    │ │ `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding  │ │\n",
-       "    │ │ XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g.        │ │\n",
-       "    │ │ requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere,     │ │\n",
-       "    │ │ enter `null`.                                                                                           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:                          │ │\n",
-       "    │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`                     │ │\n",
-       "    │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO',     │ │\n",
-       "    │ │ etc.]}`                                                                                                 │ │\n",
-       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
-       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
+       "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ user │                                                                                              │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ How do I use OpenAI's Completion API?                                                        │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Given below is XML that describes the information to extract from this document and the tags │ │ │\n",
+       "    │ │ │      │ to extract it into.                                                                          │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ <output>                                                                                     │ │ │\n",
+       "    │ │ │      │   <string description=\"Show an example curl command for using openai Completion API\"         │ │ │\n",
+       "    │ │ │      │ format=\"no-code-secrets\" name=\"api_help\" required=\"true\"></string>                           │ │ │\n",
+       "    │ │ │      │ </output>                                                                                    │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in  │ │ │\n",
+       "    │ │ │      │ JSON is the `name` attribute of the corresponding XML, and the value is of the type          │ │ │\n",
+       "    │ │ │      │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │ │\n",
+       "    │ │ │      │ any types and format requests e.g. requests for lists, objects and specific types. Be        │ │ │\n",
+       "    │ │ │      │ correct and concise. If you are unsure anywhere, enter `null`.                               │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:               │ │ │\n",
+       "    │ │ │      │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`          │ │ │\n",
+       "    │ │ │      │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',        │ │ │\n",
+       "    │ │ │      │ 'STRING TWO', etc.]}`                                                                        │ │ │\n",
+       "    │ │ │      │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer            │ │ │\n",
+       "    │ │ │      │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':     │ │ │\n",
+       "    │ │ │      │ 1}}`                                                                                         │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
        "    │ │ {                                                                                                       │ │\n",
-       "    │ │   \"api_help\": \"curl -X POST -H \\\"Content-Type: application/json\\\" -H \\\"Authorization: Bearer            │ │\n",
-       "    │ │ YOUR_API_KEY\\\" -d '{\\\"prompt\\\": \\\"The quick brown fox\\\", \\\"max_tokens\\\": 5}'                            │ │\n",
-       "    │ │ \\\"https://api.openai.com/v1/engines/davinci/completions\\\"\"                                              │ │\n",
+       "    │ │   \"api_help\": \"curl https://api.openai.com/v1/completions -H 'Content-Type: application/json' -H        │ │\n",
+       "    │ │ 'Authorization: Bearer YOUR_API_KEY' -d '{\\\"model\\\": \\\"text-davinci-003\\\", \\\"prompt\\\": \\\"Once upon a    │ │\n",
+       "    │ │ time\\\", \\\"max_tokens\\\": 50}'\"                                                                           │ │\n",
        "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
-       "    │ │     'api_help': 'curl -X POST -H \"Content-Type: application/json\" -H \"Authorization: Bearer             │ │\n",
-       "    │ │ YOUR_API_KEY\" -d \\'{\"prompt\": \"The quick brown fox\", \"max_tokens\": 5}\\'                                 │ │\n",
-       "    │ │ \"https://api.openai.com/v1/engines/davinci/completions\"'                                                │ │\n",
+       "    │ │     'api_help': 'curl https://api.openai.com/v1/completions -H \\'Content-Type: application/json\\' -H    │ │\n",
+       "    │ │ \\'Authorization: Bearer YOUR_API_KEY\\' -d \\'{\"model\": \"text-davinci-003\", \"prompt\": \"Once upon a time\", │ │\n",
+       "    │ │ \"max_tokens\": 50}\\''                                                                                    │ │\n",
        "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
@@ -487,143 +409,53 @@
       ],
       "text/plain": [
        "Logs\n",
-       "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "│   │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHow do I use OpenAI's Completion API?                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the tags\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mto extract it into.                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field in \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mJSON is the `name` attribute of the corresponding XML, and the value is of the type         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, including\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many types and format requests e.g. requests for lists, objects and specific types. Be       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcorrect and concise. If you are unsure anywhere, enter `null`.                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior:              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}`         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE',       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}`                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index':    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}`                                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"api_help\": {\u001b[0m\u001b[48;2;245;245;220m                                                                                        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"description\": \"Show an example curl command for using openai Completion API\",\u001b[0m\u001b[48;2;245;245;220m                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"format\": \"no-code-secrets\",\u001b[0m\u001b[48;2;245;245;220m                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"name\": \"api_help\",\u001b[0m\u001b[48;2;245;245;220m                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"required\": true\u001b[0m\u001b[48;2;245;245;220m                                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  }\u001b[0m\u001b[48;2;245;245;220m                                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mSkeletonReAsk(\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    incorrect_value={'api_help': {}},\u001b[0m\u001b[48;2;240;255;240m                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    fail_results=[\u001b[0m\u001b[48;2;240;255;240m                                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        FailResult(\u001b[0m\u001b[48;2;240;255;240m                                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            outcome='fail',\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            error_message='JSON does not match schema:\\n{\\n  \"$.api_help\": [\\n    \"{} is not of type \u001b[0m\u001b[48;2;240;255;240m  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m\\'string\\'\"\\n  ]\\n}',\u001b[0m\u001b[48;2;240;255;240m                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            fix_value=None,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            error_spans=None,\u001b[0m\u001b[48;2;240;255;240m                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            metadata=None,\u001b[0m\u001b[48;2;240;255;240m                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            validated_chunk=None\u001b[0m\u001b[48;2;240;255;240m                                                                       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        )\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ],\u001b[0m\u001b[48;2;240;255;240m                                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    additional_properties={}\u001b[0m\u001b[48;2;240;255;240m                                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m)\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
-       "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mI was given the following JSON response, which had problems due to incorrect values.\u001b[0m\u001b[48;2;240;248;255m                   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m{\u001b[0m\u001b[48;2;240;248;255m                                                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \"incorrect_value\": {\u001b[0m\u001b[48;2;240;248;255m                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \"api_help\": {}\u001b[0m\u001b[48;2;240;248;255m                                                                                     \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  },\u001b[0m\u001b[48;2;240;248;255m                                                                                                   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \"error_messages\": [\u001b[0m\u001b[48;2;240;248;255m                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \"JSON does not match schema:\\n{\\n  \\\"$.api_help\\\": [\\n    \\\"{} is not of type 'string'\\\"\\n  ]\\n}\"\u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  ]\u001b[0m\u001b[48;2;240;248;255m                                                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m}\u001b[0m\u001b[48;2;240;248;255m                                                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mHelp me correct the incorrect values based on the given error messages.\u001b[0m\u001b[48;2;240;248;255m                                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mGiven below is XML that describes the information to extract from this document and the tags to extract\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mit into.\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                     \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m`name` attribute of the corresponding XML, and the value is of the type specified by the corresponding \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mXML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mrequests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, \u001b[0m\u001b[48;2;240;248;255m   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255menter `null`.\u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mHere's an example of the structure:\u001b[0m\u001b[48;2;240;248;255m                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m{\u001b[0m\u001b[48;2;240;248;255m                                                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \"api_help\": \"spend\"\u001b[0m\u001b[48;2;240;248;255m                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m}\u001b[0m\u001b[48;2;240;248;255m                                                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m╭─\u001b[0m\u001b[48;2;255;240;242m────────────────────────────────────────────\u001b[0m\u001b[48;2;255;240;242m Instructions \u001b[0m\u001b[48;2;255;240;242m─────────────────────────────────────────────\u001b[0m\u001b[48;2;255;240;242m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mYou are a helpful assistant only capable of communicating with valid JSON, and no other text.\u001b[0m\u001b[48;2;255;240;242m          \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m`name` attribute of the corresponding XML, and the value is of the type specified by the corresponding \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mXML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. \u001b[0m\u001b[48;2;255;240;242m      \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mrequests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, \u001b[0m\u001b[48;2;255;240;242m   \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242menter `null`.\u001b[0m\u001b[48;2;255;240;242m                                                                                          \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mHere are examples of simple (XML, JSON) pairs that show the expected behavior:\u001b[0m\u001b[48;2;255;240;242m                         \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m- `` => `{'foo': 'example one'}`\u001b[0m\u001b[48;2;255;240;242m                    \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m- `` => `{\"bar\": ['STRING ONE', 'STRING TWO', \u001b[0m\u001b[48;2;255;240;242m   \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242metc.]}`\u001b[0m\u001b[48;2;255;240;242m                                                                                                \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;255;240;242m                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHow do I use OpenAI's Completion API?                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the tags\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mto extract it into.                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field in \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mJSON is the `name` attribute of the corresponding XML, and the value is of the type         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, including\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many types and format requests e.g. requests for lists, objects and specific types. Be       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcorrect and concise. If you are unsure anywhere, enter `null`.                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior:              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}`         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE',       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}`                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index':    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}`                                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m                                                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"api_help\": \"curl -X POST -H \\\"Content-Type: application/json\\\" -H \\\"Authorization: Bearer \u001b[0m\u001b[48;2;245;245;220m          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mYOUR_API_KEY\\\" -d '{\\\"prompt\\\": \\\"The quick brown fox\\\", \\\"max_tokens\\\": 5}' \u001b[0m\u001b[48;2;245;245;220m                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m\\\"https://api.openai.com/v1/engines/davinci/completions\\\"\"\u001b[0m\u001b[48;2;245;245;220m                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"api_help\": \"curl https://api.openai.com/v1/completions -H 'Content-Type: application/json' -H \u001b[0m\u001b[48;2;245;245;220m      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m'Authorization: Bearer YOUR_API_KEY' -d '{\\\"model\\\": \\\"text-davinci-003\\\", \\\"prompt\\\": \\\"Once upon a \u001b[0m\u001b[48;2;245;245;220m  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mtime\\\", \\\"max_tokens\\\": 50}'\"\u001b[0m\u001b[48;2;245;245;220m                                                                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'api_help': 'curl -X POST -H \"Content-Type: application/json\" -H \"Authorization: Bearer \u001b[0m\u001b[48;2;240;255;240m           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mYOUR_API_KEY\" -d \\'{\"prompt\": \"The quick brown fox\", \"max_tokens\": 5}\\' \u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m\"https://api.openai.com/v1/engines/davinci/completions\"'\u001b[0m\u001b[48;2;240;255;240m                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'api_help': 'curl https://api.openai.com/v1/completions -H \\'Content-Type: application/json\\' -H \u001b[0m\u001b[48;2;240;255;240m  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m\\'Authorization: Bearer YOUR_API_KEY\\' -d \\'{\"model\": \"text-davinci-003\", \"prompt\": \"Once upon a time\",\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m\"max_tokens\": 50}\\''\u001b[0m\u001b[48;2;240;255;240m                                                                                   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n"
@@ -640,7 +472,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "tiff-env",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -654,14 +486,9 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.1"
+   "version": "3.12.3"
   },
-  "orig_nbformat": 4,
-  "vscode": {
-   "interpreter": {
-    "hash": "ef14f49bbc779f2fde64ca0552c2a99d578405052f5b73f61279551da311a8a1"
-   }
-  }
+  "orig_nbformat": 4
  },
  "nbformat": 4,
  "nbformat_minor": 2
diff --git a/docs/examples/provenance.ipynb b/docs/examples/provenance.ipynb
index 4d0f8faca..529e090fc 100644
--- a/docs/examples/provenance.ipynb
+++ b/docs/examples/provenance.ipynb
@@ -10,17 +10,9 @@
      "output_type": "stream",
      "text": [
       "Installing hub:\u001b[35m/\u001b[0m\u001b[35m/guardrails/\u001b[0m\u001b[95mprovenance_embeddings...\u001b[0m\n",
-      "/home/zayd/workspace/guardrails/docs/.venv/lib/python3.11/site-packages/transformers/tokenization_utils_base.py:1617: FutureWarning: `clean_up_tokenization_spaces` was not set. It will be set to `True` by default. This behavior will be deprecated in transformers v4.45, and will be then set to `False` by default. For more details check this issue: https://github.com/huggingface/transformers/issues/31884\n",
-      "  warnings.warn(\n",
-      "✅Successfully installed guardrails/provenance_embeddings!\n",
-      "\n",
-      "\n",
+      "ERROR:guardrails-cli:No module named 'guardrails.hub.guardrails.provenance_embeddings'\n",
       "Installing hub:\u001b[35m/\u001b[0m\u001b[35m/guardrails/\u001b[0m\u001b[95mprovenance_llm...\u001b[0m\n",
-      "/home/zayd/workspace/guardrails/docs/.venv/lib/python3.11/site-packages/transformers/tokenization_utils_base.py:1617: FutureWarning: `clean_up_tokenization_spaces` was not set. It will be set to `True` by default. This behavior will be deprecated in transformers v4.45, and will be then set to `False` by default. For more details check this issue: https://github.com/huggingface/transformers/issues/31884\n",
-      "  warnings.warn(\n",
-      "✅Successfully installed guardrails/provenance_llm!\n",
-      "\n",
-      "\n"
+      "ERROR:guardrails-cli:No module named 'guardrails.hub.guardrails.provenance_llm'\n"
      ]
     }
    ],
@@ -288,18 +280,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 4,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/home/zayd/workspace/guardrails/docs/.venv/lib/python3.11/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
-      "  from tqdm.autonotebook import tqdm, trange\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "# Create an embedding function that uses a cohere model to embed the text\n",
     "from rich import print\n",
@@ -338,7 +321,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -357,14 +340,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/home/zayd/workspace/guardrails/docs/.venv/lib/python3.11/site-packages/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
       "  warnings.warn(\n"
      ]
     },
@@ -373,20 +356,17 @@
       "text/html": [
        "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ No messages.                                                                                            │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ To retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits  │ │\n",
        "    │ │ so the cat doesn’t feel cornered. Find the right litterbox for your cat, as well as the right litter.   │ │\n",
        "    │ │ Place the litterbox in a good spot, away from heavily trafficked and noisy areas. Keep the litterbox    │ │\n",
        "    │ │ very clean, and do not punish the cat or confine her to just one room. Once training is complete, it is │ │\n",
        "    │ │ important to clean the litter box regularly and to provide a safe and healthy environment for the cat.  │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ 'To retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits │ │\n",
        "    │ │ so the cat doesn’t feel cornered.\\nFind the right litterbox for your cat, as well as the right          │ │\n",
        "    │ │ litter.\\nKeep the litterbox very clean, and do not punish the cat or confine her to just one            │ │\n",
@@ -399,20 +379,17 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m Prompt \u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m Message History \u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo messages.\u001b[0m\u001b[48;2;231;223;235m                                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mTo retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mso the cat doesn’t feel cornered. Find the right litterbox for your cat, as well as the right litter. \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mPlace the litterbox in a good spot, away from heavily trafficked and noisy areas. Keep the litterbox \u001b[0m\u001b[48;2;245;245;220m  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mvery clean, and do not punish the cat or confine her to just one room. Once training is complete, it is\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mimportant to clean the litter box regularly and to provide a safe and healthy environment for the cat.\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m'To retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mso the cat doesn’t feel cornered.\\nFind the right litterbox for your cat, as well as the right \u001b[0m\u001b[48;2;240;255;240m        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mlitter.\\nKeep the litterbox very clean, and do not punish the cat or confine her to just one \u001b[0m\u001b[48;2;240;255;240m          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
@@ -422,7 +399,7 @@
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n"
       ]
      },
-     "execution_count": 5,
+     "execution_count": 6,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -447,25 +424,30 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    },
     {
      "data": {
       "text/html": [
        "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ No messages.                                                                                            │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ Cats love lollipops and other sweet and sour foods. Cats can be retrained to use a litter box. Reward   │ │\n",
        "    │ │ them when they do with lots of candy.                                                                   │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ 'Cats can be retrained to use a litter box.'                                                            │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
@@ -474,23 +456,20 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m Prompt \u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m Message History \u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo messages.\u001b[0m\u001b[48;2;231;223;235m                                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mCats love lollipops and other sweet and sour foods. Cats can be retrained to use a litter box. Reward \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mthem when they do with lots of candy.\u001b[0m\u001b[48;2;245;245;220m                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m'Cats can be retrained to use a litter box.'\u001b[0m\u001b[48;2;240;255;240m                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n"
       ]
      },
-     "execution_count": 6,
+     "execution_count": 7,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -529,7 +508,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -551,33 +530,36 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n",
+      "/Users/dtam/dev/guardrails/guardrails/hub/guardrails/provenance_llm/validator/main.py:227: UserWarning: The LLM returned an invalid response. Considering the sentence as unsupported...\n",
+      "  warn(\n"
+     ]
+    },
     {
      "data": {
       "text/html": [
        "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ No messages.                                                                                            │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ To retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits  │ │\n",
        "    │ │ so the cat doesn’t feel cornered. Find the right litterbox for your cat, as well as the right litter.   │ │\n",
        "    │ │ Place the litterbox in a good spot, away from heavily trafficked and noisy areas. Keep the litterbox    │ │\n",
        "    │ │ very clean, and do not punish the cat or confine her to just one room. Once training is complete, it is │ │\n",
        "    │ │ important to clean the litter box regularly and to provide a safe and healthy environment for the cat.  │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
-       "    │ │ 'To retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits │ │\n",
-       "    │ │ so the cat doesn’t feel cornered.\\nFind the right litterbox for your cat, as well as the right          │ │\n",
-       "    │ │ litter.\\nPlace the litterbox in a good spot, away from heavily trafficked and noisy areas.\\nOnce        │ │\n",
-       "    │ │ training is complete, it is important to clean the litter box regularly and to provide a safe and       │ │\n",
-       "    │ │ healthy environment for the cat.'                                                                       │ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ │ ''                                                                                                      │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "
\n" @@ -585,30 +567,23 @@ "text/plain": [ "Logs\n", "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n", - " │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m Prompt \u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n", - " │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n", - " │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m Message History \u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo messages.\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", " │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mTo retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mso the cat doesn’t feel cornered. Find the right litterbox for your cat, as well as the right litter. \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mPlace the litterbox in a good spot, away from heavily trafficked and noisy areas. Keep the litterbox \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mvery clean, and do not punish the cat or confine her to just one room. Once training is complete, it is\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mimportant to clean the litter box regularly and to provide a safe and healthy environment for the cat.\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m'To retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mso the cat doesn’t feel cornered.\\nFind the right litterbox for your cat, as well as the right \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mlitter.\\nPlace the litterbox in a good spot, away from heavily trafficked and noisy areas.\\nOnce \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mtraining is complete, it is important to clean the litter box regularly and to provide a safe and \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mhealthy environment for the cat.'\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m''\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", " │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" ] }, - "execution_count": 8, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -627,26 +602,33 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n", + "/Users/dtam/dev/guardrails/guardrails/hub/guardrails/provenance_llm/validator/main.py:227: UserWarning: The LLM returned an invalid response. Considering the sentence as unsupported...\n", + " warn(\n" + ] + }, { "data": { "text/html": [ "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ No messages.                                                                                            │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ Cats love lollipops and other sweet and sour foods. Cats can be retrained to use a litter box. Reward   │ │\n",
        "    │ │ them when they do with lots of candy.                                                                   │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
-       "    │ │ 'Cats can be retrained to use a litter box.'                                                            │ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ │ ''                                                                                                      │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "
\n" @@ -654,23 +636,20 @@ "text/plain": [ "Logs\n", "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n", - " │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m Prompt \u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n", - " │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n", - " │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m Message History \u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo messages.\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", " │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mCats love lollipops and other sweet and sour foods. Cats can be retrained to use a litter box. Reward \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mthem when they do with lots of candy.\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m'Cats can be retrained to use a litter box.'\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m''\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", " │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -696,7 +675,7 @@ ], "metadata": { "kernelspec": { - "display_name": "gd-base", + "display_name": "litellm", "language": "python", "name": "python3" }, @@ -710,7 +689,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.7" + "version": "3.12.3" }, "orig_nbformat": 4 }, diff --git a/docs/examples/recipe_generation.ipynb b/docs/examples/recipe_generation.ipynb index 286888aba..2f66e47ed 100644 --- a/docs/examples/recipe_generation.ipynb +++ b/docs/examples/recipe_generation.ipynb @@ -21,7 +21,16 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n", + " from tqdm.autonotebook import tqdm, trange\n" + ] + } + ], "source": [ "import guardrails as gd\n", "from rich import print" @@ -90,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -116,11 +125,12 @@ " \n", "\n", "\n", - "\n", - "\n", + "\n", + "\n", "Generate a recipe for vegan mac and cheese.\n", "${gr.complete_xml_suffix}\n", - "\n", + "\n", + "\n", "\n", "\n", "\"\"\"" @@ -135,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -197,7 +207,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -249,9 +259,18 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] + } + ], "source": [ "# Add your OPENAI_API_KEY as an environment variable if it's not already set\n", "# import os\n", @@ -274,7 +293,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -288,17 +307,17 @@ "<output>\n", " <list description=\"What are the ingredients for the recipe?\" name=\"ingredients\" required=\"true\">\n", " <object required=\"true\">\n", - " <integer name=\"index\" required=\"true\"></integer>\n", + " <integer format=\"1-indexed\" name=\"index\" required=\"true\"></integer>\n", " <string format=\"is-vegan\" name=\"name\" required=\"true\"></string>\n", " <string description=\"Suggested brand for the ingredient (if any)\" name=\"brand\" required=\"true\"></string>\n", " <bool description=\"Is the ingredient necessary?\" name=\"optional\" required=\"true\"></bool>\n", - " <float description=\"how much of this ingredient to use\" name=\"quantity\" required=\"true\"></float>\n", - " <string name=\"units\" required=\"true\"></string>\n", + " <float format=\"units-imperial\" name=\"quantity\" required=\"true\"></float>\n", + " <string format=\"units-imperial\" name=\"units\" required=\"true\"></string>\n", " </object>\n", " </list>\n", " <list description=\"What are the instructions for the recipe?\" name=\"instructions\" required=\"true\">\n", " <object required=\"true\">\n", - " <integer name=\"index\" required=\"true\"></integer>\n", + " <integer format=\"1-indexed\" name=\"index\" required=\"true\"></integer>\n", " <string name=\"step\" required=\"true\"></string>\n", " </object>\n", " </list>\n", @@ -327,17 +346,17 @@ "\u001b[1m<\u001b[0m\u001b[1;95moutput\u001b[0m\u001b[39m>\u001b[0m\n", "\u001b[39m \u001b[0m\n", "\u001b[39m \u001b[0m\n", - "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95minteger\u001b[0m\u001b[39m>\u001b[0m\n", + "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95minteger\u001b[0m\u001b[39m>\u001b[0m\n", "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mstring\u001b[0m\u001b[39m>\u001b[0m\n", "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mstring\u001b[0m\u001b[39m>\u001b[0m\n", "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mbool\u001b[0m\u001b[39m>\u001b[0m\n", - "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mfloat\u001b[0m\u001b[39m>\u001b[0m\n", - "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mstring\u001b[0m\u001b[39m>\u001b[0m\n", + "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mfloat\u001b[0m\u001b[39m>\u001b[0m\n", + "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mstring\u001b[0m\u001b[39m>\u001b[0m\n", "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mobject\u001b[0m\u001b[39m>\u001b[0m\n", "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mlist\u001b[0m\u001b[39m>\u001b[0m\n", "\u001b[39m \u001b[0m\n", "\u001b[39m \u001b[0m\n", - "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95minteger\u001b[0m\u001b[39m>\u001b[0m\n", + "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95minteger\u001b[0m\u001b[39m>\u001b[0m\n", "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mstring\u001b[0m\u001b[39m>\u001b[0m\n", "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mobject\u001b[0m\u001b[39m>\u001b[0m\n", "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mlist\u001b[0m\u001b[39m>\u001b[0m\n", @@ -362,7 +381,7 @@ } ], "source": [ - "print(guard.history.first.iterations.first.inputs.msg_history[0]['content'])" + "print(guard.history.first.iterations.first.inputs.messages[0]['content'])" ] }, { @@ -376,7 +395,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -433,31 +452,18 @@ " 'units': 'teaspoon'\n", " },\n", " {'index': 7, 'name': 'salt', 'brand': 'Morton', 'optional': False, 'quantity': 1.0, 'units': 'teaspoon'},\n", - " {\n", - " 'index': 8,\n", - " 'name': 'pepper',\n", - " 'brand': 'McCormick',\n", - " 'optional': True,\n", - " 'quantity': 0.5,\n", - " 'units': 'teaspoon'\n", - " }\n", + " {'index': 8, 'name': 'water', 'brand': 'Generic', 'optional': False, 'quantity': 1.5, 'units': 'cups'}\n", " ],\n", " 'instructions': [\n", " {'index': 1, 'step': 'Soak the cashews in water for at least 2 hours, then drain.'},\n", - " {\n", - " 'index': 2,\n", - " 'step': 'Cook the macaroni according to the package instructions, then drain and set aside.'\n", - " },\n", + " {'index': 2, 'step': 'Cook the macaroni according to the package instructions, then drain.'},\n", " {\n", " 'index': 3,\n", " 'step': 'In a blender, combine the soaked cashews, nutritional yeast, garlic powder, onion powder, \n", - "turmeric (if using), salt, and pepper. Blend until smooth.'\n", + "turmeric, salt, and water. Blend until smooth.'\n", " },\n", - " {'index': 4, 'step': 'Pour the cashew sauce over the cooked macaroni and stir until well coated.'},\n", - " {\n", - " 'index': 5,\n", - " 'step': 'Serve the vegan mac and cheese hot, with extra nutritional yeast or pepper on top if desired.'\n", - " }\n", + " {'index': 4, 'step': 'Pour the sauce over the cooked macaroni and stir until well coated.'},\n", + " {'index': 5, 'step': 'Serve the vegan mac and cheese hot.'}\n", " ]\n", "}\n", "\n" @@ -514,31 +520,18 @@ " \u001b[32m'units'\u001b[0m: \u001b[32m'teaspoon'\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", " \u001b[1m{\u001b[0m\u001b[32m'index'\u001b[0m: \u001b[1;36m7\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'salt'\u001b[0m, \u001b[32m'brand'\u001b[0m: \u001b[32m'Morton'\u001b[0m, \u001b[32m'optional'\u001b[0m: \u001b[3;91mFalse\u001b[0m, \u001b[32m'quantity'\u001b[0m: \u001b[1;36m1.0\u001b[0m, \u001b[32m'units'\u001b[0m: \u001b[32m'teaspoon'\u001b[0m\u001b[1m}\u001b[0m,\n", - " \u001b[1m{\u001b[0m\n", - " \u001b[32m'index'\u001b[0m: \u001b[1;36m8\u001b[0m,\n", - " \u001b[32m'name'\u001b[0m: \u001b[32m'pepper'\u001b[0m,\n", - " \u001b[32m'brand'\u001b[0m: \u001b[32m'McCormick'\u001b[0m,\n", - " \u001b[32m'optional'\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n", - " \u001b[32m'quantity'\u001b[0m: \u001b[1;36m0.5\u001b[0m,\n", - " \u001b[32m'units'\u001b[0m: \u001b[32m'teaspoon'\u001b[0m\n", - " \u001b[1m}\u001b[0m\n", + " \u001b[1m{\u001b[0m\u001b[32m'index'\u001b[0m: \u001b[1;36m8\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'water'\u001b[0m, \u001b[32m'brand'\u001b[0m: \u001b[32m'Generic'\u001b[0m, \u001b[32m'optional'\u001b[0m: \u001b[3;91mFalse\u001b[0m, \u001b[32m'quantity'\u001b[0m: \u001b[1;36m1.5\u001b[0m, \u001b[32m'units'\u001b[0m: \u001b[32m'cups'\u001b[0m\u001b[1m}\u001b[0m\n", " \u001b[1m]\u001b[0m,\n", " \u001b[32m'instructions'\u001b[0m: \u001b[1m[\u001b[0m\n", " \u001b[1m{\u001b[0m\u001b[32m'index'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'step'\u001b[0m: \u001b[32m'Soak the cashews in water for at least 2 hours, then drain.'\u001b[0m\u001b[1m}\u001b[0m,\n", - " \u001b[1m{\u001b[0m\n", - " \u001b[32m'index'\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - " \u001b[32m'step'\u001b[0m: \u001b[32m'Cook the macaroni according to the package instructions, then drain and set aside.'\u001b[0m\n", - " \u001b[1m}\u001b[0m,\n", + " \u001b[1m{\u001b[0m\u001b[32m'index'\u001b[0m: \u001b[1;36m2\u001b[0m, \u001b[32m'step'\u001b[0m: \u001b[32m'Cook the macaroni according to the package instructions, then drain.'\u001b[0m\u001b[1m}\u001b[0m,\n", " \u001b[1m{\u001b[0m\n", " \u001b[32m'index'\u001b[0m: \u001b[1;36m3\u001b[0m,\n", " \u001b[32m'step'\u001b[0m: \u001b[32m'In a blender, combine the soaked cashews, nutritional yeast, garlic powder, onion powder, \u001b[0m\n", - "\u001b[32mturmeric \u001b[0m\u001b[32m(\u001b[0m\u001b[32mif using\u001b[0m\u001b[32m)\u001b[0m\u001b[32m, salt, and pepper. Blend until smooth.'\u001b[0m\n", + "\u001b[32mturmeric, salt, and water. Blend until smooth.'\u001b[0m\n", " \u001b[1m}\u001b[0m,\n", - " \u001b[1m{\u001b[0m\u001b[32m'index'\u001b[0m: \u001b[1;36m4\u001b[0m, \u001b[32m'step'\u001b[0m: \u001b[32m'Pour the cashew sauce over the cooked macaroni and stir until well coated.'\u001b[0m\u001b[1m}\u001b[0m,\n", - " \u001b[1m{\u001b[0m\n", - " \u001b[32m'index'\u001b[0m: \u001b[1;36m5\u001b[0m,\n", - " \u001b[32m'step'\u001b[0m: \u001b[32m'Serve the vegan mac and cheese hot, with extra nutritional yeast or pepper on top if desired.'\u001b[0m\n", - " \u001b[1m}\u001b[0m\n", + " \u001b[1m{\u001b[0m\u001b[32m'index'\u001b[0m: \u001b[1;36m4\u001b[0m, \u001b[32m'step'\u001b[0m: \u001b[32m'Pour the sauce over the cooked macaroni and stir until well coated.'\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[1m{\u001b[0m\u001b[32m'index'\u001b[0m: \u001b[1;36m5\u001b[0m, \u001b[32m'step'\u001b[0m: \u001b[32m'Serve the vegan mac and cheese hot.'\u001b[0m\u001b[1m}\u001b[0m\n", " \u001b[1m]\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] @@ -553,67 +546,455 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Logs\n",
-       "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
-       "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
-       "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
-       "    │ │ │ user │                                                                                              │ │ │\n",
-       "    │ │ │      │ Generate a recipe for vegan mac and cheese.                                                  │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ │      │ Given below is XML that describes the information to extract from this document and the tags │ │ │\n",
-       "    │ │ │      │ to extract it into.                                                                          │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ │      │ <output>                                                                                     │ │ │\n",
-       "    │ │ │      │   <list description=\"What are the ingredients for the recipe?\" name=\"ingredients\"            │ │ │\n",
-       "    │ │ │      │ required=\"true\">                                                                             │ │ │\n",
-       "    │ │ │      │     <object required=\"true\">                                                                 │ │ │\n",
-       "    │ │ │      │       <integer name=\"index\" required=\"true\"></integer>                                       │ │ │\n",
-       "    │ │ │      │       <string format=\"is-vegan\" name=\"name\" required=\"true\"></string>                        │ │ │\n",
-       "    │ │ │      │       <string description=\"Suggested brand for the ingredient (if any)\" name=\"brand\"         │ │ │\n",
-       "    │ │ │      │ required=\"true\"></string>                                                                    │ │ │\n",
-       "    │ │ │      │       <bool description=\"Is the ingredient necessary?\" name=\"optional\"                       │ │ │\n",
-       "    │ │ │      │ required=\"true\"></bool>                                                                      │ │ │\n",
-       "    │ │ │      │       <float description=\"how much of this ingredient to use\" name=\"quantity\"                │ │ │\n",
-       "    │ │ │      │ required=\"true\"></float>                                                                     │ │ │\n",
-       "    │ │ │      │       <string name=\"units\" required=\"true\"></string>                                         │ │ │\n",
-       "    │ │ │      │     </object>                                                                                │ │ │\n",
-       "    │ │ │      │   </list>                                                                                    │ │ │\n",
-       "    │ │ │      │   <list description=\"What are the instructions for the recipe?\" name=\"instructions\"          │ │ │\n",
-       "    │ │ │      │ required=\"true\">                                                                             │ │ │\n",
-       "    │ │ │      │     <object required=\"true\">                                                                 │ │ │\n",
-       "    │ │ │      │       <integer name=\"index\" required=\"true\"></integer>                                       │ │ │\n",
-       "    │ │ │      │       <string name=\"step\" required=\"true\"></string>                                          │ │ │\n",
-       "    │ │ │      │     </object>                                                                                │ │ │\n",
-       "    │ │ │      │   </list>                                                                                    │ │ │\n",
-       "    │ │ │      │ </output>                                                                                    │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ │      │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in  │ │ │\n",
-       "    │ │ │      │ JSON is the `name` attribute of the corresponding XML, and the value is of the type          │ │ │\n",
-       "    │ │ │      │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │ │\n",
-       "    │ │ │      │ any types and format requests e.g. requests for lists, objects and specific types. Be        │ │ │\n",
-       "    │ │ │      │ correct and concise. If you are unsure anywhere, enter `null`.                               │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ │      │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:               │ │ │\n",
-       "    │ │ │      │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`          │ │ │\n",
-       "    │ │ │      │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',        │ │ │\n",
-       "    │ │ │      │ 'STRING TWO', etc.]}`                                                                        │ │ │\n",
-       "    │ │ │      │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer            │ │ │\n",
-       "    │ │ │      │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':     │ │ │\n",
-       "    │ │ │      │ 1}}`                                                                                         │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
+       "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
+       "│   │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "│   │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "│   │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
+       "│   │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "│   │ │ │ user │                                                                                              │ │ │\n",
+       "│   │ │ │      │ Generate a recipe for vegan mac and cheese.                                                  │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ Given below is XML that describes the information to extract from this document and the tags │ │ │\n",
+       "│   │ │ │      │ to extract it into.                                                                          │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ <output>                                                                                     │ │ │\n",
+       "│   │ │ │      │   <list description=\"What are the ingredients for the recipe?\" name=\"ingredients\"            │ │ │\n",
+       "│   │ │ │      │ required=\"true\">                                                                             │ │ │\n",
+       "│   │ │ │      │     <object required=\"true\">                                                                 │ │ │\n",
+       "│   │ │ │      │       <integer format=\"1-indexed\" name=\"index\" required=\"true\"></integer>                    │ │ │\n",
+       "│   │ │ │      │       <string format=\"is-vegan\" name=\"name\" required=\"true\"></string>                        │ │ │\n",
+       "│   │ │ │      │       <string description=\"Suggested brand for the ingredient (if any)\" name=\"brand\"         │ │ │\n",
+       "│   │ │ │      │ required=\"true\"></string>                                                                    │ │ │\n",
+       "│   │ │ │      │       <bool description=\"Is the ingredient necessary?\" name=\"optional\"                       │ │ │\n",
+       "│   │ │ │      │ required=\"true\"></bool>                                                                      │ │ │\n",
+       "│   │ │ │      │       <float format=\"units-imperial\" name=\"quantity\" required=\"true\"></float>                │ │ │\n",
+       "│   │ │ │      │       <string format=\"units-imperial\" name=\"units\" required=\"true\"></string>                 │ │ │\n",
+       "│   │ │ │      │     </object>                                                                                │ │ │\n",
+       "│   │ │ │      │   </list>                                                                                    │ │ │\n",
+       "│   │ │ │      │   <list description=\"What are the instructions for the recipe?\" name=\"instructions\"          │ │ │\n",
+       "│   │ │ │      │ required=\"true\">                                                                             │ │ │\n",
+       "│   │ │ │      │     <object required=\"true\">                                                                 │ │ │\n",
+       "│   │ │ │      │       <integer format=\"1-indexed\" name=\"index\" required=\"true\"></integer>                    │ │ │\n",
+       "│   │ │ │      │       <string name=\"step\" required=\"true\"></string>                                          │ │ │\n",
+       "│   │ │ │      │     </object>                                                                                │ │ │\n",
+       "│   │ │ │      │   </list>                                                                                    │ │ │\n",
+       "│   │ │ │      │ </output>                                                                                    │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in  │ │ │\n",
+       "│   │ │ │      │ JSON is the `name` attribute of the corresponding XML, and the value is of the type          │ │ │\n",
+       "│   │ │ │      │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │ │\n",
+       "│   │ │ │      │ any types and format requests e.g. requests for lists, objects and specific types. Be        │ │ │\n",
+       "│   │ │ │      │ correct and concise. If you are unsure anywhere, enter `null`.                               │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:               │ │ │\n",
+       "│   │ │ │      │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`          │ │ │\n",
+       "│   │ │ │      │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',        │ │ │\n",
+       "│   │ │ │      │ 'STRING TWO', etc.]}`                                                                        │ │ │\n",
+       "│   │ │ │      │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer            │ │ │\n",
+       "│   │ │ │      │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':     │ │ │\n",
+       "│   │ │ │      │ 1}}`                                                                                         │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
+       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "│   │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "│   │ │ {                                                                                                       │ │\n",
+       "│   │ │   \"ingredients\": [                                                                                      │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 1,                                                                                       │ │\n",
+       "│   │ │       \"name\": \"macaroni\",                                                                               │ │\n",
+       "│   │ │       \"brand\": \"Barilla\",                                                                               │ │\n",
+       "│   │ │       \"optional\": false,                                                                                │ │\n",
+       "│   │ │       \"quantity\": 8.0,                                                                                  │ │\n",
+       "│   │ │       \"units\": \"ounces\"                                                                                 │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 2,                                                                                       │ │\n",
+       "│   │ │       \"name\": \"raw cashews\",                                                                            │ │\n",
+       "│   │ │       \"brand\": \"Trader Joe's\",                                                                          │ │\n",
+       "│   │ │       \"optional\": false,                                                                                │ │\n",
+       "│   │ │       \"quantity\": 1.0,                                                                                  │ │\n",
+       "│   │ │       \"units\": \"cup\"                                                                                    │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 3,                                                                                       │ │\n",
+       "│   │ │       \"name\": \"nutritional yeast\",                                                                      │ │\n",
+       "│   │ │       \"brand\": \"Bob's Red Mill\",                                                                        │ │\n",
+       "│   │ │       \"optional\": false,                                                                                │ │\n",
+       "│   │ │       \"quantity\": 0.25,                                                                                 │ │\n",
+       "│   │ │       \"units\": \"cup\"                                                                                    │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 4,                                                                                       │ │\n",
+       "│   │ │       \"name\": \"garlic powder\",                                                                          │ │\n",
+       "│   │ │       \"brand\": \"McCormick\",                                                                             │ │\n",
+       "│   │ │       \"optional\": false,                                                                                │ │\n",
+       "│   │ │       \"quantity\": 1.0,                                                                                  │ │\n",
+       "│   │ │       \"units\": \"teaspoon\"                                                                               │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 5,                                                                                       │ │\n",
+       "│   │ │       \"name\": \"onion powder\",                                                                           │ │\n",
+       "│   │ │       \"brand\": \"McCormick\",                                                                             │ │\n",
+       "│   │ │       \"optional\": false,                                                                                │ │\n",
+       "│   │ │       \"quantity\": 1.0,                                                                                  │ │\n",
+       "│   │ │       \"units\": \"teaspoon\"                                                                               │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 6,                                                                                       │ │\n",
+       "│   │ │       \"name\": \"turmeric\",                                                                               │ │\n",
+       "│   │ │       \"brand\": \"Simply Organic\",                                                                        │ │\n",
+       "│   │ │       \"optional\": true,                                                                                 │ │\n",
+       "│   │ │       \"quantity\": 0.5,                                                                                  │ │\n",
+       "│   │ │       \"units\": \"teaspoon\"                                                                               │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 7,                                                                                       │ │\n",
+       "│   │ │       \"name\": \"salt\",                                                                                   │ │\n",
+       "│   │ │       \"brand\": \"Morton\",                                                                                │ │\n",
+       "│   │ │       \"optional\": false,                                                                                │ │\n",
+       "│   │ │       \"quantity\": 1.0,                                                                                  │ │\n",
+       "│   │ │       \"units\": \"teaspoon\"                                                                               │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 8,                                                                                       │ │\n",
+       "│   │ │       \"name\": \"water\",                                                                                  │ │\n",
+       "│   │ │       \"brand\": null,                                                                                    │ │\n",
+       "│   │ │       \"optional\": false,                                                                                │ │\n",
+       "│   │ │       \"quantity\": 1.5,                                                                                  │ │\n",
+       "│   │ │       \"units\": \"cups\"                                                                                   │ │\n",
+       "│   │ │     }                                                                                                   │ │\n",
+       "│   │ │   ],                                                                                                    │ │\n",
+       "│   │ │   \"instructions\": [                                                                                     │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 1,                                                                                       │ │\n",
+       "│   │ │       \"step\": \"Soak the cashews in water for at least 2 hours, then drain.\"                             │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 2,                                                                                       │ │\n",
+       "│   │ │       \"step\": \"Cook the macaroni according to the package instructions, then drain.\"                    │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 3,                                                                                       │ │\n",
+       "│   │ │       \"step\": \"In a blender, combine the soaked cashews, nutritional yeast, garlic powder, onion        │ │\n",
+       "│   │ │ powder, turmeric, salt, and water. Blend until smooth.\"                                                 │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 4,                                                                                       │ │\n",
+       "│   │ │       \"step\": \"Pour the sauce over the cooked macaroni and stir until well coated.\"                     │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     {                                                                                                   │ │\n",
+       "│   │ │       \"index\": 5,                                                                                       │ │\n",
+       "│   │ │       \"step\": \"Serve the vegan mac and cheese hot.\"                                                     │ │\n",
+       "│   │ │     }                                                                                                   │ │\n",
+       "│   │ │   ]                                                                                                     │ │\n",
+       "│   │ │ }                                                                                                       │ │\n",
+       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "│   │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "│   │ │ SkeletonReAsk(                                                                                          │ │\n",
+       "│   │ │     incorrect_value={                                                                                   │ │\n",
+       "│   │ │         'ingredients': [                                                                                │ │\n",
+       "│   │ │             {                                                                                           │ │\n",
+       "│   │ │                 'index': 1,                                                                             │ │\n",
+       "│   │ │                 'name': 'macaroni',                                                                     │ │\n",
+       "│   │ │                 'brand': 'Barilla',                                                                     │ │\n",
+       "│   │ │                 'optional': False,                                                                      │ │\n",
+       "│   │ │                 'quantity': 8.0,                                                                        │ │\n",
+       "│   │ │                 'units': 'ounces'                                                                       │ │\n",
+       "│   │ │             },                                                                                          │ │\n",
+       "│   │ │             {                                                                                           │ │\n",
+       "│   │ │                 'index': 2,                                                                             │ │\n",
+       "│   │ │                 'name': 'raw cashews',                                                                  │ │\n",
+       "│   │ │                 'brand': \"Trader Joe's\",                                                                │ │\n",
+       "│   │ │                 'optional': False,                                                                      │ │\n",
+       "│   │ │                 'quantity': 1.0,                                                                        │ │\n",
+       "│   │ │                 'units': 'cup'                                                                          │ │\n",
+       "│   │ │             },                                                                                          │ │\n",
+       "│   │ │             {                                                                                           │ │\n",
+       "│   │ │                 'index': 3,                                                                             │ │\n",
+       "│   │ │                 'name': 'nutritional yeast',                                                            │ │\n",
+       "│   │ │                 'brand': \"Bob's Red Mill\",                                                              │ │\n",
+       "│   │ │                 'optional': False,                                                                      │ │\n",
+       "│   │ │                 'quantity': 0.25,                                                                       │ │\n",
+       "│   │ │                 'units': 'cup'                                                                          │ │\n",
+       "│   │ │             },                                                                                          │ │\n",
+       "│   │ │             {                                                                                           │ │\n",
+       "│   │ │                 'index': 4,                                                                             │ │\n",
+       "│   │ │                 'name': 'garlic powder',                                                                │ │\n",
+       "│   │ │                 'brand': 'McCormick',                                                                   │ │\n",
+       "│   │ │                 'optional': False,                                                                      │ │\n",
+       "│   │ │                 'quantity': 1.0,                                                                        │ │\n",
+       "│   │ │                 'units': 'teaspoon'                                                                     │ │\n",
+       "│   │ │             },                                                                                          │ │\n",
+       "│   │ │             {                                                                                           │ │\n",
+       "│   │ │                 'index': 5,                                                                             │ │\n",
+       "│   │ │                 'name': 'onion powder',                                                                 │ │\n",
+       "│   │ │                 'brand': 'McCormick',                                                                   │ │\n",
+       "│   │ │                 'optional': False,                                                                      │ │\n",
+       "│   │ │                 'quantity': 1.0,                                                                        │ │\n",
+       "│   │ │                 'units': 'teaspoon'                                                                     │ │\n",
+       "│   │ │             },                                                                                          │ │\n",
+       "│   │ │             {                                                                                           │ │\n",
+       "│   │ │                 'index': 6,                                                                             │ │\n",
+       "│   │ │                 'name': 'turmeric',                                                                     │ │\n",
+       "│   │ │                 'brand': 'Simply Organic',                                                              │ │\n",
+       "│   │ │                 'optional': True,                                                                       │ │\n",
+       "│   │ │                 'quantity': 0.5,                                                                        │ │\n",
+       "│   │ │                 'units': 'teaspoon'                                                                     │ │\n",
+       "│   │ │             },                                                                                          │ │\n",
+       "│   │ │             {                                                                                           │ │\n",
+       "│   │ │                 'index': 7,                                                                             │ │\n",
+       "│   │ │                 'name': 'salt',                                                                         │ │\n",
+       "│   │ │                 'brand': 'Morton',                                                                      │ │\n",
+       "│   │ │                 'optional': False,                                                                      │ │\n",
+       "│   │ │                 'quantity': 1.0,                                                                        │ │\n",
+       "│   │ │                 'units': 'teaspoon'                                                                     │ │\n",
+       "│   │ │             },                                                                                          │ │\n",
+       "│   │ │             {                                                                                           │ │\n",
+       "│   │ │                 'index': 8,                                                                             │ │\n",
+       "│   │ │                 'name': 'water',                                                                        │ │\n",
+       "│   │ │                 'brand': None,                                                                          │ │\n",
+       "│   │ │                 'optional': False,                                                                      │ │\n",
+       "│   │ │                 'quantity': 1.5,                                                                        │ │\n",
+       "│   │ │                 'units': 'cups'                                                                         │ │\n",
+       "│   │ │             }                                                                                           │ │\n",
+       "│   │ │         ],                                                                                              │ │\n",
+       "│   │ │         'instructions': [                                                                               │ │\n",
+       "│   │ │             {                                                                                           │ │\n",
+       "│   │ │                 'index': 1,                                                                             │ │\n",
+       "│   │ │                 'step': 'Soak the cashews in water for at least 2 hours, then drain.'                   │ │\n",
+       "│   │ │             },                                                                                          │ │\n",
+       "│   │ │             {                                                                                           │ │\n",
+       "│   │ │                 'index': 2,                                                                             │ │\n",
+       "│   │ │                 'step': 'Cook the macaroni according to the package instructions, then drain.'          │ │\n",
+       "│   │ │             },                                                                                          │ │\n",
+       "│   │ │             {                                                                                           │ │\n",
+       "│   │ │                 'index': 3,                                                                             │ │\n",
+       "│   │ │                 'step': 'In a blender, combine the soaked cashews, nutritional yeast, garlic powder,    │ │\n",
+       "│   │ │ onion powder, turmeric, salt, and water. Blend until smooth.'                                           │ │\n",
+       "│   │ │             },                                                                                          │ │\n",
+       "│   │ │             {                                                                                           │ │\n",
+       "│   │ │                 'index': 4,                                                                             │ │\n",
+       "│   │ │                 'step': 'Pour the sauce over the cooked macaroni and stir until well coated.'           │ │\n",
+       "│   │ │             },                                                                                          │ │\n",
+       "│   │ │             {'index': 5, 'step': 'Serve the vegan mac and cheese hot.'}                                 │ │\n",
+       "│   │ │         ]                                                                                               │ │\n",
+       "│   │ │     },                                                                                                  │ │\n",
+       "│   │ │     fail_results=[                                                                                      │ │\n",
+       "│   │ │         FailResult(                                                                                     │ │\n",
+       "│   │ │             outcome='fail',                                                                             │ │\n",
+       "│   │ │             error_message='JSON does not match schema:\\n{\\n  \"$.ingredients[7].brand\": [\\n    \"None is  │ │\n",
+       "│   │ │ not of type <SimpleTypes.STRING: \\'string\\'>\"\\n  ]\\n}',                                                 │ │\n",
+       "│   │ │             fix_value=None,                                                                             │ │\n",
+       "│   │ │             error_spans=None,                                                                           │ │\n",
+       "│   │ │             metadata=None,                                                                              │ │\n",
+       "│   │ │             validated_chunk=None                                                                        │ │\n",
+       "│   │ │         )                                                                                               │ │\n",
+       "│   │ │     ],                                                                                                  │ │\n",
+       "│   │ │     additional_properties={}                                                                            │ │\n",
+       "│   │ │ )                                                                                                       │ │\n",
+       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃   Role  Content                                                                                    ┃ │ │\n",
+       "    │ │ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ system │                                                                                            │ │ │\n",
+       "    │ │ │        │ You are a helpful assistant only capable of communicating with valid JSON, and no other    │ │ │\n",
+       "    │ │ │        │ text.                                                                                      │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ONLY return a valid JSON object (no other text is necessary), where the key of the field   │ │ │\n",
+       "    │ │ │        │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type     │ │ │\n",
+       "    │ │ │        │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format,         │ │ │\n",
+       "    │ │ │        │ including any types and format requests e.g. requests for lists, objects and specific      │ │ │\n",
+       "    │ │ │        │ types. Be correct and concise. If you are unsure anywhere, enter `null`.                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:             │ │ │\n",
+       "    │ │ │        │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`        │ │ │\n",
+       "    │ │ │        │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',      │ │ │\n",
+       "    │ │ │        │ 'STRING TWO', etc.]}`                                                                      │ │ │\n",
+       "    │ │ │        │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer          │ │ │\n",
+       "    │ │ │        │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':   │ │ │\n",
+       "    │ │ │        │ 1}}`                                                                                       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │ │\n",
+       "    │ │ │   user │                                                                                            │ │ │\n",
+       "    │ │ │        │ I was given the following JSON response, which had problems due to incorrect values.       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ {                                                                                          │ │ │\n",
+       "    │ │ │        │   \"incorrect_value\": {                                                                     │ │ │\n",
+       "    │ │ │        │     \"ingredients\": [                                                                       │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 1,                                                                        │ │ │\n",
+       "    │ │ │        │         \"name\": \"macaroni\",                                                                │ │ │\n",
+       "    │ │ │        │         \"brand\": \"Barilla\",                                                                │ │ │\n",
+       "    │ │ │        │         \"optional\": false,                                                                 │ │ │\n",
+       "    │ │ │        │         \"quantity\": 8.0,                                                                   │ │ │\n",
+       "    │ │ │        │         \"units\": \"ounces\"                                                                  │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 2,                                                                        │ │ │\n",
+       "    │ │ │        │         \"name\": \"raw cashews\",                                                             │ │ │\n",
+       "    │ │ │        │         \"brand\": \"Trader Joe's\",                                                           │ │ │\n",
+       "    │ │ │        │         \"optional\": false,                                                                 │ │ │\n",
+       "    │ │ │        │         \"quantity\": 1.0,                                                                   │ │ │\n",
+       "    │ │ │        │         \"units\": \"cup\"                                                                     │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 3,                                                                        │ │ │\n",
+       "    │ │ │        │         \"name\": \"nutritional yeast\",                                                       │ │ │\n",
+       "    │ │ │        │         \"brand\": \"Bob's Red Mill\",                                                         │ │ │\n",
+       "    │ │ │        │         \"optional\": false,                                                                 │ │ │\n",
+       "    │ │ │        │         \"quantity\": 0.25,                                                                  │ │ │\n",
+       "    │ │ │        │         \"units\": \"cup\"                                                                     │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 4,                                                                        │ │ │\n",
+       "    │ │ │        │         \"name\": \"garlic powder\",                                                           │ │ │\n",
+       "    │ │ │        │         \"brand\": \"McCormick\",                                                              │ │ │\n",
+       "    │ │ │        │         \"optional\": false,                                                                 │ │ │\n",
+       "    │ │ │        │         \"quantity\": 1.0,                                                                   │ │ │\n",
+       "    │ │ │        │         \"units\": \"teaspoon\"                                                                │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 5,                                                                        │ │ │\n",
+       "    │ │ │        │         \"name\": \"onion powder\",                                                            │ │ │\n",
+       "    │ │ │        │         \"brand\": \"McCormick\",                                                              │ │ │\n",
+       "    │ │ │        │         \"optional\": false,                                                                 │ │ │\n",
+       "    │ │ │        │         \"quantity\": 1.0,                                                                   │ │ │\n",
+       "    │ │ │        │         \"units\": \"teaspoon\"                                                                │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 6,                                                                        │ │ │\n",
+       "    │ │ │        │         \"name\": \"turmeric\",                                                                │ │ │\n",
+       "    │ │ │        │         \"brand\": \"Simply Organic\",                                                         │ │ │\n",
+       "    │ │ │        │         \"optional\": true,                                                                  │ │ │\n",
+       "    │ │ │        │         \"quantity\": 0.5,                                                                   │ │ │\n",
+       "    │ │ │        │         \"units\": \"teaspoon\"                                                                │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 7,                                                                        │ │ │\n",
+       "    │ │ │        │         \"name\": \"salt\",                                                                    │ │ │\n",
+       "    │ │ │        │         \"brand\": \"Morton\",                                                                 │ │ │\n",
+       "    │ │ │        │         \"optional\": false,                                                                 │ │ │\n",
+       "    │ │ │        │         \"quantity\": 1.0,                                                                   │ │ │\n",
+       "    │ │ │        │         \"units\": \"teaspoon\"                                                                │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 8,                                                                        │ │ │\n",
+       "    │ │ │        │         \"name\": \"water\",                                                                   │ │ │\n",
+       "    │ │ │        │         \"brand\": null,                                                                     │ │ │\n",
+       "    │ │ │        │         \"optional\": false,                                                                 │ │ │\n",
+       "    │ │ │        │         \"quantity\": 1.5,                                                                   │ │ │\n",
+       "    │ │ │        │         \"units\": \"cups\"                                                                    │ │ │\n",
+       "    │ │ │        │       }                                                                                    │ │ │\n",
+       "    │ │ │        │     ],                                                                                     │ │ │\n",
+       "    │ │ │        │     \"instructions\": [                                                                      │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 1,                                                                        │ │ │\n",
+       "    │ │ │        │         \"step\": \"Soak the cashews in water for at least 2 hours, then drain.\"              │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 2,                                                                        │ │ │\n",
+       "    │ │ │        │         \"step\": \"Cook the macaroni according to the package instructions, then drain.\"     │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 3,                                                                        │ │ │\n",
+       "    │ │ │        │         \"step\": \"In a blender, combine the soaked cashews, nutritional yeast, garlic       │ │ │\n",
+       "    │ │ │        │ powder, onion powder, turmeric, salt, and water. Blend until smooth.\"                      │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 4,                                                                        │ │ │\n",
+       "    │ │ │        │         \"step\": \"Pour the sauce over the cooked macaroni and stir until well coated.\"      │ │ │\n",
+       "    │ │ │        │       },                                                                                   │ │ │\n",
+       "    │ │ │        │       {                                                                                    │ │ │\n",
+       "    │ │ │        │         \"index\": 5,                                                                        │ │ │\n",
+       "    │ │ │        │         \"step\": \"Serve the vegan mac and cheese hot.\"                                      │ │ │\n",
+       "    │ │ │        │       }                                                                                    │ │ │\n",
+       "    │ │ │        │     ]                                                                                      │ │ │\n",
+       "    │ │ │        │   },                                                                                       │ │ │\n",
+       "    │ │ │        │   \"error_messages\": [                                                                      │ │ │\n",
+       "    │ │ │        │     \"JSON does not match schema:\\n{\\n  \\\"$.ingredients[7].brand\\\": [\\n    \\\"None is not of │ │ │\n",
+       "    │ │ │        │ type <SimpleTypes.STRING: 'string'>\\\"\\n  ]\\n}\"                                             │ │ │\n",
+       "    │ │ │        │   ]                                                                                        │ │ │\n",
+       "    │ │ │        │ }                                                                                          │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Help me correct the incorrect values based on the given error messages.                    │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Given below is XML that describes the information to extract from this document and the    │ │ │\n",
+       "    │ │ │        │ tags to extract it into.                                                                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ <output>                                                                                   │ │ │\n",
+       "    │ │ │        │   <list description=\"What are the ingredients for the recipe?\" name=\"ingredients\"          │ │ │\n",
+       "    │ │ │        │ required=\"true\">                                                                           │ │ │\n",
+       "    │ │ │        │     <object required=\"true\">                                                               │ │ │\n",
+       "    │ │ │        │       <integer format=\"1-indexed\" name=\"index\" required=\"true\"></integer>                  │ │ │\n",
+       "    │ │ │        │       <string format=\"is-vegan\" name=\"name\" required=\"true\"></string>                      │ │ │\n",
+       "    │ │ │        │       <string description=\"Suggested brand for the ingredient (if any)\" name=\"brand\"       │ │ │\n",
+       "    │ │ │        │ required=\"true\"></string>                                                                  │ │ │\n",
+       "    │ │ │        │       <bool description=\"Is the ingredient necessary?\" name=\"optional\"                     │ │ │\n",
+       "    │ │ │        │ required=\"true\"></bool>                                                                    │ │ │\n",
+       "    │ │ │        │       <float format=\"units-imperial\" name=\"quantity\" required=\"true\"></float>              │ │ │\n",
+       "    │ │ │        │       <string format=\"units-imperial\" name=\"units\" required=\"true\"></string>               │ │ │\n",
+       "    │ │ │        │     </object>                                                                              │ │ │\n",
+       "    │ │ │        │   </list>                                                                                  │ │ │\n",
+       "    │ │ │        │   <list description=\"What are the instructions for the recipe?\" name=\"instructions\"        │ │ │\n",
+       "    │ │ │        │ required=\"true\">                                                                           │ │ │\n",
+       "    │ │ │        │     <object required=\"true\">                                                               │ │ │\n",
+       "    │ │ │        │       <integer format=\"1-indexed\" name=\"index\" required=\"true\"></integer>                  │ │ │\n",
+       "    │ │ │        │       <string name=\"step\" required=\"true\"></string>                                        │ │ │\n",
+       "    │ │ │        │     </object>                                                                              │ │ │\n",
+       "    │ │ │        │   </list>                                                                                  │ │ │\n",
+       "    │ │ │        │ </output>                                                                                  │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ONLY return a valid JSON object (no other text is necessary), where the key of the field   │ │ │\n",
+       "    │ │ │        │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type     │ │ │\n",
+       "    │ │ │        │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format,         │ │ │\n",
+       "    │ │ │        │ including any types and format requests e.g. requests for lists, objects and specific      │ │ │\n",
+       "    │ │ │        │ types. Be correct and concise. If you are unsure anywhere, enter `null`.                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Here's an example of the structure:                                                        │ │ │\n",
+       "    │ │ │        │ {                                                                                          │ │ │\n",
+       "    │ │ │        │   \"ingredients\": [                                                                         │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"index\": 19,                                                                         │ │ │\n",
+       "    │ │ │        │       \"name\": \"Crystal Day\",                                                               │ │ │\n",
+       "    │ │ │        │       \"brand\": \"cut\",                                                                      │ │ │\n",
+       "    │ │ │        │       \"optional\": false,                                                                   │ │ │\n",
+       "    │ │ │        │       \"quantity\": 37.0,                                                                    │ │ │\n",
+       "    │ │ │        │       \"units\": \"simple\"                                                                    │ │ │\n",
+       "    │ │ │        │     },                                                                                     │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"index\": 58,                                                                         │ │ │\n",
+       "    │ │ │        │       \"name\": \"Derek Harris\",                                                              │ │ │\n",
+       "    │ │ │        │       \"brand\": \"suggest\",                                                                  │ │ │\n",
+       "    │ │ │        │       \"optional\": false,                                                                   │ │ │\n",
+       "    │ │ │        │       \"quantity\": 29.0,                                                                    │ │ │\n",
+       "    │ │ │        │       \"units\": \"three\"                                                                     │ │ │\n",
+       "    │ │ │        │     }                                                                                      │ │ │\n",
+       "    │ │ │        │   ],                                                                                       │ │ │\n",
+       "    │ │ │        │   \"instructions\": [                                                                        │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"index\": 80,                                                                         │ │ │\n",
+       "    │ │ │        │       \"step\": \"road\"                                                                       │ │ │\n",
+       "    │ │ │        │     },                                                                                     │ │ │\n",
+       "    │ │ │        │     {                                                                                      │ │ │\n",
+       "    │ │ │        │       \"index\": 24,                                                                         │ │ │\n",
+       "    │ │ │        │       \"step\": \"law\"                                                                        │ │ │\n",
+       "    │ │ │        │     }                                                                                      │ │ │\n",
+       "    │ │ │        │   ]                                                                                        │ │ │\n",
+       "    │ │ │        │ }                                                                                          │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
@@ -676,11 +1057,11 @@
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
        "    │ │       \"index\": 8,                                                                                       │ │\n",
-       "    │ │       \"name\": \"pepper\",                                                                                 │ │\n",
-       "    │ │       \"brand\": \"McCormick\",                                                                             │ │\n",
-       "    │ │       \"optional\": true,                                                                                 │ │\n",
-       "    │ │       \"quantity\": 0.5,                                                                                  │ │\n",
-       "    │ │       \"units\": \"teaspoon\"                                                                               │ │\n",
+       "    │ │       \"name\": \"water\",                                                                                  │ │\n",
+       "    │ │       \"brand\": \"Generic\",                                                                               │ │\n",
+       "    │ │       \"optional\": false,                                                                                │ │\n",
+       "    │ │       \"quantity\": 1.5,                                                                                  │ │\n",
+       "    │ │       \"units\": \"cups\"                                                                                   │ │\n",
        "    │ │     }                                                                                                   │ │\n",
        "    │ │   ],                                                                                                    │ │\n",
        "    │ │   \"instructions\": [                                                                                     │ │\n",
@@ -690,21 +1071,20 @@
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
        "    │ │       \"index\": 2,                                                                                       │ │\n",
-       "    │ │       \"step\": \"Cook the macaroni according to the package instructions, then drain and set aside.\"      │ │\n",
+       "    │ │       \"step\": \"Cook the macaroni according to the package instructions, then drain.\"                    │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
        "    │ │       \"index\": 3,                                                                                       │ │\n",
        "    │ │       \"step\": \"In a blender, combine the soaked cashews, nutritional yeast, garlic powder, onion        │ │\n",
-       "    │ │ powder, turmeric (if using), salt, and pepper. Blend until smooth.\"                                     │ │\n",
+       "    │ │ powder, turmeric, salt, and water. Blend until smooth.\"                                                 │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
        "    │ │       \"index\": 4,                                                                                       │ │\n",
-       "    │ │       \"step\": \"Pour the cashew sauce over the cooked macaroni and stir until well coated.\"              │ │\n",
+       "    │ │       \"step\": \"Pour the sauce over the cooked macaroni and stir until well coated.\"                     │ │\n",
        "    │ │     },                                                                                                  │ │\n",
        "    │ │     {                                                                                                   │ │\n",
        "    │ │       \"index\": 5,                                                                                       │ │\n",
-       "    │ │       \"step\": \"Serve the vegan mac and cheese hot, with extra nutritional yeast or pepper on top if     │ │\n",
-       "    │ │ desired.\"                                                                                               │ │\n",
+       "    │ │       \"step\": \"Serve the vegan mac and cheese hot.\"                                                     │ │\n",
        "    │ │     }                                                                                                   │ │\n",
        "    │ │   ]                                                                                                     │ │\n",
        "    │ │ }                                                                                                       │ │\n",
@@ -770,11 +1150,11 @@
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
        "    │ │             'index': 8,                                                                                 │ │\n",
-       "    │ │             'name': 'pepper',                                                                           │ │\n",
-       "    │ │             'brand': 'McCormick',                                                                       │ │\n",
-       "    │ │             'optional': True,                                                                           │ │\n",
-       "    │ │             'quantity': 0.5,                                                                            │ │\n",
-       "    │ │             'units': 'teaspoon'                                                                         │ │\n",
+       "    │ │             'name': 'water',                                                                            │ │\n",
+       "    │ │             'brand': 'Generic',                                                                         │ │\n",
+       "    │ │             'optional': False,                                                                          │ │\n",
+       "    │ │             'quantity': 1.5,                                                                            │ │\n",
+       "    │ │             'units': 'cups'                                                                             │ │\n",
        "    │ │         }                                                                                               │ │\n",
        "    │ │     ],                                                                                                  │ │\n",
        "    │ │     'instructions': [                                                                                   │ │\n",
@@ -784,23 +1164,18 @@
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
        "    │ │             'index': 2,                                                                                 │ │\n",
-       "    │ │             'step': 'Cook the macaroni according to the package instructions, then drain and set        │ │\n",
-       "    │ │ aside.'                                                                                                 │ │\n",
+       "    │ │             'step': 'Cook the macaroni according to the package instructions, then drain.'              │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
        "    │ │             'index': 3,                                                                                 │ │\n",
        "    │ │             'step': 'In a blender, combine the soaked cashews, nutritional yeast, garlic powder, onion  │ │\n",
-       "    │ │ powder, turmeric (if using), salt, and pepper. Blend until smooth.'                                     │ │\n",
+       "    │ │ powder, turmeric, salt, and water. Blend until smooth.'                                                 │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
        "    │ │             'index': 4,                                                                                 │ │\n",
-       "    │ │             'step': 'Pour the cashew sauce over the cooked macaroni and stir until well coated.'        │ │\n",
+       "    │ │             'step': 'Pour the sauce over the cooked macaroni and stir until well coated.'               │ │\n",
        "    │ │         },                                                                                              │ │\n",
-       "    │ │         {                                                                                               │ │\n",
-       "    │ │             'index': 5,                                                                                 │ │\n",
-       "    │ │             'step': 'Serve the vegan mac and cheese hot, with extra nutritional yeast or pepper on top  │ │\n",
-       "    │ │ if desired.'                                                                                            │ │\n",
-       "    │ │         }                                                                                               │ │\n",
+       "    │ │         {'index': 5, 'step': 'Serve the vegan mac and cheese hot.'}                                     │ │\n",
        "    │ │     ]                                                                                                   │ │\n",
        "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
@@ -809,60 +1184,448 @@
       ],
       "text/plain": [
        "Logs\n",
-       "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGenerate a recipe for vegan mac and cheese.                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the tags\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mto extract it into.                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field in \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mJSON is the `name` attribute of the corresponding XML, and the value is of the type         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, including\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many types and format requests e.g. requests for lists, objects and specific types. Be       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcorrect and concise. If you are unsure anywhere, enter `null`.                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior:              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}`         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE',       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}`                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index':    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}`                                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
+       "│   │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGenerate a recipe for vegan mac and cheese.                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the tags\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mto extract it into.                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field in \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mJSON is the `name` attribute of the corresponding XML, and the value is of the type         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, including\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many types and format requests e.g. requests for lists, objects and specific types. Be       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcorrect and concise. If you are unsure anywhere, enter `null`.                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior:              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}`         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE',       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}`                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index':    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}`                                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"ingredients\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 1,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"macaroni\",\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"brand\": \"Barilla\",\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"optional\": false,\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"quantity\": 8.0,\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"units\": \"ounces\"\u001b[0m\u001b[48;2;245;245;220m                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 2,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"raw cashews\",\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"brand\": \"Trader Joe's\",\u001b[0m\u001b[48;2;245;245;220m                                                                         \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"optional\": false,\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"quantity\": 1.0,\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"units\": \"cup\"\u001b[0m\u001b[48;2;245;245;220m                                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 3,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"nutritional yeast\",\u001b[0m\u001b[48;2;245;245;220m                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"brand\": \"Bob's Red Mill\",\u001b[0m\u001b[48;2;245;245;220m                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"optional\": false,\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"quantity\": 0.25,\u001b[0m\u001b[48;2;245;245;220m                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"units\": \"cup\"\u001b[0m\u001b[48;2;245;245;220m                                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 4,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"garlic powder\",\u001b[0m\u001b[48;2;245;245;220m                                                                         \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"brand\": \"McCormick\",\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"optional\": false,\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"quantity\": 1.0,\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"units\": \"teaspoon\"\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 5,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"onion powder\",\u001b[0m\u001b[48;2;245;245;220m                                                                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"brand\": \"McCormick\",\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"optional\": false,\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"quantity\": 1.0,\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"units\": \"teaspoon\"\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 6,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"turmeric\",\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"brand\": \"Simply Organic\",\u001b[0m\u001b[48;2;245;245;220m                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"optional\": true,\u001b[0m\u001b[48;2;245;245;220m                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"quantity\": 0.5,\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"units\": \"teaspoon\"\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 7,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"salt\",\u001b[0m\u001b[48;2;245;245;220m                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"brand\": \"Morton\",\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"optional\": false,\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"quantity\": 1.0,\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"units\": \"teaspoon\"\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 8,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"water\",\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"brand\": null,\u001b[0m\u001b[48;2;245;245;220m                                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"optional\": false,\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"quantity\": 1.5,\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"units\": \"cups\"\u001b[0m\u001b[48;2;245;245;220m                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    }\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  ],\u001b[0m\u001b[48;2;245;245;220m                                                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"instructions\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 1,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"step\": \"Soak the cashews in water for at least 2 hours, then drain.\"\u001b[0m\u001b[48;2;245;245;220m                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 2,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"step\": \"Cook the macaroni according to the package instructions, then drain.\"\u001b[0m\u001b[48;2;245;245;220m                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 3,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"step\": \"In a blender, combine the soaked cashews, nutritional yeast, garlic powder, onion \u001b[0m\u001b[48;2;245;245;220m      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mpowder, turmeric, salt, and water. Blend until smooth.\"\u001b[0m\u001b[48;2;245;245;220m                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 4,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"step\": \"Pour the sauce over the cooked macaroni and stir until well coated.\"\u001b[0m\u001b[48;2;245;245;220m                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 5,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"step\": \"Serve the vegan mac and cheese hot.\"\u001b[0m\u001b[48;2;245;245;220m                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    }\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  ]\u001b[0m\u001b[48;2;245;245;220m                                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mSkeletonReAsk(\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    incorrect_value={\u001b[0m\u001b[48;2;240;255;240m                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        'ingredients': [\u001b[0m\u001b[48;2;240;255;240m                                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'index': 1,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'name': 'macaroni',\u001b[0m\u001b[48;2;240;255;240m                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'brand': 'Barilla',\u001b[0m\u001b[48;2;240;255;240m                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'optional': False,\u001b[0m\u001b[48;2;240;255;240m                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'quantity': 8.0,\u001b[0m\u001b[48;2;240;255;240m                                                                       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'units': 'ounces'\u001b[0m\u001b[48;2;240;255;240m                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            },\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'index': 2,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'name': 'raw cashews',\u001b[0m\u001b[48;2;240;255;240m                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'brand': \"Trader Joe's\",\u001b[0m\u001b[48;2;240;255;240m                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'optional': False,\u001b[0m\u001b[48;2;240;255;240m                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'quantity': 1.0,\u001b[0m\u001b[48;2;240;255;240m                                                                       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'units': 'cup'\u001b[0m\u001b[48;2;240;255;240m                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            },\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'index': 3,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'name': 'nutritional yeast',\u001b[0m\u001b[48;2;240;255;240m                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'brand': \"Bob's Red Mill\",\u001b[0m\u001b[48;2;240;255;240m                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'optional': False,\u001b[0m\u001b[48;2;240;255;240m                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'quantity': 0.25,\u001b[0m\u001b[48;2;240;255;240m                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'units': 'cup'\u001b[0m\u001b[48;2;240;255;240m                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            },\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'index': 4,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'name': 'garlic powder',\u001b[0m\u001b[48;2;240;255;240m                                                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'brand': 'McCormick',\u001b[0m\u001b[48;2;240;255;240m                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'optional': False,\u001b[0m\u001b[48;2;240;255;240m                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'quantity': 1.0,\u001b[0m\u001b[48;2;240;255;240m                                                                       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'units': 'teaspoon'\u001b[0m\u001b[48;2;240;255;240m                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            },\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'index': 5,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'name': 'onion powder',\u001b[0m\u001b[48;2;240;255;240m                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'brand': 'McCormick',\u001b[0m\u001b[48;2;240;255;240m                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'optional': False,\u001b[0m\u001b[48;2;240;255;240m                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'quantity': 1.0,\u001b[0m\u001b[48;2;240;255;240m                                                                       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'units': 'teaspoon'\u001b[0m\u001b[48;2;240;255;240m                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            },\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'index': 6,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'name': 'turmeric',\u001b[0m\u001b[48;2;240;255;240m                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'brand': 'Simply Organic',\u001b[0m\u001b[48;2;240;255;240m                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'optional': True,\u001b[0m\u001b[48;2;240;255;240m                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'quantity': 0.5,\u001b[0m\u001b[48;2;240;255;240m                                                                       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'units': 'teaspoon'\u001b[0m\u001b[48;2;240;255;240m                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            },\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'index': 7,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'name': 'salt',\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'brand': 'Morton',\u001b[0m\u001b[48;2;240;255;240m                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'optional': False,\u001b[0m\u001b[48;2;240;255;240m                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'quantity': 1.0,\u001b[0m\u001b[48;2;240;255;240m                                                                       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'units': 'teaspoon'\u001b[0m\u001b[48;2;240;255;240m                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            },\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'index': 8,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'name': 'water',\u001b[0m\u001b[48;2;240;255;240m                                                                       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'brand': None,\u001b[0m\u001b[48;2;240;255;240m                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'optional': False,\u001b[0m\u001b[48;2;240;255;240m                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'quantity': 1.5,\u001b[0m\u001b[48;2;240;255;240m                                                                       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'units': 'cups'\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            }\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        ],\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        'instructions': [\u001b[0m\u001b[48;2;240;255;240m                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'index': 1,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'step': 'Soak the cashews in water for at least 2 hours, then drain.'\u001b[0m\u001b[48;2;240;255;240m                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            },\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'index': 2,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'step': 'Cook the macaroni according to the package instructions, then drain.'\u001b[0m\u001b[48;2;240;255;240m         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            },\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'index': 3,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'step': 'In a blender, combine the soaked cashews, nutritional yeast, garlic powder, \u001b[0m\u001b[48;2;240;255;240m  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240monion powder, turmeric, salt, and water. Blend until smooth.'\u001b[0m\u001b[48;2;240;255;240m                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            },\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {\u001b[0m\u001b[48;2;240;255;240m                                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'index': 4,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m                'step': 'Pour the sauce over the cooked macaroni and stir until well coated.'\u001b[0m\u001b[48;2;240;255;240m          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            },\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            {'index': 5, 'step': 'Serve the vegan mac and cheese hot.'}\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        ]\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    },\u001b[0m\u001b[48;2;240;255;240m                                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    fail_results=[\u001b[0m\u001b[48;2;240;255;240m                                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        FailResult(\u001b[0m\u001b[48;2;240;255;240m                                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            outcome='fail',\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            error_message='JSON does not match schema:\\n{\\n  \"$.ingredients[7].brand\": [\\n    \"None is \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mnot of type \"\\n  ]\\n}',\u001b[0m\u001b[48;2;240;255;240m                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            fix_value=None,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            error_spans=None,\u001b[0m\u001b[48;2;240;255;240m                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            metadata=None,\u001b[0m\u001b[48;2;240;255;240m                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            validated_chunk=None\u001b[0m\u001b[48;2;240;255;240m                                                                       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        )\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ],\u001b[0m\u001b[48;2;240;255;240m                                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    additional_properties={}\u001b[0m\u001b[48;2;240;255;240m                                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m)\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
+       "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235m  Role\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                   \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235msystem\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYou are a helpful assistant only capable of communicating with valid JSON, and no other   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtext.                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235min JSON is the `name` attribute of the corresponding XML, and the value is of the type    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format,        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluding any types and format requests e.g. requests for lists, objects and specific     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtypes. Be correct and concise. If you are unsure anywhere, enter `null`.                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior:            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}`       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE',     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}`                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index':  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}`                                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  user\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mI was given the following JSON response, which had problems due to incorrect values.      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m{                                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  \"incorrect_value\": {                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    \"ingredients\": [                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 1,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"name\": \"macaroni\",                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"brand\": \"Barilla\",                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"optional\": false,                                                                \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"quantity\": 8.0,                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"units\": \"ounces\"                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 2,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"name\": \"raw cashews\",                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"brand\": \"Trader Joe's\",                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"optional\": false,                                                                \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"quantity\": 1.0,                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"units\": \"cup\"                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 3,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"name\": \"nutritional yeast\",                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"brand\": \"Bob's Red Mill\",                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"optional\": false,                                                                \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"quantity\": 0.25,                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"units\": \"cup\"                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 4,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"name\": \"garlic powder\",                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"brand\": \"McCormick\",                                                             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"optional\": false,                                                                \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"quantity\": 1.0,                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"units\": \"teaspoon\"                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 5,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"name\": \"onion powder\",                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"brand\": \"McCormick\",                                                             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"optional\": false,                                                                \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"quantity\": 1.0,                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"units\": \"teaspoon\"                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 6,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"name\": \"turmeric\",                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"brand\": \"Simply Organic\",                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"optional\": true,                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"quantity\": 0.5,                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"units\": \"teaspoon\"                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 7,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"name\": \"salt\",                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"brand\": \"Morton\",                                                                \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"optional\": false,                                                                \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"quantity\": 1.0,                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"units\": \"teaspoon\"                                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 8,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"name\": \"water\",                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"brand\": null,                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"optional\": false,                                                                \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"quantity\": 1.5,                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"units\": \"cups\"                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      }                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    ],                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    \"instructions\": [                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 1,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"step\": \"Soak the cashews in water for at least 2 hours, then drain.\"             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 2,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"step\": \"Cook the macaroni according to the package instructions, then drain.\"    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 3,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"step\": \"In a blender, combine the soaked cashews, nutritional yeast, garlic      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mpowder, onion powder, turmeric, salt, and water. Blend until smooth.\"                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 4,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"step\": \"Pour the sauce over the cooked macaroni and stir until well coated.\"     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      },                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      {                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"index\": 5,                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m        \"step\": \"Serve the vegan mac and cheese hot.\"                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      }                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    ]                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  },                                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  \"error_messages\": [                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    \"JSON does not match schema:\\n{\\n  \\\"$.ingredients[7].brand\\\": [\\n    \\\"None is not of\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtype \\\"\\n  ]\\n}\"                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  ]                                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m}                                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHelp me correct the incorrect values based on the given error messages.                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtags to extract it into.                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235min JSON is the `name` attribute of the corresponding XML, and the value is of the type    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format,        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluding any types and format requests e.g. requests for lists, objects and specific     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtypes. Be correct and concise. If you are unsure anywhere, enter `null`.                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere's an example of the structure:                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m{                                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  \"ingredients\": [                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"index\": 19,                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"name\": \"Crystal Day\",                                                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"brand\": \"cut\",                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"optional\": false,                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"quantity\": 37.0,                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"units\": \"simple\"                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    },                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"index\": 58,                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"name\": \"Derek Harris\",                                                             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"brand\": \"suggest\",                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"optional\": false,                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"quantity\": 29.0,                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"units\": \"three\"                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    }                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  ],                                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  \"instructions\": [                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"index\": 80,                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"step\": \"road\"                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    },                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    {                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"index\": 24,                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m      \"step\": \"law\"                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    }                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  ]                                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m}                                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└────────┴────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -925,11 +1688,11 @@
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 8,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"pepper\",\u001b[0m\u001b[48;2;245;245;220m                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"brand\": \"McCormick\",\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"optional\": true,\u001b[0m\u001b[48;2;245;245;220m                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"quantity\": 0.5,\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"units\": \"teaspoon\"\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"name\": \"water\",\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"brand\": \"Generic\",\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"optional\": false,\u001b[0m\u001b[48;2;245;245;220m                                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"quantity\": 1.5,\u001b[0m\u001b[48;2;245;245;220m                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"units\": \"cups\"\u001b[0m\u001b[48;2;245;245;220m                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    }\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  ],\u001b[0m\u001b[48;2;245;245;220m                                                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"instructions\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -939,21 +1702,20 @@
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 2,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"step\": \"Cook the macaroni according to the package instructions, then drain and set aside.\"\u001b[0m\u001b[48;2;245;245;220m     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"step\": \"Cook the macaroni according to the package instructions, then drain.\"\u001b[0m\u001b[48;2;245;245;220m                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 3,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"step\": \"In a blender, combine the soaked cashews, nutritional yeast, garlic powder, onion \u001b[0m\u001b[48;2;245;245;220m      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mpowder, turmeric (if using), salt, and pepper. Blend until smooth.\"\u001b[0m\u001b[48;2;245;245;220m                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mpowder, turmeric, salt, and water. Blend until smooth.\"\u001b[0m\u001b[48;2;245;245;220m                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 4,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"step\": \"Pour the cashew sauce over the cooked macaroni and stir until well coated.\"\u001b[0m\u001b[48;2;245;245;220m             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"step\": \"Pour the sauce over the cooked macaroni and stir until well coated.\"\u001b[0m\u001b[48;2;245;245;220m                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    },\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    {\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"index\": 5,\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"step\": \"Serve the vegan mac and cheese hot, with extra nutritional yeast or pepper on top if \u001b[0m\u001b[48;2;245;245;220m   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mdesired.\"\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m      \"step\": \"Serve the vegan mac and cheese hot.\"\u001b[0m\u001b[48;2;245;245;220m                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    }\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  ]\u001b[0m\u001b[48;2;245;245;220m                                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -1019,11 +1781,11 @@
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'index': 8,\u001b[0m\u001b[48;2;240;255;240m                                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'pepper',\u001b[0m\u001b[48;2;240;255;240m                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'brand': 'McCormick',\u001b[0m\u001b[48;2;240;255;240m                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'optional': True,\u001b[0m\u001b[48;2;240;255;240m                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'quantity': 0.5,\u001b[0m\u001b[48;2;240;255;240m                                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'units': 'teaspoon'\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'name': 'water',\u001b[0m\u001b[48;2;240;255;240m                                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'brand': 'Generic',\u001b[0m\u001b[48;2;240;255;240m                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'optional': False,\u001b[0m\u001b[48;2;240;255;240m                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'quantity': 1.5,\u001b[0m\u001b[48;2;240;255;240m                                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'units': 'cups'\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        }\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ],\u001b[0m\u001b[48;2;240;255;240m                                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'instructions': [\u001b[0m\u001b[48;2;240;255;240m                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
@@ -1033,23 +1795,18 @@
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'index': 2,\u001b[0m\u001b[48;2;240;255;240m                                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'step': 'Cook the macaroni according to the package instructions, then drain and set \u001b[0m\u001b[48;2;240;255;240m      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240maside.'\u001b[0m\u001b[48;2;240;255;240m                                                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'step': 'Cook the macaroni according to the package instructions, then drain.'\u001b[0m\u001b[48;2;240;255;240m             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'index': 3,\u001b[0m\u001b[48;2;240;255;240m                                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'step': 'In a blender, combine the soaked cashews, nutritional yeast, garlic powder, onion \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mpowder, turmeric (if using), salt, and pepper. Blend until smooth.'\u001b[0m\u001b[48;2;240;255;240m                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mpowder, turmeric, salt, and water. Blend until smooth.'\u001b[0m\u001b[48;2;240;255;240m                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'index': 4,\u001b[0m\u001b[48;2;240;255;240m                                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'step': 'Pour the cashew sauce over the cooked macaroni and stir until well coated.'\u001b[0m\u001b[48;2;240;255;240m       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'step': 'Pour the sauce over the cooked macaroni and stir until well coated.'\u001b[0m\u001b[48;2;240;255;240m              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        },\u001b[0m\u001b[48;2;240;255;240m                                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'index': 5,\u001b[0m\u001b[48;2;240;255;240m                                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            'step': 'Serve the vegan mac and cheese hot, with extra nutritional yeast or pepper on top \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mif desired.'\u001b[0m\u001b[48;2;240;255;240m                                                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        }\u001b[0m\u001b[48;2;240;255;240m                                                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'index': 5, 'step': 'Serve the vegan mac and cheese hot.'}\u001b[0m\u001b[48;2;240;255;240m                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ]\u001b[0m\u001b[48;2;240;255;240m                                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
@@ -1067,7 +1824,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "tiff-env",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -1081,14 +1838,9 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.1"
+   "version": "3.12.3"
   },
-  "orig_nbformat": 4,
-  "vscode": {
-   "interpreter": {
-    "hash": "ef14f49bbc779f2fde64ca0552c2a99d578405052f5b73f61279551da311a8a1"
-   }
-  }
+  "orig_nbformat": 4
  },
  "nbformat": 4,
  "nbformat_minor": 2
diff --git a/docs/examples/regex_validation.ipynb b/docs/examples/regex_validation.ipynb
index 6ab79b98d..ba9e86726 100644
--- a/docs/examples/regex_validation.ipynb
+++ b/docs/examples/regex_validation.ipynb
@@ -40,7 +40,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -56,14 +56,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/home/zayd/workspace/guardrails/docs/.venv/lib/python3.11/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
+      "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
       "  from tqdm.autonotebook import tqdm, trange\n"
      ]
     }
@@ -89,14 +89,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/home/zayd/workspace/guardrails/docs/.venv/lib/python3.11/site-packages/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n",
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
       "  warnings.warn(\n"
      ]
     },
@@ -105,24 +107,25 @@
       "text/html": [
        "
Logs\n",
        "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "│   │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "│   │ │ I am writing a movie and need a fake phone number. Generate a fake phone number. Do not write anything  │ │\n",
-       "│   │ │ other than the phone number.                                                                            │ │\n",
-       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "│   │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "│   │ │ No message history.                                                                                     │ │\n",
+       "│   │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "│   │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "│   │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
+       "│   │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "│   │ │ │ user │ I am writing a movie and need a fake phone number. Generate a fake phone number. Do not      │ │ │\n",
+       "│   │ │ │      │ write anything other than the phone number.                                                  │ │ │\n",
+       "│   │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "│   │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "│   │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "│   │ │ (555) 012-3456                                                                                          │ │\n",
        "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "│   │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "│   │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "│   │ │ FieldReAsk(                                                                                             │ │\n",
        "│   │ │     incorrect_value='(555) 012-3456',                                                                   │ │\n",
        "│   │ │     fail_results=[                                                                                      │ │\n",
        "│   │ │         FailResult(                                                                                     │ │\n",
        "│   │ │             outcome='fail',                                                                             │ │\n",
        "│   │ │             error_message='Result must match \\\\d{3}-\\\\d{3}-\\\\d{4}',                                     │ │\n",
-       "│   │ │             fix_value='sh406-649-2143sh',                                                               │ │\n",
+       "│   │ │             fix_value='idfgxprs581-360-9865idfgxprs',                                                   │ │\n",
        "│   │ │             error_spans=None,                                                                           │ │\n",
        "│   │ │             metadata=None,                                                                              │ │\n",
        "│   │ │             validated_chunk=None                                                                        │ │\n",
@@ -134,31 +137,35 @@
        "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ This was a previous response you generated:                                                             │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ ======                                                                                                  │ │\n",
-       "    │ │ (555) 012-3456                                                                                          │ │\n",
-       "    │ │ ======                                                                                                  │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Generate a new response that corrects your old response such that the following issues are fixed        │ │\n",
-       "    │ │ - Result must match \\d{3}-\\d{3}-\\d{4}                                                                   │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Your generated response should satisfy the following properties:                                        │ │\n",
-       "    │ │ - guardrails/regex_match: regex=\\d{3}-\\d{3}-\\d{4} match_type=search                                     │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Don't talk; just go.                                                                                    │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃   Role  Content                                                                                    ┃ │ │\n",
+       "    │ │ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ system │ You are a helpful assistant.                                                               │ │ │\n",
+       "    │ │ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │ │\n",
+       "    │ │ │   user │ This was a previous response you generated:                                                │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ======                                                                                     │ │ │\n",
+       "    │ │ │        │ (555) 012-3456                                                                             │ │ │\n",
+       "    │ │ │        │ ======                                                                                     │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Generate a new response that corrects your old response such that the following issues are │ │ │\n",
+       "    │ │ │        │ fixed                                                                                      │ │ │\n",
+       "    │ │ │        │ - Result must match \\d{3}-\\d{3}-\\d{4}                                                      │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Your generated response should satisfy the following properties:                           │ │ │\n",
+       "    │ │ │        │ - guardrails/regex_match: regex=\\d{3}-\\d{3}-\\d{4} match_type=search                        │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Don't talk; just go.                                                                       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ 555-012-3456                                                                                            │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ '555-012-3456'                                                                                          │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
@@ -167,24 +174,25 @@
       "text/plain": [
        "Logs\n",
        "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "│   │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m Prompt \u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mI am writing a movie and need a fake phone number. Generate a fake phone number. Do not write anything \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mother than the phone number.\u001b[0m\u001b[48;2;240;248;255m                                                                           \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m Message History \u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mI am writing a movie and need a fake phone number. Generate a fake phone number. Do not     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mwrite anything other than the phone number.                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "│   │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m(555) 012-3456\u001b[0m\u001b[48;2;245;245;220m                                                                                         \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mFieldReAsk(\u001b[0m\u001b[48;2;240;255;240m                                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    incorrect_value='(555) 012-3456',\u001b[0m\u001b[48;2;240;255;240m                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    fail_results=[\u001b[0m\u001b[48;2;240;255;240m                                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        FailResult(\u001b[0m\u001b[48;2;240;255;240m                                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            outcome='fail',\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            error_message='Result must match \\\\d{3}-\\\\d{3}-\\\\d{4}',\u001b[0m\u001b[48;2;240;255;240m                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            fix_value='sh406-649-2143sh',\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            fix_value='idfgxprs581-360-9865idfgxprs',\u001b[0m\u001b[48;2;240;255;240m                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            error_spans=None,\u001b[0m\u001b[48;2;240;255;240m                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            metadata=None,\u001b[0m\u001b[48;2;240;255;240m                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            validated_chunk=None\u001b[0m\u001b[48;2;240;255;240m                                                                       \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
@@ -196,31 +204,35 @@
        "│   │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m Prompt \u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mThis was a previous response you generated:\u001b[0m\u001b[48;2;240;248;255m                                                            \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m======\u001b[0m\u001b[48;2;240;248;255m                                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m(555) 012-3456\u001b[0m\u001b[48;2;240;248;255m                                                                                         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m======\u001b[0m\u001b[48;2;240;248;255m                                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mGenerate a new response that corrects your old response such that the following issues are fixed\u001b[0m\u001b[48;2;240;248;255m       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m- Result must match \\d{3}-\\d{3}-\\d{4}\u001b[0m\u001b[48;2;240;248;255m                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mYour generated response should satisfy the following properties:\u001b[0m\u001b[48;2;240;248;255m                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m- guardrails/regex_match: regex=\\d{3}-\\d{3}-\\d{4} match_type=search\u001b[0m\u001b[48;2;240;248;255m                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mDon't talk; just go.\u001b[0m\u001b[48;2;240;248;255m                                                                                   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m Message History \u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235m  Role\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                   \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235msystem\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYou are a helpful assistant.                                                              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  user\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mThis was a previous response you generated:                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m======                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m(555) 012-3456                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m======                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGenerate a new response that corrects your old response such that the following issues are\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mfixed                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- Result must match \\d{3}-\\d{3}-\\d{4}                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYour generated response should satisfy the following properties:                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- guardrails/regex_match: regex=\\d{3}-\\d{3}-\\d{4} match_type=search                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mDon't talk; just go.                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└────────┴────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m555-012-3456\u001b[0m\u001b[48;2;245;245;220m                                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m'555-012-3456'\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n"
@@ -236,7 +248,10 @@
     ")\n",
     "\n",
     "guard(\n",
-    "    prompt='I am writing a movie and need a fake phone number. Generate a fake phone number. Do not write anything other than the phone number.',\n",
+    "    messages=[{\n",
+    "        \"role\": \"user\",\n",
+    "        \"content\": \"I am writing a movie and need a fake phone number. Generate a fake phone number. Do not write anything other than the phone number.\"\n",
+    "    }],\n",
     "    model=\"gpt-4-turbo\",\n",
     ")\n",
     "\n",
@@ -246,7 +261,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": ".venv",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -260,7 +275,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.11.7"
+   "version": "3.12.3"
   },
   "orig_nbformat": 4
  },
diff --git a/docs/examples/response_is_on_topic.ipynb b/docs/examples/response_is_on_topic.ipynb
index 627457f25..b55497cce 100644
--- a/docs/examples/response_is_on_topic.ipynb
+++ b/docs/examples/response_is_on_topic.ipynb
@@ -58,7 +58,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -75,7 +75,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -97,7 +97,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -136,16 +136,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/home/zayd/workspace/guardrails/docs/.venv/lib/python3.11/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
+      "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
       "  from tqdm.autonotebook import tqdm, trange\n",
-      "/home/zayd/workspace/guardrails/docs/.venv/lib/python3.11/site-packages/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
       "  warnings.warn(\n"
      ]
     },
@@ -153,7 +153,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Validation failed for field with errors: Invalid topics found: ['tablet', 'computer', 'phone']\n"
+      "Validation failed for field with errors: Invalid topics found: ['phone', 'computer', 'tablet']\n"
      ]
     }
    ],
@@ -197,9 +197,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    },
     {
      "name": "stdout",
      "output_type": "stream",
@@ -243,9 +251,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    },
     {
      "name": "stdout",
      "output_type": "stream",
@@ -281,7 +297,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": ".venv",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -295,7 +311,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.11.7"
+   "version": "3.12.3"
   }
  },
  "nbformat": 4,
diff --git a/docs/examples/secrets_detection.ipynb b/docs/examples/secrets_detection.ipynb
index fe2467ee6..f6675e195 100644
--- a/docs/examples/secrets_detection.ipynb
+++ b/docs/examples/secrets_detection.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [
     {
@@ -33,19 +33,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 9,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "\n",
-      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.2\u001b[0m\n",
-      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "# Install the necessary packages\n",
     "! pip install detect-secrets -q"
@@ -53,14 +43,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/home/zayd/workspace/guardrails/docs/.venv/lib/python3.11/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
+      "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
       "  from tqdm.autonotebook import tqdm, trange\n"
      ]
     }
@@ -76,7 +66,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -92,14 +82,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/home/zayd/workspace/guardrails/docs/.venv/lib/python3.11/site-packages/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
       "  warnings.warn(\n"
      ]
     },
@@ -173,9 +163,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING:py.warnings:/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n",
+      "\n"
+     ]
+    },
     {
      "data": {
       "text/html": [
@@ -242,7 +241,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "guard-venv",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -256,7 +255,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.11.7"
+   "version": "3.12.3"
   }
  },
  "nbformat": 4,
diff --git a/docs/examples/select_choice_based_on_action.ipynb b/docs/examples/select_choice_based_on_action.ipynb
index b77107ecf..43fef1829 100644
--- a/docs/examples/select_choice_based_on_action.ipynb
+++ b/docs/examples/select_choice_based_on_action.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [
     {
@@ -54,7 +54,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 9,
    "metadata": {
     "ExecuteTime": {
      "end_time": "2023-08-23T15:09:26.331177Z",
@@ -77,14 +77,15 @@
     "        \n",
     "    \n",
     "\n",
-    "\n",
-    "\n",
+    "\n",
+    "\n",
     "You are a human in an enchanted forest. You come across opponents of different types, and you should fight smaller opponents and run away from bigger ones.\n",
     "\n",
     "You run into a ${opp_type}. What do you do?\n",
     "\n",
-    "${gr.complete_xml_suffix_v2}\n",
-    "\n",
+    "${gr.complete_xml_suffix_v2}\n",
+    "\n",
+    "\n",
     "\n",
     "\"\"\""
    ]
@@ -98,18 +99,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 10,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/Users/dtam/.pyenv/versions/3.12.1/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:11: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
-      "  from tqdm.autonotebook import tqdm, trange\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "from guardrails.hub import ValidChoices\n",
     "from pydantic import BaseModel, Field\n",
@@ -158,7 +150,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 11,
    "metadata": {
     "ExecuteTime": {
      "end_time": "2023-08-23T15:09:28.590929Z",
@@ -183,7 +175,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -219,14 +211,23 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 21,
    "metadata": {
     "ExecuteTime": {
      "end_time": "2023-08-23T15:10:08.998121Z",
      "start_time": "2023-08-23T15:10:08.792027Z"
     }
    },
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    }
+   ],
    "source": [
     "# Set your OPENAI_API_KEY as an environment variable\n",
     "# import os\n",
@@ -235,7 +236,7 @@
     "raw_llm_response, validated_response, *rest = guard(\n",
     "    messages=[{\"role\":\"user\", \"content\": prompt}],\n",
     "    prompt_params={'opp_type': 'giant'},\n",
-    "    model=\"gpt-4o\",\n",
+    "    model=\"gpt-4o-mini\",\n",
     "    max_tokens=256,\n",
     "    temperature=0.0,\n",
     ")"
@@ -254,17 +255,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 22,
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
{'action': {'chosen_action': 'flight', 'flight_direction': 'north', 'distance': 3}}\n",
+       "
{'action': {'chosen_action': 'flight', 'flight_direction': 'north', 'distance': 1}}\n",
        "
\n" ], "text/plain": [ - "\u001b[1m{\u001b[0m\u001b[32m'action'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'chosen_action'\u001b[0m: \u001b[32m'flight'\u001b[0m, \u001b[32m'flight_direction'\u001b[0m: \u001b[32m'north'\u001b[0m, \u001b[32m'distance'\u001b[0m: \u001b[1;36m3\u001b[0m\u001b[1m}\u001b[0m\u001b[1m}\u001b[0m\n" + "\u001b[1m{\u001b[0m\u001b[32m'action'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'chosen_action'\u001b[0m: \u001b[32m'flight'\u001b[0m, \u001b[32m'flight_direction'\u001b[0m: \u001b[32m'north'\u001b[0m, \u001b[32m'distance'\u001b[0m: \u001b[1;36m1\u001b[0m\u001b[1m}\u001b[0m\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, @@ -284,7 +285,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 23, "metadata": { "ExecuteTime": { "end_time": "2023-08-23T15:09:32.364711Z", @@ -373,7 +374,7 @@ } ], "source": [ - "print(guard.history.last.iterations.first.inputs.msg_history[0][\"content\"])" + "print(guard.history.last.iterations.first.inputs.messages[0][\"content\"])" ] }, { @@ -385,7 +386,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -393,10 +394,7 @@ "text/html": [ "
Logs\n",
        "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "│   │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "│   │ │ No prompt                                                                                               │ │\n",
-       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "│   │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
+       "│   │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
        "│   │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
        "│   │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
        "│   │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
@@ -444,22 +442,20 @@
        "│   │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "│   │ │ ```json                                                                                                 │ │\n",
        "│   │ │ {                                                                                                       │ │\n",
-       "│   │ │   \"action\": {                                                                                           │ │\n",
-       "│   │ │     \"flight_direction\": \"north\",                                                                        │ │\n",
-       "│   │ │     \"distance\": 3                                                                                       │ │\n",
-       "│   │ │   },                                                                                                    │ │\n",
-       "│   │ │   \"chosen_action\": \"flight\"                                                                             │ │\n",
+       "│   │ │   \"action\": \"flight\",                                                                                   │ │\n",
+       "│   │ │   \"flight_direction\": \"north\",                                                                          │ │\n",
+       "│   │ │   \"distance\": 3                                                                                         │ │\n",
        "│   │ │ }                                                                                                       │ │\n",
        "│   │ │ ```                                                                                                     │ │\n",
        "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "│   │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "│   │ │ SkeletonReAsk(                                                                                          │ │\n",
-       "│   │ │     incorrect_value={'action': {'flight_direction': 'north', 'distance': 3}},                           │ │\n",
+       "│   │ │     incorrect_value={'action': 'flight'},                                                               │ │\n",
        "│   │ │     fail_results=[                                                                                      │ │\n",
        "│   │ │         FailResult(                                                                                     │ │\n",
        "│   │ │             outcome='fail',                                                                             │ │\n",
-       "│   │ │             error_message='JSON does not match schema:\\n{\\n  \"$.action\": [\\n    \"{\\'flight_direction\\': │ │\n",
-       "│   │ │ \\'north\\', \\'distance\\': 3} is not valid under any of the given schemas\"\\n  ]\\n}',                      │ │\n",
+       "│   │ │             error_message='JSON does not match schema:\\n{\\n  \"$.action\": [\\n    \"\\'flight\\' is not      │ │\n",
+       "│   │ │ valid under any of the given schemas\"\\n  ]\\n}',                                                         │ │\n",
        "│   │ │             fix_value=None,                                                                             │ │\n",
        "│   │ │             error_spans=None,                                                                           │ │\n",
        "│   │ │             metadata=None,                                                                              │ │\n",
@@ -471,98 +467,95 @@
        "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ I was given the following JSON response, which had problems due to incorrect values.                    │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ {                                                                                                       │ │\n",
-       "    │ │   \"incorrect_value\": {                                                                                  │ │\n",
-       "    │ │     \"action\": {                                                                                         │ │\n",
-       "    │ │       \"flight_direction\": \"north\",                                                                      │ │\n",
-       "    │ │       \"distance\": 3                                                                                     │ │\n",
-       "    │ │     }                                                                                                   │ │\n",
-       "    │ │   },                                                                                                    │ │\n",
-       "    │ │   \"error_messages\": [                                                                                   │ │\n",
-       "    │ │     \"JSON does not match schema:\\n{\\n  \\\"$.action\\\": [\\n    \\\"{'flight_direction': 'north', 'distance': │ │\n",
-       "    │ │ 3} is not valid under any of the given schemas\\\"\\n  ]\\n}\"                                               │ │\n",
-       "    │ │   ]                                                                                                     │ │\n",
-       "    │ │ }                                                                                                       │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Help me correct the incorrect values based on the given error messages.                                 │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Given below is XML that describes the information to extract from this document and the tags to extract │ │\n",
-       "    │ │ it into.                                                                                                │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ <output>                                                                                                │ │\n",
-       "    │ │   <choice discriminator=\"chosen_action\" name=\"action\" required=\"true\">                                  │ │\n",
-       "    │ │     <case name=\"fight\">                                                                                 │ │\n",
-       "    │ │       <string format=\"guardrails/valid_choices: ['crossbow', 'machine gun']\" name=\"weapon\"              │ │\n",
-       "    │ │ required=\"true\"></string>                                                                               │ │\n",
-       "    │ │     </case>                                                                                             │ │\n",
-       "    │ │     <case name=\"flight\">                                                                                │ │\n",
-       "    │ │       <string format=\"guardrails/valid_choices: ['north', 'south', 'east', 'west']\"                     │ │\n",
-       "    │ │ name=\"flight_direction\" required=\"true\"></string>                                                       │ │\n",
-       "    │ │       <integer format=\"guardrails/valid_choices: [1, 2, 3, 4]\" name=\"distance\"                          │ │\n",
-       "    │ │ required=\"true\"></integer>                                                                              │ │\n",
-       "    │ │     </case>                                                                                             │ │\n",
-       "    │ │   </choice>                                                                                             │ │\n",
-       "    │ │ </output>                                                                                               │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the │ │\n",
-       "    │ │ `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding  │ │\n",
-       "    │ │ XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g.        │ │\n",
-       "    │ │ requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere,     │ │\n",
-       "    │ │ enter `null`.                                                                                           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Here's an example of the structure:                                                                     │ │\n",
-       "    │ │ {                                                                                                       │ │\n",
-       "    │ │   \"action\": {                                                                                           │ │\n",
-       "    │ │     \"chosen_action\": \"flight\",                                                                          │ │\n",
-       "    │ │     \"flight_direction\": \"few\",                                                                          │ │\n",
-       "    │ │     \"distance\": 10                                                                                      │ │\n",
-       "    │ │   }                                                                                                     │ │\n",
-       "    │ │ }                                                                                                       │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭───────────────────────────────────────────── Instructions ──────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ You are a helpful assistant only capable of communicating with valid JSON, and no other text.           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the │ │\n",
-       "    │ │ `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding  │ │\n",
-       "    │ │ XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g.        │ │\n",
-       "    │ │ requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere,     │ │\n",
-       "    │ │ enter `null`.                                                                                           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:                          │ │\n",
-       "    │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`                     │ │\n",
-       "    │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO',     │ │\n",
-       "    │ │ etc.]}`                                                                                                 │ │\n",
-       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
-       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃   Role  Content                                                                                    ┃ │ │\n",
+       "    │ │ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ system │                                                                                            │ │ │\n",
+       "    │ │ │        │ You are a helpful assistant only capable of communicating with valid JSON, and no other    │ │ │\n",
+       "    │ │ │        │ text.                                                                                      │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ONLY return a valid JSON object (no other text is necessary), where the key of the field   │ │ │\n",
+       "    │ │ │        │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type     │ │ │\n",
+       "    │ │ │        │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format,         │ │ │\n",
+       "    │ │ │        │ including any types and format requests e.g. requests for lists, objects and specific      │ │ │\n",
+       "    │ │ │        │ types. Be correct and concise. If you are unsure anywhere, enter `null`.                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:             │ │ │\n",
+       "    │ │ │        │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`        │ │ │\n",
+       "    │ │ │        │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',      │ │ │\n",
+       "    │ │ │        │ 'STRING TWO', etc.]}`                                                                      │ │ │\n",
+       "    │ │ │        │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer          │ │ │\n",
+       "    │ │ │        │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':   │ │ │\n",
+       "    │ │ │        │ 1}}`                                                                                       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │ │\n",
+       "    │ │ │   user │                                                                                            │ │ │\n",
+       "    │ │ │        │ I was given the following JSON response, which had problems due to incorrect values.       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ {                                                                                          │ │ │\n",
+       "    │ │ │        │   \"incorrect_value\": {                                                                     │ │ │\n",
+       "    │ │ │        │     \"action\": \"flight\"                                                                     │ │ │\n",
+       "    │ │ │        │   },                                                                                       │ │ │\n",
+       "    │ │ │        │   \"error_messages\": [                                                                      │ │ │\n",
+       "    │ │ │        │     \"JSON does not match schema:\\n{\\n  \\\"$.action\\\": [\\n    \\\"'flight' is not valid under  │ │ │\n",
+       "    │ │ │        │ any of the given schemas\\\"\\n  ]\\n}\"                                                        │ │ │\n",
+       "    │ │ │        │   ]                                                                                        │ │ │\n",
+       "    │ │ │        │ }                                                                                          │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Help me correct the incorrect values based on the given error messages.                    │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Given below is XML that describes the information to extract from this document and the    │ │ │\n",
+       "    │ │ │        │ tags to extract it into.                                                                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ <output>                                                                                   │ │ │\n",
+       "    │ │ │        │   <choice discriminator=\"chosen_action\" name=\"action\" required=\"true\">                     │ │ │\n",
+       "    │ │ │        │     <case name=\"fight\">                                                                    │ │ │\n",
+       "    │ │ │        │       <string format=\"guardrails/valid_choices: ['crossbow', 'machine gun']\" name=\"weapon\" │ │ │\n",
+       "    │ │ │        │ required=\"true\"></string>                                                                  │ │ │\n",
+       "    │ │ │        │     </case>                                                                                │ │ │\n",
+       "    │ │ │        │     <case name=\"flight\">                                                                   │ │ │\n",
+       "    │ │ │        │       <string format=\"guardrails/valid_choices: ['north', 'south', 'east', 'west']\"        │ │ │\n",
+       "    │ │ │        │ name=\"flight_direction\" required=\"true\"></string>                                          │ │ │\n",
+       "    │ │ │        │       <integer format=\"guardrails/valid_choices: [1, 2, 3, 4]\" name=\"distance\"             │ │ │\n",
+       "    │ │ │        │ required=\"true\"></integer>                                                                 │ │ │\n",
+       "    │ │ │        │     </case>                                                                                │ │ │\n",
+       "    │ │ │        │   </choice>                                                                                │ │ │\n",
+       "    │ │ │        │ </output>                                                                                  │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ONLY return a valid JSON object (no other text is necessary), where the key of the field   │ │ │\n",
+       "    │ │ │        │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type     │ │ │\n",
+       "    │ │ │        │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format,         │ │ │\n",
+       "    │ │ │        │ including any types and format requests e.g. requests for lists, objects and specific      │ │ │\n",
+       "    │ │ │        │ types. Be correct and concise. If you are unsure anywhere, enter `null`.                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Here's an example of the structure:                                                        │ │ │\n",
+       "    │ │ │        │ {                                                                                          │ │ │\n",
+       "    │ │ │        │   \"action\": {                                                                              │ │ │\n",
+       "    │ │ │        │     \"chosen_action\": \"flight\",                                                             │ │ │\n",
+       "    │ │ │        │     \"flight_direction\": \"hit\",                                                             │ │ │\n",
+       "    │ │ │        │     \"distance\": 17                                                                         │ │ │\n",
+       "    │ │ │        │   }                                                                                        │ │ │\n",
+       "    │ │ │        │ }                                                                                          │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
-       "    │ │ ```json                                                                                                 │ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │   \"action\": {                                                                                           │ │\n",
        "    │ │     \"chosen_action\": \"flight\",                                                                          │ │\n",
        "    │ │     \"flight_direction\": \"north\",                                                                        │ │\n",
-       "    │ │     \"distance\": 3                                                                                       │ │\n",
+       "    │ │     \"distance\": 1                                                                                       │ │\n",
        "    │ │   }                                                                                                     │ │\n",
        "    │ │ }                                                                                                       │ │\n",
-       "    │ │ ```                                                                                                     │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │     'action': {                                                                                         │ │\n",
        "    │ │         'chosen_action': 'flight',                                                                      │ │\n",
        "    │ │         'flight_direction': 'north',                                                                    │ │\n",
-       "    │ │         'distance': 3                                                                                   │ │\n",
+       "    │ │         'distance': 1                                                                                   │ │\n",
        "    │ │     }                                                                                                   │ │\n",
        "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
@@ -572,10 +565,7 @@
       "text/plain": [
        "Logs\n",
        "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "│   │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
        "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
@@ -623,22 +613,20 @@
        "│   │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```json\u001b[0m\u001b[48;2;245;245;220m                                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"action\": {\u001b[0m\u001b[48;2;245;245;220m                                                                                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"flight_direction\": \"north\",\u001b[0m\u001b[48;2;245;245;220m                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"distance\": 3\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  },\u001b[0m\u001b[48;2;245;245;220m                                                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"chosen_action\": \"flight\"\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"action\": \"flight\",\u001b[0m\u001b[48;2;245;245;220m                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"flight_direction\": \"north\",\u001b[0m\u001b[48;2;245;245;220m                                                                         \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"distance\": 3\u001b[0m\u001b[48;2;245;245;220m                                                                                        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```\u001b[0m\u001b[48;2;245;245;220m                                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "│   │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mSkeletonReAsk(\u001b[0m\u001b[48;2;240;255;240m                                                                                         \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    incorrect_value={'action': {'flight_direction': 'north', 'distance': 3}},\u001b[0m\u001b[48;2;240;255;240m                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    incorrect_value={'action': 'flight'},\u001b[0m\u001b[48;2;240;255;240m                                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    fail_results=[\u001b[0m\u001b[48;2;240;255;240m                                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        FailResult(\u001b[0m\u001b[48;2;240;255;240m                                                                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            outcome='fail',\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            error_message='JSON does not match schema:\\n{\\n  \"$.action\": [\\n    \"{\\'flight_direction\\':\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m\\'north\\', \\'distance\\': 3} is not valid under any of the given schemas\"\\n  ]\\n}',\u001b[0m\u001b[48;2;240;255;240m                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            error_message='JSON does not match schema:\\n{\\n  \"$.action\": [\\n    \"\\'flight\\' is not \u001b[0m\u001b[48;2;240;255;240m    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mvalid under any of the given schemas\"\\n  ]\\n}',\u001b[0m\u001b[48;2;240;255;240m                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            fix_value=None,\u001b[0m\u001b[48;2;240;255;240m                                                                            \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            error_spans=None,\u001b[0m\u001b[48;2;240;255;240m                                                                          \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "│   │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m            metadata=None,\u001b[0m\u001b[48;2;240;255;240m                                                                             \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
@@ -650,98 +638,95 @@
        "│   │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mI was given the following JSON response, which had problems due to incorrect values.\u001b[0m\u001b[48;2;240;248;255m                   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m{\u001b[0m\u001b[48;2;240;248;255m                                                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \"incorrect_value\": {\u001b[0m\u001b[48;2;240;248;255m                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \"action\": {\u001b[0m\u001b[48;2;240;248;255m                                                                                        \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"flight_direction\": \"north\",\u001b[0m\u001b[48;2;240;248;255m                                                                     \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \"distance\": 3\u001b[0m\u001b[48;2;240;248;255m                                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    }\u001b[0m\u001b[48;2;240;248;255m                                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  },\u001b[0m\u001b[48;2;240;248;255m                                                                                                   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \"error_messages\": [\u001b[0m\u001b[48;2;240;248;255m                                                                                  \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \"JSON does not match schema:\\n{\\n  \\\"$.action\\\": [\\n    \\\"{'flight_direction': 'north', 'distance':\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m3} is not valid under any of the given schemas\\\"\\n  ]\\n}\"\u001b[0m\u001b[48;2;240;248;255m                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  ]\u001b[0m\u001b[48;2;240;248;255m                                                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m}\u001b[0m\u001b[48;2;240;248;255m                                                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mHelp me correct the incorrect values based on the given error messages.\u001b[0m\u001b[48;2;240;248;255m                                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mGiven below is XML that describes the information to extract from this document and the tags to extract\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mit into.\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                                            \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                                             \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                                            \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                                            \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m`name` attribute of the corresponding XML, and the value is of the type specified by the corresponding \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mXML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mrequests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, \u001b[0m\u001b[48;2;240;248;255m   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255menter `null`.\u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mHere's an example of the structure:\u001b[0m\u001b[48;2;240;248;255m                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m{\u001b[0m\u001b[48;2;240;248;255m                                                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \"action\": {\u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \"chosen_action\": \"flight\",\u001b[0m\u001b[48;2;240;248;255m                                                                         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \"flight_direction\": \"few\",\u001b[0m\u001b[48;2;240;248;255m                                                                         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \"distance\": 10\u001b[0m\u001b[48;2;240;248;255m                                                                                     \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  }\u001b[0m\u001b[48;2;240;248;255m                                                                                                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m}\u001b[0m\u001b[48;2;240;248;255m                                                                                                      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m╭─\u001b[0m\u001b[48;2;255;240;242m────────────────────────────────────────────\u001b[0m\u001b[48;2;255;240;242m Instructions \u001b[0m\u001b[48;2;255;240;242m─────────────────────────────────────────────\u001b[0m\u001b[48;2;255;240;242m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mYou are a helpful assistant only capable of communicating with valid JSON, and no other text.\u001b[0m\u001b[48;2;255;240;242m          \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m`name` attribute of the corresponding XML, and the value is of the type specified by the corresponding \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mXML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. \u001b[0m\u001b[48;2;255;240;242m      \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mrequests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, \u001b[0m\u001b[48;2;255;240;242m   \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242menter `null`.\u001b[0m\u001b[48;2;255;240;242m                                                                                          \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mHere are examples of simple (XML, JSON) pairs that show the expected behavior:\u001b[0m\u001b[48;2;255;240;242m                         \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m- `` => `{'foo': 'example one'}`\u001b[0m\u001b[48;2;255;240;242m                    \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m- `` => `{\"bar\": ['STRING ONE', 'STRING TWO', \u001b[0m\u001b[48;2;255;240;242m   \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242metc.]}`\u001b[0m\u001b[48;2;255;240;242m                                                                                                \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;255;240;242m                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235m  Role\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                   \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235msystem\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYou are a helpful assistant only capable of communicating with valid JSON, and no other   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtext.                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235min JSON is the `name` attribute of the corresponding XML, and the value is of the type    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format,        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluding any types and format requests e.g. requests for lists, objects and specific     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtypes. Be correct and concise. If you are unsure anywhere, enter `null`.                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior:            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}`       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE',     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}`                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index':  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}`                                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  user\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mI was given the following JSON response, which had problems due to incorrect values.      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m{                                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  \"incorrect_value\": {                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    \"action\": \"flight\"                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  },                                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  \"error_messages\": [                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    \"JSON does not match schema:\\n{\\n  \\\"$.action\\\": [\\n    \\\"'flight' is not valid under \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many of the given schemas\\\"\\n  ]\\n}\"                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  ]                                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m}                                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHelp me correct the incorrect values based on the given error messages.                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtags to extract it into.                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                               \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235min JSON is the `name` attribute of the corresponding XML, and the value is of the type    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format,        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluding any types and format requests e.g. requests for lists, objects and specific     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtypes. Be correct and concise. If you are unsure anywhere, enter `null`.                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere's an example of the structure:                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m{                                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  \"action\": {                                                                             \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    \"chosen_action\": \"flight\",                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    \"flight_direction\": \"hit\",                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m    \"distance\": 17                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  }                                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m}                                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└────────┴────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```json\u001b[0m\u001b[48;2;245;245;220m                                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"action\": {\u001b[0m\u001b[48;2;245;245;220m                                                                                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"chosen_action\": \"flight\",\u001b[0m\u001b[48;2;245;245;220m                                                                         \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"flight_direction\": \"north\",\u001b[0m\u001b[48;2;245;245;220m                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"distance\": 3\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"distance\": 1\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  }\u001b[0m\u001b[48;2;245;245;220m                                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```\u001b[0m\u001b[48;2;245;245;220m                                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'action': {\u001b[0m\u001b[48;2;240;255;240m                                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        'chosen_action': 'flight',\u001b[0m\u001b[48;2;240;255;240m                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        'flight_direction': 'north',\u001b[0m\u001b[48;2;240;255;240m                                                                   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        'distance': 3\u001b[0m\u001b[48;2;240;255;240m                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        'distance': 1\u001b[0m\u001b[48;2;240;255;240m                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    }\u001b[0m\u001b[48;2;240;255;240m                                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
@@ -767,14 +752,23 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 27,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    }
+   ],
    "source": [
     "raw_llm_response, validated_response, *rest = guard(\n",
     "    messages=[{\"role\":\"user\", \"content\": prompt}],\n",
     "    prompt_params={'opp_type': 'goblin'},\n",
-    "    model=\"gpt-4o\",\n",
+    "    model=\"gpt-4o-mini\",\n",
     "    max_tokens=256,\n",
     "    temperature=0.0,\n",
     ")"
@@ -782,17 +776,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 28,
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
{'action': {'chosen_action': 'fight', 'weapon': 'crossbow'}}\n",
+       "
{'action': {'chosen_action': 'flight', 'flight_direction': 'north', 'distance': 1}}\n",
        "
\n" ], "text/plain": [ - "\u001b[1m{\u001b[0m\u001b[32m'action'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'chosen_action'\u001b[0m: \u001b[32m'fight'\u001b[0m, \u001b[32m'weapon'\u001b[0m: \u001b[32m'crossbow'\u001b[0m\u001b[1m}\u001b[0m\u001b[1m}\u001b[0m\n" + "\u001b[1m{\u001b[0m\u001b[32m'action'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'chosen_action'\u001b[0m: \u001b[32m'flight'\u001b[0m, \u001b[32m'flight_direction'\u001b[0m: \u001b[32m'north'\u001b[0m, \u001b[32m'distance'\u001b[0m: \u001b[1;36m1\u001b[0m\u001b[1m}\u001b[0m\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, @@ -812,141 +806,347 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Logs\n",
-       "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
-       "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
-       "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
-       "    │ │ │ user │                                                                                              │ │ │\n",
-       "    │ │ │      │ You are a human in an enchanted forest. You come across opponents of different types, and    │ │ │\n",
-       "    │ │ │      │ you should fight smaller opponents and run away from bigger ones.                            │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ │      │ You run into a goblin. What do you do?                                                       │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ │      │ Given below is XML that describes the information to extract from this document and the tags │ │ │\n",
-       "    │ │ │      │ to extract it into.                                                                          │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ │      │ <output>                                                                                     │ │ │\n",
-       "    │ │ │      │   <choice discriminator=\"chosen_action\" name=\"action\" required=\"true\">                       │ │ │\n",
-       "    │ │ │      │     <case name=\"fight\">                                                                      │ │ │\n",
-       "    │ │ │      │       <string format=\"guardrails/valid_choices: ['crossbow', 'machine gun']\" name=\"weapon\"   │ │ │\n",
-       "    │ │ │      │ required=\"true\"></string>                                                                    │ │ │\n",
-       "    │ │ │      │     </case>                                                                                  │ │ │\n",
-       "    │ │ │      │     <case name=\"flight\">                                                                     │ │ │\n",
-       "    │ │ │      │       <string format=\"guardrails/valid_choices: ['north', 'south', 'east', 'west']\"          │ │ │\n",
-       "    │ │ │      │ name=\"flight_direction\" required=\"true\"></string>                                            │ │ │\n",
-       "    │ │ │      │       <integer format=\"guardrails/valid_choices: [1, 2, 3, 4]\" name=\"distance\"               │ │ │\n",
-       "    │ │ │      │ required=\"true\"></integer>                                                                   │ │ │\n",
-       "    │ │ │      │     </case>                                                                                  │ │ │\n",
-       "    │ │ │      │   </choice>                                                                                  │ │ │\n",
-       "    │ │ │      │ </output>                                                                                    │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ │      │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in  │ │ │\n",
-       "    │ │ │      │ JSON is the `name` attribute of the corresponding XML, and the value is of the type          │ │ │\n",
-       "    │ │ │      │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │ │\n",
-       "    │ │ │      │ any types and format requests e.g. requests for lists, objects and specific types. Be        │ │ │\n",
-       "    │ │ │      │ correct and concise.                                                                         │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ │      │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:               │ │ │\n",
-       "    │ │ │      │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`          │ │ │\n",
-       "    │ │ │      │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',        │ │ │\n",
-       "    │ │ │      │ 'STRING TWO', etc.]}`                                                                        │ │ │\n",
-       "    │ │ │      │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer            │ │ │\n",
-       "    │ │ │      │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':     │ │ │\n",
-       "    │ │ │      │ 1}}`                                                                                         │ │ │\n",
-       "    │ │ │      │                                                                                              │ │ │\n",
-       "    │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
+       "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
+       "│   │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "│   │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "│   │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
+       "│   │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "│   │ │ │ user │                                                                                              │ │ │\n",
+       "│   │ │ │      │ You are a human in an enchanted forest. You come across opponents of different types, and    │ │ │\n",
+       "│   │ │ │      │ you should fight smaller opponents and run away from bigger ones.                            │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ You run into a goblin. What do you do?                                                       │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ Given below is XML that describes the information to extract from this document and the tags │ │ │\n",
+       "│   │ │ │      │ to extract it into.                                                                          │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ <output>                                                                                     │ │ │\n",
+       "│   │ │ │      │   <choice discriminator=\"chosen_action\" name=\"action\" required=\"true\">                       │ │ │\n",
+       "│   │ │ │      │     <case name=\"fight\">                                                                      │ │ │\n",
+       "│   │ │ │      │       <string format=\"guardrails/valid_choices: ['crossbow', 'machine gun']\" name=\"weapon\"   │ │ │\n",
+       "│   │ │ │      │ required=\"true\"></string>                                                                    │ │ │\n",
+       "│   │ │ │      │     </case>                                                                                  │ │ │\n",
+       "│   │ │ │      │     <case name=\"flight\">                                                                     │ │ │\n",
+       "│   │ │ │      │       <string format=\"guardrails/valid_choices: ['north', 'south', 'east', 'west']\"          │ │ │\n",
+       "│   │ │ │      │ name=\"flight_direction\" required=\"true\"></string>                                            │ │ │\n",
+       "│   │ │ │      │       <integer format=\"guardrails/valid_choices: [1, 2, 3, 4]\" name=\"distance\"               │ │ │\n",
+       "│   │ │ │      │ required=\"true\"></integer>                                                                   │ │ │\n",
+       "│   │ │ │      │     </case>                                                                                  │ │ │\n",
+       "│   │ │ │      │   </choice>                                                                                  │ │ │\n",
+       "│   │ │ │      │ </output>                                                                                    │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in  │ │ │\n",
+       "│   │ │ │      │ JSON is the `name` attribute of the corresponding XML, and the value is of the type          │ │ │\n",
+       "│   │ │ │      │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │ │\n",
+       "│   │ │ │      │ any types and format requests e.g. requests for lists, objects and specific types. Be        │ │ │\n",
+       "│   │ │ │      │ correct and concise.                                                                         │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:               │ │ │\n",
+       "│   │ │ │      │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`          │ │ │\n",
+       "│   │ │ │      │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',        │ │ │\n",
+       "│   │ │ │      │ 'STRING TWO', etc.]}`                                                                        │ │ │\n",
+       "│   │ │ │      │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer            │ │ │\n",
+       "│   │ │ │      │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':     │ │ │\n",
+       "│   │ │ │      │ 1}}`                                                                                         │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
+       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "│   │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "│   │ │ ```json                                                                                                 │ │\n",
+       "│   │ │ {                                                                                                       │ │\n",
+       "│   │ │   \"action\": \"fight\",                                                                                    │ │\n",
+       "│   │ │   \"weapon\": \"crossbow\"                                                                                  │ │\n",
+       "│   │ │ }                                                                                                       │ │\n",
+       "│   │ │ ```                                                                                                     │ │\n",
+       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "│   │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "│   │ │ SkeletonReAsk(                                                                                          │ │\n",
+       "│   │ │     incorrect_value={'action': 'fight'},                                                                │ │\n",
+       "│   │ │     fail_results=[                                                                                      │ │\n",
+       "│   │ │         FailResult(                                                                                     │ │\n",
+       "│   │ │             outcome='fail',                                                                             │ │\n",
+       "│   │ │             error_message='JSON does not match schema:\\n{\\n  \"$.action\": [\\n    \"\\'fight\\' is not valid │ │\n",
+       "│   │ │ under any of the given schemas\"\\n  ]\\n}',                                                               │ │\n",
+       "│   │ │             fix_value=None,                                                                             │ │\n",
+       "│   │ │             error_spans=None,                                                                           │ │\n",
+       "│   │ │             metadata=None,                                                                              │ │\n",
+       "│   │ │             validated_chunk=None                                                                        │ │\n",
+       "│   │ │         )                                                                                               │ │\n",
+       "│   │ │     ],                                                                                                  │ │\n",
+       "│   │ │     additional_properties={}                                                                            │ │\n",
+       "│   │ │ )                                                                                                       │ │\n",
+       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃   Role  Content                                                                                    ┃ │ │\n",
+       "    │ │ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ system │                                                                                            │ │ │\n",
+       "    │ │ │        │ You are a helpful assistant only capable of communicating with valid JSON, and no other    │ │ │\n",
+       "    │ │ │        │ text.                                                                                      │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ONLY return a valid JSON object (no other text is necessary), where the key of the field   │ │ │\n",
+       "    │ │ │        │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type     │ │ │\n",
+       "    │ │ │        │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format,         │ │ │\n",
+       "    │ │ │        │ including any types and format requests e.g. requests for lists, objects and specific      │ │ │\n",
+       "    │ │ │        │ types. Be correct and concise. If you are unsure anywhere, enter `null`.                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:             │ │ │\n",
+       "    │ │ │        │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`        │ │ │\n",
+       "    │ │ │        │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',      │ │ │\n",
+       "    │ │ │        │ 'STRING TWO', etc.]}`                                                                      │ │ │\n",
+       "    │ │ │        │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer          │ │ │\n",
+       "    │ │ │        │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':   │ │ │\n",
+       "    │ │ │        │ 1}}`                                                                                       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │ │\n",
+       "    │ │ │   user │                                                                                            │ │ │\n",
+       "    │ │ │        │ I was given the following JSON response, which had problems due to incorrect values.       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ {                                                                                          │ │ │\n",
+       "    │ │ │        │   \"incorrect_value\": {                                                                     │ │ │\n",
+       "    │ │ │        │     \"action\": \"fight\"                                                                      │ │ │\n",
+       "    │ │ │        │   },                                                                                       │ │ │\n",
+       "    │ │ │        │   \"error_messages\": [                                                                      │ │ │\n",
+       "    │ │ │        │     \"JSON does not match schema:\\n{\\n  \\\"$.action\\\": [\\n    \\\"'fight' is not valid under   │ │ │\n",
+       "    │ │ │        │ any of the given schemas\\\"\\n  ]\\n}\"                                                        │ │ │\n",
+       "    │ │ │        │   ]                                                                                        │ │ │\n",
+       "    │ │ │        │ }                                                                                          │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Help me correct the incorrect values based on the given error messages.                    │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Given below is XML that describes the information to extract from this document and the    │ │ │\n",
+       "    │ │ │        │ tags to extract it into.                                                                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ <output>                                                                                   │ │ │\n",
+       "    │ │ │        │   <choice discriminator=\"chosen_action\" name=\"action\" required=\"true\">                     │ │ │\n",
+       "    │ │ │        │     <case name=\"fight\">                                                                    │ │ │\n",
+       "    │ │ │        │       <string format=\"guardrails/valid_choices: ['crossbow', 'machine gun']\" name=\"weapon\" │ │ │\n",
+       "    │ │ │        │ required=\"true\"></string>                                                                  │ │ │\n",
+       "    │ │ │        │     </case>                                                                                │ │ │\n",
+       "    │ │ │        │     <case name=\"flight\">                                                                   │ │ │\n",
+       "    │ │ │        │       <string format=\"guardrails/valid_choices: ['north', 'south', 'east', 'west']\"        │ │ │\n",
+       "    │ │ │        │ name=\"flight_direction\" required=\"true\"></string>                                          │ │ │\n",
+       "    │ │ │        │       <integer format=\"guardrails/valid_choices: [1, 2, 3, 4]\" name=\"distance\"             │ │ │\n",
+       "    │ │ │        │ required=\"true\"></integer>                                                                 │ │ │\n",
+       "    │ │ │        │     </case>                                                                                │ │ │\n",
+       "    │ │ │        │   </choice>                                                                                │ │ │\n",
+       "    │ │ │        │ </output>                                                                                  │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ONLY return a valid JSON object (no other text is necessary), where the key of the field   │ │ │\n",
+       "    │ │ │        │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type     │ │ │\n",
+       "    │ │ │        │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format,         │ │ │\n",
+       "    │ │ │        │ including any types and format requests e.g. requests for lists, objects and specific      │ │ │\n",
+       "    │ │ │        │ types. Be correct and concise. If you are unsure anywhere, enter `null`.                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Here's an example of the structure:                                                        │ │ │\n",
+       "    │ │ │        │ {                                                                                          │ │ │\n",
+       "    │ │ │        │   \"action\": {                                                                              │ │ │\n",
+       "    │ │ │        │     \"chosen_action\": \"flight\",                                                             │ │ │\n",
+       "    │ │ │        │     \"flight_direction\": \"form\",                                                            │ │ │\n",
+       "    │ │ │        │     \"distance\": 63                                                                         │ │ │\n",
+       "    │ │ │        │   }                                                                                        │ │ │\n",
+       "    │ │ │        │ }                                                                                          │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
-       "    │ │ ```json                                                                                                 │ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │   \"action\": {                                                                                           │ │\n",
-       "    │ │     \"chosen_action\": \"fight\",                                                                           │ │\n",
-       "    │ │     \"weapon\": \"crossbow\"                                                                                │ │\n",
+       "    │ │     \"chosen_action\": \"flight\",                                                                          │ │\n",
+       "    │ │     \"flight_direction\": \"north\",                                                                        │ │\n",
+       "    │ │     \"distance\": 1                                                                                       │ │\n",
        "    │ │   }                                                                                                     │ │\n",
        "    │ │ }                                                                                                       │ │\n",
-       "    │ │ ```                                                                                                     │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
-       "    │ │ {'action': {'chosen_action': 'fight', 'weapon': 'crossbow'}}                                            │ │\n",
+       "    │ │ {                                                                                                       │ │\n",
+       "    │ │     'action': {                                                                                         │ │\n",
+       "    │ │         'chosen_action': 'flight',                                                                      │ │\n",
+       "    │ │         'flight_direction': 'north',                                                                    │ │\n",
+       "    │ │         'distance': 1                                                                                   │ │\n",
+       "    │ │     }                                                                                                   │ │\n",
+       "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "
\n" ], "text/plain": [ "Logs\n", - "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n", - " │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n", - " │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n", - " │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYou are a human in an enchanted forest. You come across opponents of different types, and \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235myou should fight smaller opponents and run away from bigger ones. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYou run into a goblin. What do you do? \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the tags\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mto extract it into. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field in \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mJSON is the `name` attribute of the corresponding XML, and the value is of the type \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, including\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many types and format requests e.g. requests for lists, objects and specific types. Be \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcorrect and concise. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior: \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE', \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index': \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n", + "│ │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYou are a human in an enchanted forest. You come across opponents of different types, and \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235myou should fight smaller opponents and run away from bigger ones. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYou run into a goblin. What do you do? \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the tags\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mto extract it into. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field in \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mJSON is the `name` attribute of the corresponding XML, and the value is of the type \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, including\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many types and format requests e.g. requests for lists, objects and specific types. Be \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcorrect and concise. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior: \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE', \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index': \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + "│ │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", + "│ │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```json\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + "│ │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + "│ │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \"action\": \"fight\",\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + "│ │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \"weapon\": \"crossbow\"\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + "│ │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + "│ │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + "│ │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mSkeletonReAsk(\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m incorrect_value={'action': 'fight'},\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m fail_results=[\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m FailResult(\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m outcome='fail',\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m error_message='JSON does not match schema:\\n{\\n \"$.action\": [\\n \"\\'fight\\' is not valid\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240munder any of the given schemas\"\\n ]\\n}',\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m fix_value=None,\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m error_spans=None,\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m metadata=None,\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m validated_chunk=None\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m )\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m ],\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m additional_properties={}\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m)\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + "│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n", + "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n", + " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235m Role\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235msystem\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYou are a helpful assistant only capable of communicating with valid JSON, and no other \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtext. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235min JSON is the `name` attribute of the corresponding XML, and the value is of the type \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluding any types and format requests e.g. requests for lists, objects and specific \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtypes. Be correct and concise. If you are unsure anywhere, enter `null`. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior: \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE', \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index': \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m user\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mI was given the following JSON response, which had problems due to incorrect values. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m{ \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \"incorrect_value\": { \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \"action\": \"fight\" \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m }, \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \"error_messages\": [ \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \"JSON does not match schema:\\n{\\n \\\"$.action\\\": [\\n \\\"'fight' is not valid under \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many of the given schemas\\\"\\n ]\\n}\" \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m ] \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m} \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHelp me correct the incorrect values based on the given error messages. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtags to extract it into. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235min JSON is the `name` attribute of the corresponding XML, and the value is of the type \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluding any types and format requests e.g. requests for lists, objects and specific \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtypes. Be correct and concise. If you are unsure anywhere, enter `null`. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere's an example of the structure: \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m{ \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \"action\": { \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \"chosen_action\": \"flight\", \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \"flight_direction\": \"form\", \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \"distance\": 63 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m } \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m} \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└────────┴────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", " │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```json\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \"action\": {\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \"chosen_action\": \"fight\",\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \"weapon\": \"crossbow\"\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \"chosen_action\": \"flight\",\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \"flight_direction\": \"north\",\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \"distance\": 1\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m }\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{'action': {'chosen_action': 'fight', 'weapon': 'crossbow'}}\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m 'action': {\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m 'chosen_action': 'flight',\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m 'flight_direction': 'north',\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m 'distance': 1\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m }\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", " │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" ] @@ -962,7 +1162,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "litellm", "language": "python", "name": "python3" }, @@ -976,7 +1176,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.1" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/examples/summarizer.ipynb b/docs/examples/summarizer.ipynb index d71565f9a..bd4bbba97 100644 --- a/docs/examples/summarizer.ipynb +++ b/docs/examples/summarizer.ipynb @@ -26,9 +26,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.2\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n", "Installing hub:\u001b[35m/\u001b[0m\u001b[35m/guardrails/\u001b[0m\u001b[95mreading_time...\u001b[0m\n", "✅Successfully installed guardrails/reading_time!\n", @@ -82,9 +79,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n", + " from tqdm.autonotebook import tqdm, trange\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading the model all-MiniLM-L6-v2. This may take a while...\n" + ] + } + ], "source": [ "from pydantic import BaseModel, Field\n", "\n", @@ -146,15 +159,23 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Similarity: 0.789, Type: \n", - "Validated Output: {'summary': \"Mark Twain discusses the art of storytelling, focusing on the humorous story, which he considers uniquely American. He contrasts it with the comic story, which is English, and the witty story, which is French. The humorous story relies on the manner of telling, can be lengthy, and often ends without a clear point. In contrast, comic and witty stories are brief and end with a punchline. Twain emphasizes that telling a humorous story requires high artistic skill, while anyone can tell comic or witty stories. He notes that humorous stories are told gravely, with the teller pretending not to know it's funny, whereas comic stories are told with obvious delight and emphasis on the punchline. Twain mentions that some storytellers, like Artemus Ward, use subtle techniques to deliver the punchline, while comic storytellers make it very obvious. He finds the latter approach less appealing.\"}\n" + "Similarity: 0.818, Type: \n", + "Validated Output: {'summary': \"Mark Twain discusses the art of storytelling, focusing on the humorous story, which he considers an American development. He contrasts it with the comic story, which is English, and the witty story, which is French. The humorous story relies on the manner of telling, allowing for length and meandering, while comic and witty stories depend on content and must be brief with a clear point. Twain emphasizes that telling a humorous story is a high art, requiring skill, unlike the comic and witty stories that anyone can tell. The humorous story is delivered gravely, with the teller pretending not to know it's funny, whereas the comic story is told with enthusiasm and obviousness. Twain notes that the humorous story often ends with a subtle point, requiring the audience's attention, a technique used by storytellers like Artemus Ward and others. In contrast, the comic story's punchline is emphasized and often exaggerated in print, which Twain finds disheartening.\"}\n" ] } ], @@ -183,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -191,10 +212,7 @@ "text/html": [ "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
        "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
        "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
        "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
@@ -331,27 +349,28 @@
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ {\"summary\":\"Mark Twain discusses the art of storytelling, focusing on the humorous story, which he      │ │\n",
-       "    │ │ considers uniquely American. He contrasts it with the comic story, which is English, and the witty      │ │\n",
-       "    │ │ story, which is French. The humorous story relies on the manner of telling, can be lengthy, and often   │ │\n",
-       "    │ │ ends without a clear point. In contrast, comic and witty stories are brief and end with a punchline.    │ │\n",
-       "    │ │ Twain emphasizes that telling a humorous story requires high artistic skill, while anyone can tell      │ │\n",
-       "    │ │ comic or witty stories. He notes that humorous stories are told gravely, with the teller pretending not │ │\n",
-       "    │ │ to know it's funny, whereas comic stories are told with obvious delight and emphasis on the punchline.  │ │\n",
-       "    │ │ Twain mentions that some storytellers, like Artemus Ward, use subtle techniques to deliver the          │ │\n",
-       "    │ │ punchline, while comic storytellers make it very obvious. He finds the latter approach less             │ │\n",
-       "    │ │ appealing.\"}                                                                                            │ │\n",
+       "    │ │ considers an American development. He contrasts it with the comic story, which is English, and the      │ │\n",
+       "    │ │ witty story, which is French. The humorous story relies on the manner of telling, allowing for length   │ │\n",
+       "    │ │ and meandering, while comic and witty stories depend on content and must be brief with a clear point.   │ │\n",
+       "    │ │ Twain emphasizes that telling a humorous story is a high art, requiring skill, unlike the comic and     │ │\n",
+       "    │ │ witty stories that anyone can tell. The humorous story is delivered gravely, with the teller pretending │ │\n",
+       "    │ │ not to know it's funny, whereas the comic story is told with enthusiasm and obviousness. Twain notes    │ │\n",
+       "    │ │ that the humorous story often ends with a subtle point, requiring the audience's attention, a technique │ │\n",
+       "    │ │ used by storytellers like Artemus Ward and others. In contrast, the comic story's punchline is          │ │\n",
+       "    │ │ emphasized and often exaggerated in print, which Twain finds disheartening.\"}                           │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │     'summary': \"Mark Twain discusses the art of storytelling, focusing on the humorous story, which he  │ │\n",
-       "    │ │ considers uniquely American. He contrasts it with the comic story, which is English, and the witty      │ │\n",
-       "    │ │ story, which is French. The humorous story relies on the manner of telling, can be lengthy, and often   │ │\n",
-       "    │ │ ends without a clear point. In contrast, comic and witty stories are brief and end with a punchline.    │ │\n",
-       "    │ │ Twain emphasizes that telling a humorous story requires high artistic skill, while anyone can tell      │ │\n",
-       "    │ │ comic or witty stories. He notes that humorous stories are told gravely, with the teller pretending not │ │\n",
-       "    │ │ to know it's funny, whereas comic stories are told with obvious delight and emphasis on the punchline.  │ │\n",
-       "    │ │ Twain mentions that some storytellers, like Artemus Ward, use subtle techniques to deliver the          │ │\n",
-       "    │ │ punchline, while comic storytellers make it very obvious. He finds the latter approach less appealing.\" │ │\n",
+       "    │ │ considers an American development. He contrasts it with the comic story, which is English, and the      │ │\n",
+       "    │ │ witty story, which is French. The humorous story relies on the manner of telling, allowing for length   │ │\n",
+       "    │ │ and meandering, while comic and witty stories depend on content and must be brief with a clear point.   │ │\n",
+       "    │ │ Twain emphasizes that telling a humorous story is a high art, requiring skill, unlike the comic and     │ │\n",
+       "    │ │ witty stories that anyone can tell. The humorous story is delivered gravely, with the teller pretending │ │\n",
+       "    │ │ not to know it's funny, whereas the comic story is told with enthusiasm and obviousness. Twain notes    │ │\n",
+       "    │ │ that the humorous story often ends with a subtle point, requiring the audience's attention, a technique │ │\n",
+       "    │ │ used by storytellers like Artemus Ward and others. In contrast, the comic story's punchline is          │ │\n",
+       "    │ │ emphasized and often exaggerated in print, which Twain finds disheartening.\"                            │ │\n",
        "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
@@ -360,10 +379,7 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
@@ -500,33 +516,34 @@
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\"summary\":\"Mark Twain discusses the art of storytelling, focusing on the humorous story, which he \u001b[0m\u001b[48;2;245;245;220m    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mconsiders uniquely American. He contrasts it with the comic story, which is English, and the witty \u001b[0m\u001b[48;2;245;245;220m    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mstory, which is French. The humorous story relies on the manner of telling, can be lengthy, and often \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mends without a clear point. In contrast, comic and witty stories are brief and end with a punchline. \u001b[0m\u001b[48;2;245;245;220m  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mTwain emphasizes that telling a humorous story requires high artistic skill, while anyone can tell \u001b[0m\u001b[48;2;245;245;220m    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mcomic or witty stories. He notes that humorous stories are told gravely, with the teller pretending not\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mto know it's funny, whereas comic stories are told with obvious delight and emphasis on the punchline. \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mTwain mentions that some storytellers, like Artemus Ward, use subtle techniques to deliver the \u001b[0m\u001b[48;2;245;245;220m        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mpunchline, while comic storytellers make it very obvious. He finds the latter approach less \u001b[0m\u001b[48;2;245;245;220m           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mappealing.\"}\u001b[0m\u001b[48;2;245;245;220m                                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mconsiders an American development. He contrasts it with the comic story, which is English, and the \u001b[0m\u001b[48;2;245;245;220m    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mwitty story, which is French. The humorous story relies on the manner of telling, allowing for length \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mand meandering, while comic and witty stories depend on content and must be brief with a clear point. \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mTwain emphasizes that telling a humorous story is a high art, requiring skill, unlike the comic and \u001b[0m\u001b[48;2;245;245;220m   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mwitty stories that anyone can tell. The humorous story is delivered gravely, with the teller pretending\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mnot to know it's funny, whereas the comic story is told with enthusiasm and obviousness. Twain notes \u001b[0m\u001b[48;2;245;245;220m  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mthat the humorous story often ends with a subtle point, requiring the audience's attention, a technique\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mused by storytellers like Artemus Ward and others. In contrast, the comic story's punchline is \u001b[0m\u001b[48;2;245;245;220m        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220memphasized and often exaggerated in print, which Twain finds disheartening.\"}\u001b[0m\u001b[48;2;245;245;220m                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'summary': \"Mark Twain discusses the art of storytelling, focusing on the humorous story, which he \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mconsiders uniquely American. He contrasts it with the comic story, which is English, and the witty \u001b[0m\u001b[48;2;240;255;240m    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mstory, which is French. The humorous story relies on the manner of telling, can be lengthy, and often \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mends without a clear point. In contrast, comic and witty stories are brief and end with a punchline. \u001b[0m\u001b[48;2;240;255;240m  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mTwain emphasizes that telling a humorous story requires high artistic skill, while anyone can tell \u001b[0m\u001b[48;2;240;255;240m    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mcomic or witty stories. He notes that humorous stories are told gravely, with the teller pretending not\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mto know it's funny, whereas comic stories are told with obvious delight and emphasis on the punchline. \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mTwain mentions that some storytellers, like Artemus Ward, use subtle techniques to deliver the \u001b[0m\u001b[48;2;240;255;240m        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mpunchline, while comic storytellers make it very obvious. He finds the latter approach less appealing.\"\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mconsiders an American development. He contrasts it with the comic story, which is English, and the \u001b[0m\u001b[48;2;240;255;240m    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mwitty story, which is French. The humorous story relies on the manner of telling, allowing for length \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mand meandering, while comic and witty stories depend on content and must be brief with a clear point. \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mTwain emphasizes that telling a humorous story is a high art, requiring skill, unlike the comic and \u001b[0m\u001b[48;2;240;255;240m   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mwitty stories that anyone can tell. The humorous story is delivered gravely, with the teller pretending\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mnot to know it's funny, whereas the comic story is told with enthusiasm and obviousness. Twain notes \u001b[0m\u001b[48;2;240;255;240m  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mthat the humorous story often ends with a subtle point, requiring the audience's attention, a technique\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mused by storytellers like Artemus Ward and others. In contrast, the comic story's punchline is \u001b[0m\u001b[48;2;240;255;240m        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240memphasized and often exaggerated in print, which Twain finds disheartening.\"\u001b[0m\u001b[48;2;240;255;240m                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n"
       ]
      },
-     "execution_count": 6,
+     "execution_count": 7,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -548,7 +565,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [
     {
@@ -580,7 +597,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [
     {
@@ -588,10 +605,7 @@
       "text/html": [
        "
Logs\n",
        "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "│   │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "│   │ │ No prompt                                                                                               │ │\n",
-       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "│   │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
+       "│   │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
        "│   │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
        "│   │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
        "│   │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
@@ -764,114 +778,126 @@
        "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ I was given the following response, which was not parseable as JSON.                                    │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ \"The following XML is invalid:\\n- `<string name='foo' format='two-words lower-case' />` => `{'foo':     │ │\n",
-       "    │ │ 'example one'}`\\n- `<list name='bar'><string format='upper-case' /></list>` => `{\\\"bar\\\": ['STRING      │ │\n",
-       "    │ │ ONE', 'STRING TWO', etc.]}`\\n- `<object name='baz'><string name=\\\"foo\\\" format=\\\"capitalize two-words\\\" │ │\n",
-       "    │ │ /><integer name=\\\"index\\\" format=\\\"1-indexed\\\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │\n",
-       "    │ │ 1}}`\\n\\nThe following JSON is invalid:\\n- `<string name='foo' format='two-words lower-case' />` =>      │ │\n",
-       "    │ │ `{'foo': 'example one'}`\\n- `<list name='bar'><string format='upper-case' /></list>` => `{\\\"bar\\\":      │ │\n",
-       "    │ │ ['STRING ONE', 'STRING TWO', etc.]}`\\n- `<object name='baz'><string name=\\\"foo\\\" format=\\\"capitalize    │ │\n",
-       "    │ │ two-words\\\" /><integer name=\\\"index\\\" format=\\\"1-indexed\\\" /></object>` => `{'baz': {'foo': 'Some       │ │\n",
-       "    │ │ String', 'index': 1}}`\\n\\nThe following XML is valid:\\n- `<string name='foo' format='two-words          │ │\n",
-       "    │ │ lower-case' />` => `{'foo': 'example one'}`\\n- `<list name='bar'><string format='upper-case' /></list>` │ │\n",
-       "    │ │ => `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `<object name='baz'><string name=\\\"foo\\\"          │ │\n",
-       "    │ │ format=\\\"capitalize two-words\\\" /><integer name=\\\"index\\\" format=\\\"1-indexed\\\" /></object>` => `{'baz': │ │\n",
-       "    │ │ {'foo': 'Some String', 'index': 1}}`\\n\\nThe following JSON is valid:\\n- `<string name='foo'             │ │\n",
-       "    │ │ format='two-words lower-case' />` => `{'foo': 'example one'}`\\n- `<list name='bar'><string              │ │\n",
-       "    │ │ format='upper-case' /></list>` => `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `<object           │ │\n",
-       "    │ │ name='baz'><string name=\\\"foo\\\" format=\\\"capitalize two-words\\\" /><integer name=\\\"index\\\"               │ │\n",
-       "    │ │ format=\\\"1-indexed\\\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`\\n\\nThe following XML │ │\n",
-       "    │ │ is valid:\\n- `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`\\n-       │ │\n",
-       "    │ │ `<list\"                                                                                                 │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Help me correct this by making it valid JSON.                                                           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Given below is XML that describes the information to extract from this document and the tags to extract │ │\n",
-       "    │ │ it into.                                                                                                │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ <output>                                                                                                │ │\n",
-       "    │ │   <string description=\"Faithful summary of the text\" format=\"guardrails/reading_time: 3.0;              │ │\n",
-       "    │ │ guardrails/valid_length: 100 1000; guardrails/similar_to_document: 'The Humorous Story an American      │ │\n",
-       "    │ │ Development.— ItsDifference from Comic and Witty Stories.DO not claim that I can tell a story as it     │ │\n",
-       "    │ │ ought tobe told. I only claim to know how a storyought to be told, for I have been almost daily in      │ │\n",
-       "    │ │ thecompany of the most expert story-tellers for manyyears.There are several kinds of stories, but only  │ │\n",
-       "    │ │ onedifficult kind —the humorous. I will talk mainlyabout that one. The humorous story is American,the   │ │\n",
-       "    │ │ comic story is English, the witty story is French.The humorous story depends for its effect upon        │ │\n",
-       "    │ │ themanner of the telling; the comic story and the wittystory upon the matter.The humorous story may be  │ │\n",
-       "    │ │ spun out to greatlength, and may wander around as much as itpleases, and arrive nowhere in particular;  │ │\n",
-       "    │ │ but thecomic and witty stories must be brief and end witha point. The humorous story bubbles gently     │ │\n",
-       "    │ │ along,the others burst.The humorous story is strictly a work of art —high and delicate art — and only   │ │\n",
-       "    │ │ an artist can tell it;but no art is necessary in telling the comic and thewitty story; anybody can do   │ │\n",
-       "    │ │ it. The art of tellinga humorous story — understand, I mean by word ofmouth, not print — was created in │ │\n",
-       "    │ │ America, andhas remained at home.The humorous story is told gravely; the tellerdoes his best to conceal │ │\n",
-       "    │ │ the fact that he even dimlysuspects that there is anything funny about it; butthe teller of the comic   │ │\n",
-       "    │ │ story tells you beforehandthat it is one of the funniest things he has everheard, then tells it with    │ │\n",
-       "    │ │ eager delight, and is thefirst person to laugh when he gets through. Andsometimes, if he has had good   │ │\n",
-       "    │ │ success, he is so gladand happy that he will repeat the ‘‘ nub’’ of it andslance around from face to    │ │\n",
-       "    │ │ face, collecting applause,and then repeat it again. It is a pathetic thing tosee.Very often, of course, │ │\n",
-       "    │ │ the rambling and disjointedhumorous story finishes with a nub, point, snapper,or whatever you like to   │ │\n",
-       "    │ │ call it. Then the listenermust be alert, for in many cases the teller will divertattention from that    │ │\n",
-       "    │ │ nub by dropping it in a carefully.casual and indifferent way, with the pretence that hedoes not know it │ │\n",
-       "    │ │ is a nub.Artemus Ward used that trick a good deal; thenwhen the belated audience presently caught the   │ │\n",
-       "    │ │ jokehe would look up with innocent surprise, as ifwondering what they had found to laugh at.            │ │\n",
-       "    │ │ DanSetchell used it before him, Nye and Riley andothers use it to-day.But the teller of the comic story │ │\n",
-       "    │ │ does not slurthe nub; he shouts it at you—every time. Andwhen he prints it, in England, France,         │ │\n",
-       "    │ │ Germany,and Italy, he italicizes it, puts some whoopingexclamation-points after it, and sometimes       │ │\n",
-       "    │ │ explainsit in a parenthesis. All of which is very depressing,and makes one want to renounce joking and  │ │\n",
-       "    │ │ lead abetter life.- Mark Twain' 0.6 all-MiniLM-L6-v2\" name=\"summary\" required=\"true\"></string>          │ │\n",
-       "    │ │ </output>                                                                                               │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the │ │\n",
-       "    │ │ `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding  │ │\n",
-       "    │ │ XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g.        │ │\n",
-       "    │ │ requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere,     │ │\n",
-       "    │ │ enter `null`.                                                                                           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭───────────────────────────────────────────── Instructions ──────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ You are a helpful assistant only capable of communicating with valid JSON, and no other text.           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the │ │\n",
-       "    │ │ `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding  │ │\n",
-       "    │ │ XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g.        │ │\n",
-       "    │ │ requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere,     │ │\n",
-       "    │ │ enter `null`.                                                                                           │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:                          │ │\n",
-       "    │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`                     │ │\n",
-       "    │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO',     │ │\n",
-       "    │ │ etc.]}`                                                                                                 │ │\n",
-       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
-       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃   Role  Content                                                                                    ┃ │ │\n",
+       "    │ │ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ system │                                                                                            │ │ │\n",
+       "    │ │ │        │ You are a helpful assistant only capable of communicating with valid JSON, and no other    │ │ │\n",
+       "    │ │ │        │ text.                                                                                      │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ONLY return a valid JSON object (no other text is necessary), where the key of the field   │ │ │\n",
+       "    │ │ │        │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type     │ │ │\n",
+       "    │ │ │        │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format,         │ │ │\n",
+       "    │ │ │        │ including any types and format requests e.g. requests for lists, objects and specific      │ │ │\n",
+       "    │ │ │        │ types. Be correct and concise. If you are unsure anywhere, enter `null`.                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:             │ │ │\n",
+       "    │ │ │        │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`        │ │ │\n",
+       "    │ │ │        │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',      │ │ │\n",
+       "    │ │ │        │ 'STRING TWO', etc.]}`                                                                      │ │ │\n",
+       "    │ │ │        │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer          │ │ │\n",
+       "    │ │ │        │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':   │ │ │\n",
+       "    │ │ │        │ 1}}`                                                                                       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │ │\n",
+       "    │ │ │   user │                                                                                            │ │ │\n",
+       "    │ │ │        │ I was given the following response, which was not parseable as JSON.                       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ \"The following XML is invalid:\\n- `<string name='foo' format='two-words lower-case' />` => │ │ │\n",
+       "    │ │ │        │ `{'foo': 'example one'}`\\n- `<list name='bar'><string format='upper-case' /></list>` =>    │ │ │\n",
+       "    │ │ │        │ `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `<object name='baz'><string             │ │ │\n",
+       "    │ │ │        │ name=\\\"foo\\\" format=\\\"capitalize two-words\\\" /><integer name=\\\"index\\\"                     │ │ │\n",
+       "    │ │ │        │ format=\\\"1-indexed\\\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`\\n\\nThe  │ │ │\n",
+       "    │ │ │        │ following JSON is invalid:\\n- `<string name='foo' format='two-words lower-case' />` =>     │ │ │\n",
+       "    │ │ │        │ `{'foo': 'example one'}`\\n- `<list name='bar'><string format='upper-case' /></list>` =>    │ │ │\n",
+       "    │ │ │        │ `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `<object name='baz'><string             │ │ │\n",
+       "    │ │ │        │ name=\\\"foo\\\" format=\\\"capitalize two-words\\\" /><integer name=\\\"index\\\"                     │ │ │\n",
+       "    │ │ │        │ format=\\\"1-indexed\\\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`\\n\\nThe  │ │ │\n",
+       "    │ │ │        │ following XML is valid:\\n- `<string name='foo' format='two-words lower-case' />` =>        │ │ │\n",
+       "    │ │ │        │ `{'foo': 'example one'}`\\n- `<list name='bar'><string format='upper-case' /></list>` =>    │ │ │\n",
+       "    │ │ │        │ `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `<object name='baz'><string             │ │ │\n",
+       "    │ │ │        │ name=\\\"foo\\\" format=\\\"capitalize two-words\\\" /><integer name=\\\"index\\\"                     │ │ │\n",
+       "    │ │ │        │ format=\\\"1-indexed\\\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`\\n\\nThe  │ │ │\n",
+       "    │ │ │        │ following JSON is valid:\\n- `<string name='foo' format='two-words lower-case' />` =>       │ │ │\n",
+       "    │ │ │        │ `{'foo': 'example one'}`\\n- `<list name='bar'><string format='upper-case' /></list>` =>    │ │ │\n",
+       "    │ │ │        │ `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `<object name='baz'><string             │ │ │\n",
+       "    │ │ │        │ name=\\\"foo\\\" format=\\\"capitalize two-words\\\" /><integer name=\\\"index\\\"                     │ │ │\n",
+       "    │ │ │        │ format=\\\"1-indexed\\\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`\\n\\nThe  │ │ │\n",
+       "    │ │ │        │ following XML is valid:\\n- `<string name='foo' format='two-words lower-case' />` =>        │ │ │\n",
+       "    │ │ │        │ `{'foo': 'example one'}`\\n- `<list\"                                                        │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Help me correct this by making it valid JSON.                                              │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Given below is XML that describes the information to extract from this document and the    │ │ │\n",
+       "    │ │ │        │ tags to extract it into.                                                                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ <output>                                                                                   │ │ │\n",
+       "    │ │ │        │   <string description=\"Faithful summary of the text\" format=\"guardrails/reading_time: 3.0; │ │ │\n",
+       "    │ │ │        │ guardrails/valid_length: 100 1000; guardrails/similar_to_document: 'The Humorous Story an  │ │ │\n",
+       "    │ │ │        │ American Development.— ItsDifference from Comic and Witty Stories.DO not claim that I can  │ │ │\n",
+       "    │ │ │        │ tell a story as it ought tobe told. I only claim to know how a storyought to be told, for  │ │ │\n",
+       "    │ │ │        │ I have been almost daily in thecompany of the most expert story-tellers for                │ │ │\n",
+       "    │ │ │        │ manyyears.There are several kinds of stories, but only onedifficult kind —the humorous. I  │ │ │\n",
+       "    │ │ │        │ will talk mainlyabout that one. The humorous story is American,the comic story is English, │ │ │\n",
+       "    │ │ │        │ the witty story is French.The humorous story depends for its effect upon themanner of the  │ │ │\n",
+       "    │ │ │        │ telling; the comic story and the wittystory upon the matter.The humorous story may be spun │ │ │\n",
+       "    │ │ │        │ out to greatlength, and may wander around as much as itpleases, and arrive nowhere in      │ │ │\n",
+       "    │ │ │        │ particular; but thecomic and witty stories must be brief and end witha point. The humorous │ │ │\n",
+       "    │ │ │        │ story bubbles gently along,the others burst.The humorous story is strictly a work of art   │ │ │\n",
+       "    │ │ │        │ —high and delicate art — and only an artist can tell it;but no art is necessary in telling │ │ │\n",
+       "    │ │ │        │ the comic and thewitty story; anybody can do it. The art of tellinga humorous story —      │ │ │\n",
+       "    │ │ │        │ understand, I mean by word ofmouth, not print — was created in America, andhas remained at │ │ │\n",
+       "    │ │ │        │ home.The humorous story is told gravely; the tellerdoes his best to conceal the fact that  │ │ │\n",
+       "    │ │ │        │ he even dimlysuspects that there is anything funny about it; butthe teller of the comic    │ │ │\n",
+       "    │ │ │        │ story tells you beforehandthat it is one of the funniest things he has everheard, then     │ │ │\n",
+       "    │ │ │        │ tells it with eager delight, and is thefirst person to laugh when he gets through.         │ │ │\n",
+       "    │ │ │        │ Andsometimes, if he has had good success, he is so gladand happy that he will repeat the   │ │ │\n",
+       "    │ │ │        │ ‘‘ nub’’ of it andslance around from face to face, collecting applause,and then repeat it  │ │ │\n",
+       "    │ │ │        │ again. It is a pathetic thing tosee.Very often, of course, the rambling and                │ │ │\n",
+       "    │ │ │        │ disjointedhumorous story finishes with a nub, point, snapper,or whatever you like to call  │ │ │\n",
+       "    │ │ │        │ it. Then the listenermust be alert, for in many cases the teller will divertattention from │ │ │\n",
+       "    │ │ │        │ that nub by dropping it in a carefully.casual and indifferent way, with the pretence that  │ │ │\n",
+       "    │ │ │        │ hedoes not know it is a nub.Artemus Ward used that trick a good deal; thenwhen the belated │ │ │\n",
+       "    │ │ │        │ audience presently caught the jokehe would look up with innocent surprise, as ifwondering  │ │ │\n",
+       "    │ │ │        │ what they had found to laugh at. DanSetchell used it before him, Nye and Riley andothers   │ │ │\n",
+       "    │ │ │        │ use it to-day.But the teller of the comic story does not slurthe nub; he shouts it at      │ │ │\n",
+       "    │ │ │        │ you—every time. Andwhen he prints it, in England, France, Germany,and Italy, he italicizes │ │ │\n",
+       "    │ │ │        │ it, puts some whoopingexclamation-points after it, and sometimes explainsit in a           │ │ │\n",
+       "    │ │ │        │ parenthesis. All of which is very depressing,and makes one want to renounce joking and     │ │ │\n",
+       "    │ │ │        │ lead abetter life.- Mark Twain' 0.6 all-MiniLM-L6-v2\" name=\"summary\"                       │ │ │\n",
+       "    │ │ │        │ required=\"true\"></string>                                                                  │ │ │\n",
+       "    │ │ │        │ </output>                                                                                  │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ONLY return a valid JSON object (no other text is necessary), where the key of the field   │ │ │\n",
+       "    │ │ │        │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type     │ │ │\n",
+       "    │ │ │        │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format,         │ │ │\n",
+       "    │ │ │        │ including any types and format requests e.g. requests for lists, objects and specific      │ │ │\n",
+       "    │ │ │        │ types. Be correct and concise. If you are unsure anywhere, enter `null`.                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
-       "    │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:                          │ │\n",
-       "    │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`\\n- `<list           │ │\n",
-       "    │ │ name='bar'><string format='upper-case' /></list>` => `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- │ │\n",
-       "    │ │ `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"            │ │\n",
-       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`\\n\\nThe following XML   │ │\n",
-       "    │ │ is invalid:\\n- `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`\\n-     │ │\n",
-       "    │ │ `<list name='bar'><string format='upper-case' /></list>` => `{\\\"bar\\\": ['STRING ONE', 'STRING TWO',     │ │\n",
-       "    │ │ etc.]}`\\n- `<object name='baz'><string name=\\\"foo\\\" format=\\\"capitalize two-words\\\" /><integer          │ │\n",
-       "    │ │ name=\\\"index\\\" format=\\\"1-indexed\\\" /></object>` => `{'baz': {'foo': 'Some String', 'index':            │ │\n",
-       "    │ │ 1}}`\\n\\nThe following JSON is invalid:\\n- `<string name='foo' format='two-words lower-case' />` =>      │ │\n",
-       "    │ │ `{'foo': 'example one'}`\\n- `<list name='bar'><string format='upper-case' /></list>` => `{\\\"bar\\\":      │ │\n",
-       "    │ │ ['STRING ONE', 'STRING TWO', etc.]}`\\n- `<object name='baz'><string name=\\\"foo\\\" format=\\\"capitalize    │ │\n",
-       "    │ │ two-words\\\" /><integer name=\\\"index\\\" format=\\\"1-indexed\\\" /></object>` => `{'baz': {'foo': 'Some       │ │\n",
-       "    │ │ String', 'index': 1}}`\\n\\nThe following XML is valid:\\n- `<string name='foo' format='two-words          │ │\n",
-       "    │ │ lower-case' />` => `{'foo': 'example one'}`\\n- `<list name='bar'><string format='upper-case' /></list>` │ │\n",
-       "    │ │ => `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `<object name='baz'><string name=\\\"foo\\\"          │ │\n",
-       "    │ │ format=\\\"capitalize two-words\\\" /><integer name=\\\"index\\\" format=\\\"1-indexed\\\" /></object>` => `{'baz': │ │\n",
-       "    │ │ {'foo': 'Some String', 'index': 1}}`\\n\\nThe following                                                   │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` =>                                                                      │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ None                                                                                                    │ │\n",
@@ -882,10 +908,7 @@
       "text/plain": [
        "Logs\n",
        "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "│   │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "│   │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "│   │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "│   │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
        "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "│   │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
@@ -1058,114 +1081,126 @@
        "│   │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mI was given the following response, which was not parseable as JSON.\u001b[0m\u001b[48;2;240;248;255m                                   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\"The following XML is invalid:\\n- `` => `{'foo': \u001b[0m\u001b[48;2;240;248;255m   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m'example one'}`\\n- `` => `{\\\"bar\\\": ['STRING \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mONE', 'STRING TWO', etc.]}`\\n- `` => `{'baz': {'foo': 'Some String', 'index':\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m1}}`\\n\\nThe following JSON is invalid:\\n- `` => \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m`{'foo': 'example one'}`\\n- `` => `{\\\"bar\\\": \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m['STRING ONE', 'STRING TWO', etc.]}`\\n- `` => `{'baz': {'foo': 'Some \u001b[0m\u001b[48;2;240;248;255m     \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mString', 'index': 1}}`\\n\\nThe following XML is valid:\\n- `` => `{'foo': 'example one'}`\\n- ``\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m=> `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `` => `{'baz':\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m{'foo': 'Some String', 'index': 1}}`\\n\\nThe following JSON is valid:\\n- `` => `{'foo': 'example one'}`\\n- `` => `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\\n\\nThe following XML\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mis valid:\\n- `` => `{'foo': 'example one'}`\\n- \u001b[0m\u001b[48;2;240;248;255m     \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m`\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m`name` attribute of the corresponding XML, and the value is of the type specified by the corresponding \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mXML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mrequests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, \u001b[0m\u001b[48;2;240;248;255m   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255menter `null`.\u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m╭─\u001b[0m\u001b[48;2;255;240;242m────────────────────────────────────────────\u001b[0m\u001b[48;2;255;240;242m Instructions \u001b[0m\u001b[48;2;255;240;242m─────────────────────────────────────────────\u001b[0m\u001b[48;2;255;240;242m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mYou are a helpful assistant only capable of communicating with valid JSON, and no other text.\u001b[0m\u001b[48;2;255;240;242m          \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m`name` attribute of the corresponding XML, and the value is of the type specified by the corresponding \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mXML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. \u001b[0m\u001b[48;2;255;240;242m      \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mrequests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, \u001b[0m\u001b[48;2;255;240;242m   \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242menter `null`.\u001b[0m\u001b[48;2;255;240;242m                                                                                          \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242mHere are examples of simple (XML, JSON) pairs that show the expected behavior:\u001b[0m\u001b[48;2;255;240;242m                         \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m- `` => `{'foo': 'example one'}`\u001b[0m\u001b[48;2;255;240;242m                    \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m- `` => `{\"bar\": ['STRING ONE', 'STRING TWO', \u001b[0m\u001b[48;2;255;240;242m   \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242metc.]}`\u001b[0m\u001b[48;2;255;240;242m                                                                                                \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;255;240;242m                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m│\u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m                                                                                                       \u001b[0m\u001b[48;2;255;240;242m \u001b[0m\u001b[48;2;255;240;242m│\u001b[0m │\n",
-       "    │ \u001b[48;2;255;240;242m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235m  Role\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                   \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235msystem\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYou are a helpful assistant only capable of communicating with valid JSON, and no other   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtext.                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235min JSON is the `name` attribute of the corresponding XML, and the value is of the type    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format,        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluding any types and format requests e.g. requests for lists, objects and specific     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtypes. Be correct and concise. If you are unsure anywhere, enter `null`.                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior:            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}`       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE',     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}`                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index':  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}`                                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m  user\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mI was given the following response, which was not parseable as JSON.                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m\"The following XML is invalid:\\n- `` =>\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m`{'foo': 'example one'}`\\n- `` =>   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m`{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\\n\\nThe \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mfollowing JSON is invalid:\\n- `` =>    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m`{'foo': 'example one'}`\\n- `` =>   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m`{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\\n\\nThe \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mfollowing XML is valid:\\n- `` =>       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m`{'foo': 'example one'}`\\n- `` =>   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m`{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\\n\\nThe \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mfollowing JSON is valid:\\n- `` =>      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m`{'foo': 'example one'}`\\n- `` =>   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m`{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\\n\\nThe \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mfollowing XML is valid:\\n- `` =>       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m`{'foo': 'example one'}`\\n- `                                                                                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                 \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235min JSON is the `name` attribute of the corresponding XML, and the value is of the type    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format,        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluding any types and format requests e.g. requests for lists, objects and specific     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtypes. Be correct and concise. If you are unsure anywhere, enter `null`.                  \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m        \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└────────┴────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mHere are examples of simple (XML, JSON) pairs that show the expected behavior:\u001b[0m\u001b[48;2;245;245;220m                         \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'foo': 'example one'}`\\n- `` => `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n-\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m`` => `{'baz': {'foo': 'Some String', 'index': 1}}`\\n\\nThe following XML \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mis invalid:\\n- `` => `{'foo': 'example one'}`\\n- \u001b[0m\u001b[48;2;245;245;220m   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m`` => `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', \u001b[0m\u001b[48;2;245;245;220m   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220metc.]}`\\n- `` => `{'baz': {'foo': 'Some String', 'index': \u001b[0m\u001b[48;2;245;245;220m          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m1}}`\\n\\nThe following JSON is invalid:\\n- `` => \u001b[0m\u001b[48;2;245;245;220m    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m`{'foo': 'example one'}`\\n- `` => `{\\\"bar\\\": \u001b[0m\u001b[48;2;245;245;220m    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m['STRING ONE', 'STRING TWO', etc.]}`\\n- `` => `{'baz': {'foo': 'Some \u001b[0m\u001b[48;2;245;245;220m     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mString', 'index': 1}}`\\n\\nThe following XML is valid:\\n- `` => `{'foo': 'example one'}`\\n- ``\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m=> `{\\\"bar\\\": ['STRING ONE', 'STRING TWO', etc.]}`\\n- `` => `{'baz':\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{'foo': 'Some String', 'index': 1}}`\\n\\nThe following\u001b[0m\u001b[48;2;245;245;220m                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` =>\u001b[0m\u001b[48;2;245;245;220m                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mNone\u001b[0m\u001b[48;2;240;255;240m                                                                                                   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
@@ -1173,7 +1208,7 @@
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n"
       ]
      },
-     "execution_count": 8,
+     "execution_count": 9,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1185,7 +1220,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -1199,7 +1234,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.11.7"
+   "version": "3.12.3"
   }
  },
  "nbformat": 4,
diff --git a/docs/examples/syntax_error_free_sql.ipynb b/docs/examples/syntax_error_free_sql.ipynb
index 4cf763b78..716ae7bbb 100644
--- a/docs/examples/syntax_error_free_sql.ipynb
+++ b/docs/examples/syntax_error_free_sql.ipynb
@@ -45,17 +45,7 @@
    "cell_type": "code",
    "execution_count": 2,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "\n",
-      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.2\u001b[0m\n",
-      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "! pip install sqlvalidator -q"
    ]
@@ -99,15 +89,16 @@
     "    />\n",
     "\n",
     "\n",
-    "\n",
-    "\n",
+    "\n",
+    "\n",
     "\n",
     "Generate a valid SQL query for the following natural language instruction:\n",
     "\n",
     "${nl_instruction}\n",
     "\n",
     "${gr.complete_xml_suffix}\n",
-    "\n",
+    "\n",
+    "\n",
     "\n",
     "\n",
     "\n",
@@ -130,7 +121,7 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/Users/dtam/.pyenv/versions/3.12.1/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:11: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
+      "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
       "  from tqdm.autonotebook import tqdm, trange\n"
      ]
     }
@@ -235,16 +226,25 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 10,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    }
+   ],
    "source": [
     "# Set your OPENAI_API_KEY as an environment variable\n",
     "# import os\n",
     "# os.environ[\"OPENAI_API_KEY\"] = \"YOUR_API_KEY\"\n",
     "\n",
     "raw_llm_response, validated_response, *rest = guard(\n",
-    "    model=\"gpt-4o\",\n",
+    "    model=\"gpt-4o-mini\",\n",
     "    messages=[{\"role\":\"user\", \"content\": prompt}],\n",
     "    prompt_params={\n",
     "        \"nl_instruction\": \"Select the name of the employee who has the highest salary.\"\n",
@@ -264,7 +264,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [
     {
@@ -332,7 +332,7 @@
     }
    ],
    "source": [
-    "print(guard.history.last.iterations.last.inputs.msg_history[0][\"content\"])"
+    "print(guard.history.last.iterations.last.inputs.messages[0][\"content\"])"
    ]
   },
   {
@@ -346,7 +346,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [
     {
@@ -369,7 +369,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [
     {
@@ -377,10 +377,7 @@
       "text/html": [
        "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
        "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
        "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
        "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
@@ -418,9 +415,7 @@
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ ```json                                                                                                 │ │\n",
-       "    │ │ {                                                                                                       │ │\n",
-       "    │ │   \"generated_sql\": \"SELECT name FROM employees ORDER BY salary DESC LIMIT 1;\"                           │ │\n",
-       "    │ │ }                                                                                                       │ │\n",
+       "    │ │ {\"generated_sql\":\"SELECT name FROM employees ORDER BY salary DESC LIMIT 1;\"}                            │ │\n",
        "    │ │ ```                                                                                                     │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
@@ -432,10 +427,7 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
@@ -473,9 +465,7 @@
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```json\u001b[0m\u001b[48;2;245;245;220m                                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"generated_sql\": \"SELECT name FROM employees ORDER BY salary DESC LIMIT 1;\"\u001b[0m\u001b[48;2;245;245;220m                          \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\"generated_sql\":\"SELECT name FROM employees ORDER BY salary DESC LIMIT 1;\"}\u001b[0m\u001b[48;2;245;245;220m                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```\u001b[0m\u001b[48;2;245;245;220m                                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
@@ -495,7 +485,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "tiff-env",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
@@ -509,14 +499,9 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.1"
+   "version": "3.12.3"
   },
-  "orig_nbformat": 4,
-  "vscode": {
-   "interpreter": {
-    "hash": "ef14f49bbc779f2fde64ca0552c2a99d578405052f5b73f61279551da311a8a1"
-   }
-  }
+  "orig_nbformat": 4
  },
  "nbformat": 4,
  "nbformat_minor": 2
diff --git a/docs/examples/text_summarization_quality.ipynb b/docs/examples/text_summarization_quality.ipynb
index 38b4bd8f4..7480d350b 100644
--- a/docs/examples/text_summarization_quality.ipynb
+++ b/docs/examples/text_summarization_quality.ipynb
@@ -2,9 +2,20 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 1,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Installing hub:\u001b[35m/\u001b[0m\u001b[35m/guardrails/\u001b[0m\u001b[95msimilar_to_document...\u001b[0m\n",
+      "✅Successfully installed guardrails/similar_to_document!\n",
+      "\n",
+      "\n"
+     ]
+    }
+   ],
    "source": [
     "!guardrails hub install hub://guardrails/similar_to_document --quiet"
    ]
@@ -33,7 +44,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -63,7 +74,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -82,7 +93,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -100,14 +111,15 @@
     "        on-fail-similar-to-document=\"filter\" \n",
     "    />\n",
     "\n",
-    "\n",
-    "\n",
+    "\n",
+    "\n",
     "Summarize the following document:\n",
     "\n",
     "${document}\n",
     "\n",
     "${gr.complete_xml_suffix}\n",
-    "\n",
+    "\n",
+    "\n",
     "\n",
     "\"\"\"\n",
     ").safe_substitute(document=document)"
@@ -122,9 +134,25 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 6,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
+      "  from tqdm.autonotebook import tqdm, trange\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Loading the model all-MiniLM-L6-v2. This may take a while...\n"
+     ]
+    }
+   ],
    "source": [
     "from pydantic import BaseModel, Field\n",
     "\n",
@@ -175,7 +203,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -193,7 +221,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -209,7 +237,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -239,9 +267,72 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 10,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Similarity: 0.987, Type: \n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "
Validated Output: {'summary': 'Section 1: All legislative Powers herein granted shall be vested in a Congress of \n",
+       "the United States, which shall consist of a Senate and House of Representatives. Section 2: The House of \n",
+       "Representatives shall be composed of Members chosen every second Year by the People of the several States, and the \n",
+       "Electors in each State shall have the Qualifications requisite for Electors of the most numerous Branch of the \n",
+       "State Legislature. No Person shall be a Representative who shall not have attained to the Age of twenty five Years,\n",
+       "and been seven Years a Citizen of the United States, and who shall not, when elected, be an Inhabitant of that \n",
+       "State in which he shall be chosen. Representatives and direct Taxes shall be apportioned among the several States \n",
+       "which may be included within this Union, according to their respective Numbers, which shall be determined by adding\n",
+       "to the whole Number of free Persons, including those bound to Service for a Term of Years, and excluding Indians \n",
+       "not taxed, three fifths of all other Persons. The actual Enumeration shall be made within three Years after the \n",
+       "first Meeting of the Congress of the United States, and within every subsequent Term of ten Years, in such Manner \n",
+       "as they shall by Law direct. The Number of Representatives shall not exceed one for every thirty Thousand, but each\n",
+       "State shall have at Least one Representative; and until such enumeration shall be made, the State of New Hampshire \n",
+       "shall be entitled to chuse three, Massachusetts eight, Rhode-Island and Providence Plantations one, Connecticut \n",
+       "five, New-York six, New Jersey four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina \n",
+       "five, South Carolina five, and Georgia three. When vacancies happen in the Representation from any State, the \n",
+       "Executive Authority thereof shall issue Writs of Election to fill such Vacancies. The House of Representatives \n",
+       "shall chuse their Speaker and other Officers; and shall have the sole Power of Impeachment.'}\n",
+       "
\n" + ], + "text/plain": [ + "Validated Output: \u001b[1m{\u001b[0m\u001b[32m'summary'\u001b[0m: \u001b[32m'Section 1: All legislative Powers herein granted shall be vested in a Congress of \u001b[0m\n", + "\u001b[32mthe United States, which shall consist of a Senate and House of Representatives. Section 2: The House of \u001b[0m\n", + "\u001b[32mRepresentatives shall be composed of Members chosen every second Year by the People of the several States, and the \u001b[0m\n", + "\u001b[32mElectors in each State shall have the Qualifications requisite for Electors of the most numerous Branch of the \u001b[0m\n", + "\u001b[32mState Legislature. No Person shall be a Representative who shall not have attained to the Age of twenty five Years,\u001b[0m\n", + "\u001b[32mand been seven Years a Citizen of the United States, and who shall not, when elected, be an Inhabitant of that \u001b[0m\n", + "\u001b[32mState in which he shall be chosen. Representatives and direct Taxes shall be apportioned among the several States \u001b[0m\n", + "\u001b[32mwhich may be included within this Union, according to their respective Numbers, which shall be determined by adding\u001b[0m\n", + "\u001b[32mto the whole Number of free Persons, including those bound to Service for a Term of Years, and excluding Indians \u001b[0m\n", + "\u001b[32mnot taxed, three fifths of all other Persons. The actual Enumeration shall be made within three Years after the \u001b[0m\n", + "\u001b[32mfirst Meeting of the Congress of the United States, and within every subsequent Term of ten Years, in such Manner \u001b[0m\n", + "\u001b[32mas they shall by Law direct. The Number of Representatives shall not exceed one for every thirty Thousand, but each\u001b[0m\n", + "\u001b[32mState shall have at Least one Representative; and until such enumeration shall be made, the State of New Hampshire \u001b[0m\n", + "\u001b[32mshall be entitled to chuse three, Massachusetts eight, Rhode-Island and Providence Plantations one, Connecticut \u001b[0m\n", + "\u001b[32mfive, New-York six, New Jersey four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina \u001b[0m\n", + "\u001b[32mfive, South Carolina five, and Georgia three. When vacancies happen in the Representation from any State, the \u001b[0m\n", + "\u001b[32mExecutive Authority thereof shall issue Writs of Election to fill such Vacancies. The House of Representatives \u001b[0m\n", + "\u001b[32mshall chuse their Speaker and other Officers; and shall have the sole Power of Impeachment.'\u001b[0m\u001b[1m}\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Set your OPENAI_API_KEY as an environment variable\n", "# import os\n", @@ -267,11 +358,165 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n",
+       "Summarize the following document:\n",
+       "\n",
+       "Section. 1.\n",
+       "All legislative Powers herein granted shall be vested in a Congress of the United States, which shall consist of a \n",
+       "Senate and House of Representatives.\n",
+       "\n",
+       "Section. 2.\n",
+       "The House of Representatives shall be composed of Members chosen every second Year by the People of the several \n",
+       "States, and the Electors in each State shall have the Qualifications requisite for Electors of the most numerous \n",
+       "Branch of the State Legislature.\n",
+       "\n",
+       "No Person shall be a Representative who shall not have attained to the Age of twenty five Years, and been seven \n",
+       "Years a Citizen of the United States, and who shall not, when elected, be an Inhabitant of that State in which he \n",
+       "shall be chosen.\n",
+       "\n",
+       "Representatives and direct Taxes shall be apportioned among the several States which may be included within this \n",
+       "Union, according to their respective Numbers, which shall be determined by adding to the whole Number of free \n",
+       "Persons, including those bound to Service for a Term of Years, and excluding Indians not taxed, three fifths of all\n",
+       "other Persons. The actual Enumeration shall be made within three Years after the first Meeting of the Congress of \n",
+       "the United States, and within every subsequent Term of ten Years, in such Manner as they shall by Law direct. The \n",
+       "Number of Representatives shall not exceed one for every thirty Thousand, but each State shall have at Least one \n",
+       "Representative; and until such enumeration shall be made, the State of New Hampshire shall be entitled to chuse \n",
+       "three, Massachusetts eight, Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New Jersey\n",
+       "four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and \n",
+       "Georgia three.\n",
+       "\n",
+       "When vacancies happen in the Representation from any State, the Executive Authority thereof shall issue Writs of \n",
+       "Election to fill such Vacancies.\n",
+       "\n",
+       "The House of Representatives shall chuse their Speaker and other Officers; and shall have the sole Power of \n",
+       "Impeachment.\n",
+       "\n",
+       "\n",
+       "Given below is XML that describes the information to extract from this document and the tags to extract it into.\n",
+       "\n",
+       "<output>\n",
+       "  <string description=\"Summarize the given document faithfully.\" format=\"guardrails/similar_to_document: 'Section. \n",
+       "1.All legislative Powers herein granted shall be vested in a Congress of the United States, which shall consist of \n",
+       "a Senate and House of Representatives.Section. 2.The House of Representatives shall be composed of Members chosen \n",
+       "every second Year by the People of the several States, and the Electors in each State shall have the Qualifications\n",
+       "requisite for Electors of the most numerous Branch of the State Legislature.No Person shall be a Representative who\n",
+       "shall not have attained to the Age of twenty five Years, and been seven Years a Citizen of the United States, and \n",
+       "who shall not, when elected, be an Inhabitant of that State in which he shall be chosen.Representatives and direct \n",
+       "Taxes shall be apportioned among the several States which may be included within this Union, according to their \n",
+       "respective Numbers, which shall be determined by adding to the whole Number of free Persons, including those bound \n",
+       "to Service for a Term of Years, and excluding Indians not taxed, three fifths of all other Persons. The actual \n",
+       "Enumeration shall be made within three Years after the first Meeting of the Congress of the United States, and \n",
+       "within every subsequent Term of ten Years, in such Manner as they shall by Law direct. The Number of \n",
+       "Representatives shall not exceed one for every thirty Thousand, but each State shall have at Least one \n",
+       "Representative; and until such enumeration shall be made, the State of New Hampshire shall be entitled to chuse \n",
+       "three, Massachusetts eight, Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New Jersey\n",
+       "four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and \n",
+       "Georgia three.When vacancies happen in the Representation from any State, the Executive Authority thereof shall \n",
+       "issue Writs of Election to fill such Vacancies.The House of Representatives shall chuse their Speaker and other \n",
+       "Officers; and shall have the sole Power of Impeachment.' 0.6 all-MiniLM-L6-v2\" name=\"summary\" \n",
+       "required=\"true\"></string>\n",
+       "</output>\n",
+       "\n",
+       "ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name` \n",
+       "attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON\n",
+       "MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and \n",
+       "specific types. Be correct and concise. If you are unsure anywhere, enter `null`.\n",
+       "\n",
+       "Here are examples of simple (XML, JSON) pairs that show the expected behavior:\n",
+       "- `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`\n",
+       "- `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`\n",
+       "- `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" format=\"1-indexed\" \n",
+       "/></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`\n",
+       "\n",
+       "\n",
+       "
\n" + ], + "text/plain": [ + "\n", + "Summarize the following document:\n", + "\n", + "Section. \u001b[1;36m1\u001b[0m.\n", + "All legislative Powers herein granted shall be vested in a Congress of the United States, which shall consist of a \n", + "Senate and House of Representatives.\n", + "\n", + "Section. \u001b[1;36m2\u001b[0m.\n", + "The House of Representatives shall be composed of Members chosen every second Year by the People of the several \n", + "States, and the Electors in each State shall have the Qualifications requisite for Electors of the most numerous \n", + "Branch of the State Legislature.\n", + "\n", + "No Person shall be a Representative who shall not have attained to the Age of twenty five Years, and been seven \n", + "Years a Citizen of the United States, and who shall not, when elected, be an Inhabitant of that State in which he \n", + "shall be chosen.\n", + "\n", + "Representatives and direct Taxes shall be apportioned among the several States which may be included within this \n", + "Union, according to their respective Numbers, which shall be determined by adding to the whole Number of free \n", + "Persons, including those bound to Service for a Term of Years, and excluding Indians not taxed, three fifths of all\n", + "other Persons. The actual Enumeration shall be made within three Years after the first Meeting of the Congress of \n", + "the United States, and within every subsequent Term of ten Years, in such Manner as they shall by Law direct. The \n", + "Number of Representatives shall not exceed one for every thirty Thousand, but each State shall have at Least one \n", + "Representative; and until such enumeration shall be made, the State of New Hampshire shall be entitled to chuse \n", + "three, Massachusetts eight, Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New Jersey\n", + "four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and \n", + "Georgia three.\n", + "\n", + "When vacancies happen in the Representation from any State, the Executive Authority thereof shall issue Writs of \n", + "Election to fill such Vacancies.\n", + "\n", + "The House of Representatives shall chuse their Speaker and other Officers; and shall have the sole Power of \n", + "Impeachment.\n", + "\n", + "\n", + "Given below is XML that describes the information to extract from this document and the tags to extract it into.\n", + "\n", + "\u001b[1m<\u001b[0m\u001b[1;95moutput\u001b[0m\u001b[39m>\u001b[0m\n", + "\u001b[39m <\u001b[0m\u001b[35m/\u001b[0m\u001b[95mstring\u001b[0m\u001b[39m>\u001b[0m\n", + "\u001b[39m<\u001b[0m\u001b[35m/\u001b[0m\u001b[95moutput\u001b[0m\u001b[39m>\u001b[0m\n", + "\n", + "\u001b[39mONLY return a valid JSON object \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mno other text is necessary\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m, where the key of the field in JSON is the `name` \u001b[0m\n", + "\u001b[39mattribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON\u001b[0m\n", + "\u001b[39mMUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and \u001b[0m\n", + "\u001b[39mspecific types. Be correct and concise. If you are unsure anywhere, enter `null`.\u001b[0m\n", + "\n", + "\u001b[39mHere are examples of simple \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mXML, JSON\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m pairs that show the expected behavior:\u001b[0m\n", + "\u001b[39m- `` => `\u001b[0m\u001b[1;39m{\u001b[0m\u001b[32m'foo'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'example one'\u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m`\u001b[0m\n", + "\u001b[39m- `<\u001b[0m\u001b[35m/\u001b[0m\u001b[95mlist\u001b[0m\u001b[39m>` => `\u001b[0m\u001b[1;39m{\u001b[0m\u001b[32m\"bar\"\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[32m'STRING ONE'\u001b[0m\u001b[39m, \u001b[0m\u001b[32m'STRING TWO'\u001b[0m\u001b[39m, etc.\u001b[0m\u001b[1;39m]\u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m`\u001b[0m\n", + "\u001b[39m- `<\u001b[0m\u001b[35m/\u001b[0m\u001b[95mobject\u001b[0m\u001b[39m>` =\u001b[0m\u001b[1m>\u001b[0m `\u001b[1m{\u001b[0m\u001b[32m'baz'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'foo'\u001b[0m: \u001b[32m'Some String'\u001b[0m, \u001b[32m'index'\u001b[0m: \u001b[1;36m1\u001b[0m\u001b[1m}\u001b[0m\u001b[1m}\u001b[0m`\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "print(guard.history.last.iterations.last.inputs.msg_history[0][\"content\"])" + "print(guard.history.last.iterations.last.inputs.messages[0][\"content\"])" ] }, { @@ -284,9 +529,299 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
Logs\n",
+       "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
+       "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ user │                                                                                              │ │ │\n",
+       "    │ │ │      │ Summarize the following document:                                                            │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Section. 1.                                                                                  │ │ │\n",
+       "    │ │ │      │ All legislative Powers herein granted shall be vested in a Congress of the United States,    │ │ │\n",
+       "    │ │ │      │ which shall consist of a Senate and House of Representatives.                                │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Section. 2.                                                                                  │ │ │\n",
+       "    │ │ │      │ The House of Representatives shall be composed of Members chosen every second Year by the    │ │ │\n",
+       "    │ │ │      │ People of the several States, and the Electors in each State shall have the Qualifications   │ │ │\n",
+       "    │ │ │      │ requisite for Electors of the most numerous Branch of the State Legislature.                 │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ No Person shall be a Representative who shall not have attained to the Age of twenty five    │ │ │\n",
+       "    │ │ │      │ Years, and been seven Years a Citizen of the United States, and who shall not, when elected, │ │ │\n",
+       "    │ │ │      │ be an Inhabitant of that State in which he shall be chosen.                                  │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Representatives and direct Taxes shall be apportioned among the several States which may be  │ │ │\n",
+       "    │ │ │      │ included within this Union, according to their respective Numbers, which shall be determined │ │ │\n",
+       "    │ │ │      │ by adding to the whole Number of free Persons, including those bound to Service for a Term   │ │ │\n",
+       "    │ │ │      │ of Years, and excluding Indians not taxed, three fifths of all other Persons. The actual     │ │ │\n",
+       "    │ │ │      │ Enumeration shall be made within three Years after the first Meeting of the Congress of the  │ │ │\n",
+       "    │ │ │      │ United States, and within every subsequent Term of ten Years, in such Manner as they shall   │ │ │\n",
+       "    │ │ │      │ by Law direct. The Number of Representatives shall not exceed one for every thirty Thousand, │ │ │\n",
+       "    │ │ │      │ but each State shall have at Least one Representative; and until such enumeration shall be   │ │ │\n",
+       "    │ │ │      │ made, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight,      │ │ │\n",
+       "    │ │ │      │ Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New Jersey      │ │ │\n",
+       "    │ │ │      │ four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina five,     │ │ │\n",
+       "    │ │ │      │ South Carolina five, and Georgia three.                                                      │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ When vacancies happen in the Representation from any State, the Executive Authority thereof  │ │ │\n",
+       "    │ │ │      │ shall issue Writs of Election to fill such Vacancies.                                        │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ The House of Representatives shall chuse their Speaker and other Officers; and shall have    │ │ │\n",
+       "    │ │ │      │ the sole Power of Impeachment.                                                               │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Given below is XML that describes the information to extract from this document and the tags │ │ │\n",
+       "    │ │ │      │ to extract it into.                                                                          │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ <output>                                                                                     │ │ │\n",
+       "    │ │ │      │   <string description=\"Summarize the given document faithfully.\"                             │ │ │\n",
+       "    │ │ │      │ format=\"guardrails/similar_to_document: 'Section. 1.All legislative Powers herein granted    │ │ │\n",
+       "    │ │ │      │ shall be vested in a Congress of the United States, which shall consist of a Senate and      │ │ │\n",
+       "    │ │ │      │ House of Representatives.Section. 2.The House of Representatives shall be composed of        │ │ │\n",
+       "    │ │ │      │ Members chosen every second Year by the People of the several States, and the Electors in    │ │ │\n",
+       "    │ │ │      │ each State shall have the Qualifications requisite for Electors of the most numerous Branch  │ │ │\n",
+       "    │ │ │      │ of the State Legislature.No Person shall be a Representative who shall not have attained to  │ │ │\n",
+       "    │ │ │      │ the Age of twenty five Years, and been seven Years a Citizen of the United States, and who   │ │ │\n",
+       "    │ │ │      │ shall not, when elected, be an Inhabitant of that State in which he shall be                 │ │ │\n",
+       "    │ │ │      │ chosen.Representatives and direct Taxes shall be apportioned among the several States which  │ │ │\n",
+       "    │ │ │      │ may be included within this Union, according to their respective Numbers, which shall be     │ │ │\n",
+       "    │ │ │      │ determined by adding to the whole Number of free Persons, including those bound to Service   │ │ │\n",
+       "    │ │ │      │ for a Term of Years, and excluding Indians not taxed, three fifths of all other Persons. The │ │ │\n",
+       "    │ │ │      │ actual Enumeration shall be made within three Years after the first Meeting of the Congress  │ │ │\n",
+       "    │ │ │      │ of the United States, and within every subsequent Term of ten Years, in such Manner as they  │ │ │\n",
+       "    │ │ │      │ shall by Law direct. The Number of Representatives shall not exceed one for every thirty     │ │ │\n",
+       "    │ │ │      │ Thousand, but each State shall have at Least one Representative; and until such enumeration  │ │ │\n",
+       "    │ │ │      │ shall be made, the State of New Hampshire shall be entitled to chuse three, Massachusetts    │ │ │\n",
+       "    │ │ │      │ eight, Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New      │ │ │\n",
+       "    │ │ │      │ Jersey four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina    │ │ │\n",
+       "    │ │ │      │ five, South Carolina five, and Georgia three.When vacancies happen in the Representation     │ │ │\n",
+       "    │ │ │      │ from any State, the Executive Authority thereof shall issue Writs of Election to fill such   │ │ │\n",
+       "    │ │ │      │ Vacancies.The House of Representatives shall chuse their Speaker and other Officers; and     │ │ │\n",
+       "    │ │ │      │ shall have the sole Power of Impeachment.' 0.6 all-MiniLM-L6-v2\" name=\"summary\"              │ │ │\n",
+       "    │ │ │      │ required=\"true\"></string>                                                                    │ │ │\n",
+       "    │ │ │      │ </output>                                                                                    │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in  │ │ │\n",
+       "    │ │ │      │ JSON is the `name` attribute of the corresponding XML, and the value is of the type          │ │ │\n",
+       "    │ │ │      │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │ │\n",
+       "    │ │ │      │ any types and format requests e.g. requests for lists, objects and specific types. Be        │ │ │\n",
+       "    │ │ │      │ correct and concise. If you are unsure anywhere, enter `null`.                               │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:               │ │ │\n",
+       "    │ │ │      │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`          │ │ │\n",
+       "    │ │ │      │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',        │ │ │\n",
+       "    │ │ │      │ 'STRING TWO', etc.]}`                                                                        │ │ │\n",
+       "    │ │ │      │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer            │ │ │\n",
+       "    │ │ │      │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':     │ │ │\n",
+       "    │ │ │      │ 1}}`                                                                                         │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ │ {                                                                                                       │ │\n",
+       "    │ │     \"summary\": \"Section 1: All legislative Powers herein granted shall be vested in a Congress of the   │ │\n",
+       "    │ │ United States, which shall consist of a Senate and House of Representatives. Section 2: The House of    │ │\n",
+       "    │ │ Representatives shall be composed of Members chosen every second Year by the People of the several      │ │\n",
+       "    │ │ States, and the Electors in each State shall have the Qualifications requisite for Electors of the most │ │\n",
+       "    │ │ numerous Branch of the State Legislature. No Person shall be a Representative who shall not have        │ │\n",
+       "    │ │ attained to the Age of twenty five Years, and been seven Years a Citizen of the United States, and who  │ │\n",
+       "    │ │ shall not, when elected, be an Inhabitant of that State in which he shall be chosen. Representatives    │ │\n",
+       "    │ │ and direct Taxes shall be apportioned among the several States which may be included within this Union, │ │\n",
+       "    │ │ according to their respective Numbers, which shall be determined by adding to the whole Number of free  │ │\n",
+       "    │ │ Persons, including those bound to Service for a Term of Years, and excluding Indians not taxed, three   │ │\n",
+       "    │ │ fifths of all other Persons. The actual Enumeration shall be made within three Years after the first    │ │\n",
+       "    │ │ Meeting of the Congress of the United States, and within every subsequent Term of ten Years, in such    │ │\n",
+       "    │ │ Manner as they shall by Law direct. The Number of Representatives shall not exceed one for every thirty │ │\n",
+       "    │ │ Thousand, but each State shall have at Least one Representative; and until such enumeration shall be    │ │\n",
+       "    │ │ made, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, Rhode-Island    │ │\n",
+       "    │ │ and Providence Plantations one, Connecticut five, New-York six, New Jersey four, Pennsylvania eight,    │ │\n",
+       "    │ │ Delaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and Georgia three.  │ │\n",
+       "    │ │ When vacancies happen in the Representation from any State, the Executive Authority thereof shall issue │ │\n",
+       "    │ │ Writs of Election to fill such Vacancies. The House of Representatives shall chuse their Speaker and    │ │\n",
+       "    │ │ other Officers; and shall have the sole Power of Impeachment.\"                                          │ │\n",
+       "    │ │ }                                                                                                       │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ │ {                                                                                                       │ │\n",
+       "    │ │     'summary': 'Section 1: All legislative Powers herein granted shall be vested in a Congress of the   │ │\n",
+       "    │ │ United States, which shall consist of a Senate and House of Representatives. Section 2: The House of    │ │\n",
+       "    │ │ Representatives shall be composed of Members chosen every second Year by the People of the several      │ │\n",
+       "    │ │ States, and the Electors in each State shall have the Qualifications requisite for Electors of the most │ │\n",
+       "    │ │ numerous Branch of the State Legislature. No Person shall be a Representative who shall not have        │ │\n",
+       "    │ │ attained to the Age of twenty five Years, and been seven Years a Citizen of the United States, and who  │ │\n",
+       "    │ │ shall not, when elected, be an Inhabitant of that State in which he shall be chosen. Representatives    │ │\n",
+       "    │ │ and direct Taxes shall be apportioned among the several States which may be included within this Union, │ │\n",
+       "    │ │ according to their respective Numbers, which shall be determined by adding to the whole Number of free  │ │\n",
+       "    │ │ Persons, including those bound to Service for a Term of Years, and excluding Indians not taxed, three   │ │\n",
+       "    │ │ fifths of all other Persons. The actual Enumeration shall be made within three Years after the first    │ │\n",
+       "    │ │ Meeting of the Congress of the United States, and within every subsequent Term of ten Years, in such    │ │\n",
+       "    │ │ Manner as they shall by Law direct. The Number of Representatives shall not exceed one for every thirty │ │\n",
+       "    │ │ Thousand, but each State shall have at Least one Representative; and until such enumeration shall be    │ │\n",
+       "    │ │ made, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, Rhode-Island    │ │\n",
+       "    │ │ and Providence Plantations one, Connecticut five, New-York six, New Jersey four, Pennsylvania eight,    │ │\n",
+       "    │ │ Delaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and Georgia three.  │ │\n",
+       "    │ │ When vacancies happen in the Representation from any State, the Executive Authority thereof shall issue │ │\n",
+       "    │ │ Writs of Election to fill such Vacancies. The House of Representatives shall chuse their Speaker and    │ │\n",
+       "    │ │ other Officers; and shall have the sole Power of Impeachment.'                                          │ │\n",
+       "    │ │ }                                                                                                       │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "
\n" + ], + "text/plain": [ + "Logs\n", + "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n", + " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mSummarize the following document: \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mSection. 1. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mAll legislative Powers herein granted shall be vested in a Congress of the United States, \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mwhich shall consist of a Senate and House of Representatives. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mSection. 2. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mThe House of Representatives shall be composed of Members chosen every second Year by the \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mPeople of the several States, and the Electors in each State shall have the Qualifications \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mrequisite for Electors of the most numerous Branch of the State Legislature. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo Person shall be a Representative who shall not have attained to the Age of twenty five \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYears, and been seven Years a Citizen of the United States, and who shall not, when elected,\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mbe an Inhabitant of that State in which he shall be chosen. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mRepresentatives and direct Taxes shall be apportioned among the several States which may be \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluded within this Union, according to their respective Numbers, which shall be determined\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mby adding to the whole Number of free Persons, including those bound to Service for a Term \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mof Years, and excluding Indians not taxed, three fifths of all other Persons. The actual \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mEnumeration shall be made within three Years after the first Meeting of the Congress of the \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mUnited States, and within every subsequent Term of ten Years, in such Manner as they shall \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mby Law direct. The Number of Representatives shall not exceed one for every thirty Thousand,\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mbut each State shall have at Least one Representative; and until such enumeration shall be \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mmade, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mRhode-Island and Providence Plantations one, Connecticut five, New-York six, New Jersey \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mfour, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina five, \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mSouth Carolina five, and Georgia three. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mWhen vacancies happen in the Representation from any State, the Executive Authority thereof \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mshall issue Writs of Election to fill such Vacancies. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mThe House of Representatives shall chuse their Speaker and other Officers; and shall have \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mthe sole Power of Impeachment. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the tags\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mto extract it into. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field in \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mJSON is the `name` attribute of the corresponding XML, and the value is of the type \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, including\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many types and format requests e.g. requests for lists, objects and specific types. Be \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcorrect and concise. If you are unsure anywhere, enter `null`. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior: \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE', \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index': \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \"summary\": \"Section 1: All legislative Powers herein granted shall be vested in a Congress of the \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mUnited States, which shall consist of a Senate and House of Representatives. Section 2: The House of \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mRepresentatives shall be composed of Members chosen every second Year by the People of the several \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mStates, and the Electors in each State shall have the Qualifications requisite for Electors of the most\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mnumerous Branch of the State Legislature. No Person shall be a Representative who shall not have \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mattained to the Age of twenty five Years, and been seven Years a Citizen of the United States, and who \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mshall not, when elected, be an Inhabitant of that State in which he shall be chosen. Representatives \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mand direct Taxes shall be apportioned among the several States which may be included within this Union,\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220maccording to their respective Numbers, which shall be determined by adding to the whole Number of free \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mPersons, including those bound to Service for a Term of Years, and excluding Indians not taxed, three \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mfifths of all other Persons. The actual Enumeration shall be made within three Years after the first \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mMeeting of the Congress of the United States, and within every subsequent Term of ten Years, in such \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mManner as they shall by Law direct. The Number of Representatives shall not exceed one for every thirty\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mThousand, but each State shall have at Least one Representative; and until such enumeration shall be \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mmade, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, Rhode-Island \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mand Providence Plantations one, Connecticut five, New-York six, New Jersey four, Pennsylvania eight, \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mDelaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and Georgia three. \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mWhen vacancies happen in the Representation from any State, the Executive Authority thereof shall issue\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mWrits of Election to fill such Vacancies. The House of Representatives shall chuse their Speaker and \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mother Officers; and shall have the sole Power of Impeachment.\"\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m 'summary': 'Section 1: All legislative Powers herein granted shall be vested in a Congress of the \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mUnited States, which shall consist of a Senate and House of Representatives. Section 2: The House of \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mRepresentatives shall be composed of Members chosen every second Year by the People of the several \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mStates, and the Electors in each State shall have the Qualifications requisite for Electors of the most\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mnumerous Branch of the State Legislature. No Person shall be a Representative who shall not have \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mattained to the Age of twenty five Years, and been seven Years a Citizen of the United States, and who \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mshall not, when elected, be an Inhabitant of that State in which he shall be chosen. Representatives \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mand direct Taxes shall be apportioned among the several States which may be included within this Union,\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240maccording to their respective Numbers, which shall be determined by adding to the whole Number of free \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mPersons, including those bound to Service for a Term of Years, and excluding Indians not taxed, three \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mfifths of all other Persons. The actual Enumeration shall be made within three Years after the first \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mMeeting of the Congress of the United States, and within every subsequent Term of ten Years, in such \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mManner as they shall by Law direct. The Number of Representatives shall not exceed one for every thirty\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mThousand, but each State shall have at Least one Representative; and until such enumeration shall be \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mmade, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, Rhode-Island \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mand Providence Plantations one, Connecticut five, New-York six, New Jersey four, Pennsylvania eight, \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mDelaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and Georgia three. \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mWhen vacancies happen in the Representation from any State, the Executive Authority thereof shall issue\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mWrits of Election to fill such Vacancies. The House of Representatives shall chuse their Speaker and \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mother Officers; and shall have the sole Power of Impeachment.'\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "print(guard.history.last.tree)" ] @@ -303,9 +838,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
Validated Output: None\n",
+       "
\n" + ], + "text/plain": [ + "Validated Output: \u001b[3;35mNone\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "raw_llm_response, validated_response, *rest = guard(\n", " messages=[{\"role\":\"user\", \"content\": prompt}],\n", @@ -328,9 +877,407 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
Logs\n",
+       "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
+       "│   │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "│   │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "│   │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
+       "│   │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "│   │ │ │ user │                                                                                              │ │ │\n",
+       "│   │ │ │      │ Summarize the following document:                                                            │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ Section. 1.                                                                                  │ │ │\n",
+       "│   │ │ │      │ All legislative Powers herein granted shall be vested in a Congress of the United States,    │ │ │\n",
+       "│   │ │ │      │ which shall consist of a Senate and House of Representatives.                                │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ Section. 2.                                                                                  │ │ │\n",
+       "│   │ │ │      │ The House of Representatives shall be composed of Members chosen every second Year by the    │ │ │\n",
+       "│   │ │ │      │ People of the several States, and the Electors in each State shall have the Qualifications   │ │ │\n",
+       "│   │ │ │      │ requisite for Electors of the most numerous Branch of the State Legislature.                 │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ No Person shall be a Representative who shall not have attained to the Age of twenty five    │ │ │\n",
+       "│   │ │ │      │ Years, and been seven Years a Citizen of the United States, and who shall not, when elected, │ │ │\n",
+       "│   │ │ │      │ be an Inhabitant of that State in which he shall be chosen.                                  │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ Representatives and direct Taxes shall be apportioned among the several States which may be  │ │ │\n",
+       "│   │ │ │      │ included within this Union, according to their respective Numbers, which shall be determined │ │ │\n",
+       "│   │ │ │      │ by adding to the whole Number of free Persons, including those bound to Service for a Term   │ │ │\n",
+       "│   │ │ │      │ of Years, and excluding Indians not taxed, three fifths of all other Persons. The actual     │ │ │\n",
+       "│   │ │ │      │ Enumeration shall be made within three Years after the first Meeting of the Congress of the  │ │ │\n",
+       "│   │ │ │      │ United States, and within every subsequent Term of ten Years, in such Manner as they shall   │ │ │\n",
+       "│   │ │ │      │ by Law direct. The Number of Representatives shall not exceed one for every thirty Thousand, │ │ │\n",
+       "│   │ │ │      │ but each State shall have at Least one Representative; and until such enumeration shall be   │ │ │\n",
+       "│   │ │ │      │ made, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight,      │ │ │\n",
+       "│   │ │ │      │ Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New Jersey      │ │ │\n",
+       "│   │ │ │      │ four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina five,     │ │ │\n",
+       "│   │ │ │      │ South Carolina five, and Georgia three.                                                      │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ When vacancies happen in the Representation from any State, the Executive Authority thereof  │ │ │\n",
+       "│   │ │ │      │ shall issue Writs of Election to fill such Vacancies.                                        │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ The House of Representatives shall chuse their Speaker and other Officers; and shall have    │ │ │\n",
+       "│   │ │ │      │ the sole Power of Impeachment.                                                               │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ Given below is XML that describes the information to extract from this document and the tags │ │ │\n",
+       "│   │ │ │      │ to extract it into.                                                                          │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ <output>                                                                                     │ │ │\n",
+       "│   │ │ │      │   <string description=\"Summarize the given document faithfully.\"                             │ │ │\n",
+       "│   │ │ │      │ format=\"guardrails/similar_to_document: 'Section. 1.All legislative Powers herein granted    │ │ │\n",
+       "│   │ │ │      │ shall be vested in a Congress of the United States, which shall consist of a Senate and      │ │ │\n",
+       "│   │ │ │      │ House of Representatives.Section. 2.The House of Representatives shall be composed of        │ │ │\n",
+       "│   │ │ │      │ Members chosen every second Year by the People of the several States, and the Electors in    │ │ │\n",
+       "│   │ │ │      │ each State shall have the Qualifications requisite for Electors of the most numerous Branch  │ │ │\n",
+       "│   │ │ │      │ of the State Legislature.No Person shall be a Representative who shall not have attained to  │ │ │\n",
+       "│   │ │ │      │ the Age of twenty five Years, and been seven Years a Citizen of the United States, and who   │ │ │\n",
+       "│   │ │ │      │ shall not, when elected, be an Inhabitant of that State in which he shall be                 │ │ │\n",
+       "│   │ │ │      │ chosen.Representatives and direct Taxes shall be apportioned among the several States which  │ │ │\n",
+       "│   │ │ │      │ may be included within this Union, according to their respective Numbers, which shall be     │ │ │\n",
+       "│   │ │ │      │ determined by adding to the whole Number of free Persons, including those bound to Service   │ │ │\n",
+       "│   │ │ │      │ for a Term of Years, and excluding Indians not taxed, three fifths of all other Persons. The │ │ │\n",
+       "│   │ │ │      │ actual Enumeration shall be made within three Years after the first Meeting of the Congress  │ │ │\n",
+       "│   │ │ │      │ of the United States, and within every subsequent Term of ten Years, in such Manner as they  │ │ │\n",
+       "│   │ │ │      │ shall by Law direct. The Number of Representatives shall not exceed one for every thirty     │ │ │\n",
+       "│   │ │ │      │ Thousand, but each State shall have at Least one Representative; and until such enumeration  │ │ │\n",
+       "│   │ │ │      │ shall be made, the State of New Hampshire shall be entitled to chuse three, Massachusetts    │ │ │\n",
+       "│   │ │ │      │ eight, Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New      │ │ │\n",
+       "│   │ │ │      │ Jersey four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina    │ │ │\n",
+       "│   │ │ │      │ five, South Carolina five, and Georgia three.When vacancies happen in the Representation     │ │ │\n",
+       "│   │ │ │      │ from any State, the Executive Authority thereof shall issue Writs of Election to fill such   │ │ │\n",
+       "│   │ │ │      │ Vacancies.The House of Representatives shall chuse their Speaker and other Officers; and     │ │ │\n",
+       "│   │ │ │      │ shall have the sole Power of Impeachment.' 0.6 all-MiniLM-L6-v2\" name=\"summary\"              │ │ │\n",
+       "│   │ │ │      │ required=\"true\"></string>                                                                    │ │ │\n",
+       "│   │ │ │      │ </output>                                                                                    │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in  │ │ │\n",
+       "│   │ │ │      │ JSON is the `name` attribute of the corresponding XML, and the value is of the type          │ │ │\n",
+       "│   │ │ │      │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │ │\n",
+       "│   │ │ │      │ any types and format requests e.g. requests for lists, objects and specific types. Be        │ │ │\n",
+       "│   │ │ │      │ correct and concise. If you are unsure anywhere, enter `null`.                               │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:               │ │ │\n",
+       "│   │ │ │      │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`          │ │ │\n",
+       "│   │ │ │      │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',        │ │ │\n",
+       "│   │ │ │      │ 'STRING TWO', etc.]}`                                                                        │ │ │\n",
+       "│   │ │ │      │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer            │ │ │\n",
+       "│   │ │ │      │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':     │ │ │\n",
+       "│   │ │ │      │ 1}}`                                                                                         │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ │      │                                                                                              │ │ │\n",
+       "│   │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
+       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "│   │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "│   │ │ If you are unsure about anything, please ask.                                                           │ │\n",
+       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "│   │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "│   │ │ None                                                                                                    │ │\n",
+       "│   │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "│   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃   Role  Content                                                                                    ┃ │ │\n",
+       "    │ │ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ system │                                                                                            │ │ │\n",
+       "    │ │ │        │ You are a helpful assistant only capable of communicating with valid JSON, and no other    │ │ │\n",
+       "    │ │ │        │ text.                                                                                      │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ONLY return a valid JSON object (no other text is necessary), where the key of the field   │ │ │\n",
+       "    │ │ │        │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type     │ │ │\n",
+       "    │ │ │        │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format,         │ │ │\n",
+       "    │ │ │        │ including any types and format requests e.g. requests for lists, objects and specific      │ │ │\n",
+       "    │ │ │        │ types. Be correct and concise. If you are unsure anywhere, enter `null`.                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:             │ │ │\n",
+       "    │ │ │        │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`        │ │ │\n",
+       "    │ │ │        │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',      │ │ │\n",
+       "    │ │ │        │ 'STRING TWO', etc.]}`                                                                      │ │ │\n",
+       "    │ │ │        │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer          │ │ │\n",
+       "    │ │ │        │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':   │ │ │\n",
+       "    │ │ │        │ 1}}`                                                                                       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │ │\n",
+       "    │ │ │   user │                                                                                            │ │ │\n",
+       "    │ │ │        │ I was given the following response, which was not parseable as JSON.                       │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ \"If you are unsure about anything, please ask.\"                                            │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Help me correct this by making it valid JSON.                                              │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ Given below is XML that describes the information to extract from this document and the    │ │ │\n",
+       "    │ │ │        │ tags to extract it into.                                                                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ <output>                                                                                   │ │ │\n",
+       "    │ │ │        │   <string description=\"Summarize the given document faithfully.\"                           │ │ │\n",
+       "    │ │ │        │ format=\"guardrails/similar_to_document: 'Section. 1.All legislative Powers herein granted  │ │ │\n",
+       "    │ │ │        │ shall be vested in a Congress of the United States, which shall consist of a Senate and    │ │ │\n",
+       "    │ │ │        │ House of Representatives.Section. 2.The House of Representatives shall be composed of      │ │ │\n",
+       "    │ │ │        │ Members chosen every second Year by the People of the several States, and the Electors in  │ │ │\n",
+       "    │ │ │        │ each State shall have the Qualifications requisite for Electors of the most numerous       │ │ │\n",
+       "    │ │ │        │ Branch of the State Legislature.No Person shall be a Representative who shall not have     │ │ │\n",
+       "    │ │ │        │ attained to the Age of twenty five Years, and been seven Years a Citizen of the United     │ │ │\n",
+       "    │ │ │        │ States, and who shall not, when elected, be an Inhabitant of that State in which he shall  │ │ │\n",
+       "    │ │ │        │ be chosen.Representatives and direct Taxes shall be apportioned among the several States   │ │ │\n",
+       "    │ │ │        │ which may be included within this Union, according to their respective Numbers, which      │ │ │\n",
+       "    │ │ │        │ shall be determined by adding to the whole Number of free Persons, including those bound   │ │ │\n",
+       "    │ │ │        │ to Service for a Term of Years, and excluding Indians not taxed, three fifths of all other │ │ │\n",
+       "    │ │ │        │ Persons. The actual Enumeration shall be made within three Years after the first Meeting   │ │ │\n",
+       "    │ │ │        │ of the Congress of the United States, and within every subsequent Term of ten Years, in    │ │ │\n",
+       "    │ │ │        │ such Manner as they shall by Law direct. The Number of Representatives shall not exceed    │ │ │\n",
+       "    │ │ │        │ one for every thirty Thousand, but each State shall have at Least one Representative; and  │ │ │\n",
+       "    │ │ │        │ until such enumeration shall be made, the State of New Hampshire shall be entitled to      │ │ │\n",
+       "    │ │ │        │ chuse three, Massachusetts eight, Rhode-Island and Providence Plantations one, Connecticut │ │ │\n",
+       "    │ │ │        │ five, New-York six, New Jersey four, Pennsylvania eight, Delaware one, Maryland six,       │ │ │\n",
+       "    │ │ │        │ Virginia ten, North Carolina five, South Carolina five, and Georgia three.When vacancies   │ │ │\n",
+       "    │ │ │        │ happen in the Representation from any State, the Executive Authority thereof shall issue   │ │ │\n",
+       "    │ │ │        │ Writs of Election to fill such Vacancies.The House of Representatives shall chuse their    │ │ │\n",
+       "    │ │ │        │ Speaker and other Officers; and shall have the sole Power of Impeachment.' 0.6             │ │ │\n",
+       "    │ │ │        │ all-MiniLM-L6-v2\" name=\"summary\" required=\"true\"></string>                                 │ │ │\n",
+       "    │ │ │        │ </output>                                                                                  │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ │        │ ONLY return a valid JSON object (no other text is necessary), where the key of the field   │ │ │\n",
+       "    │ │ │        │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type     │ │ │\n",
+       "    │ │ │        │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format,         │ │ │\n",
+       "    │ │ │        │ including any types and format requests e.g. requests for lists, objects and specific      │ │ │\n",
+       "    │ │ │        │ types. Be correct and concise. If you are unsure anywhere, enter `null`.                   │ │ │\n",
+       "    │ │ │        │                                                                                            │ │ │\n",
+       "    │ │ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
+       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
+       "    │ │ format=\"1-indexed\" /></object>` =>                                                                      │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ │ None                                                                                                    │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "
\n" + ], + "text/plain": [ + "Logs\n", + "├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n", + "│ │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mSummarize the following document: \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mSection. 1. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mAll legislative Powers herein granted shall be vested in a Congress of the United States, \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mwhich shall consist of a Senate and House of Representatives. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mSection. 2. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mThe House of Representatives shall be composed of Members chosen every second Year by the \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mPeople of the several States, and the Electors in each State shall have the Qualifications \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mrequisite for Electors of the most numerous Branch of the State Legislature. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo Person shall be a Representative who shall not have attained to the Age of twenty five \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYears, and been seven Years a Citizen of the United States, and who shall not, when elected,\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mbe an Inhabitant of that State in which he shall be chosen. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mRepresentatives and direct Taxes shall be apportioned among the several States which may be \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluded within this Union, according to their respective Numbers, which shall be determined\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mby adding to the whole Number of free Persons, including those bound to Service for a Term \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mof Years, and excluding Indians not taxed, three fifths of all other Persons. The actual \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mEnumeration shall be made within three Years after the first Meeting of the Congress of the \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mUnited States, and within every subsequent Term of ten Years, in such Manner as they shall \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mby Law direct. The Number of Representatives shall not exceed one for every thirty Thousand,\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mbut each State shall have at Least one Representative; and until such enumeration shall be \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mmade, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mRhode-Island and Providence Plantations one, Connecticut five, New-York six, New Jersey \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mfour, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina five, \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mSouth Carolina five, and Georgia three. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mWhen vacancies happen in the Representation from any State, the Executive Authority thereof \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mshall issue Writs of Election to fill such Vacancies. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mThe House of Representatives shall chuse their Speaker and other Officers; and shall have \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mthe sole Power of Impeachment. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the tags\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mto extract it into. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field in \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mJSON is the `name` attribute of the corresponding XML, and the value is of the type \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, including\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many types and format requests e.g. requests for lists, objects and specific types. Be \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcorrect and concise. If you are unsure anywhere, enter `null`. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior: \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE', \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index': \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + "│ │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + "│ │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", + "│ │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mIf you are unsure about anything, please ask.\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + "│ │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mNone\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + "│ │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + "│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n", + "└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮\n", + " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235m Role\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235msystem\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mYou are a helpful assistant only capable of communicating with valid JSON, and no other \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtext. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235min JSON is the `name` attribute of the corresponding XML, and the value is of the type \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluding any types and format requests e.g. requests for lists, objects and specific \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtypes. Be correct and concise. If you are unsure anywhere, enter `null`. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior: \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE', \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index': \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}` \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m user\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mI was given the following response, which was not parseable as JSON. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m\"If you are unsure about anything, please ask.\" \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHelp me correct this by making it valid JSON. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtags to extract it into. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235min JSON is the `name` attribute of the corresponding XML, and the value is of the type \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mincluding any types and format requests e.g. requests for lists, objects and specific \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mtypes. Be correct and concise. If you are unsure anywhere, enter `null`. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└────────┴────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m- `` =>\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mNone\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "print(guard.history.last.tree)" ] @@ -338,7 +1285,7 @@ ], "metadata": { "kernelspec": { - "display_name": "guardrails", + "display_name": "litellm", "language": "python", "name": "python3" }, @@ -352,7 +1299,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.1" + "version": "3.12.3" }, "orig_nbformat": 4 }, diff --git a/docs/examples/toxic_language.ipynb b/docs/examples/toxic_language.ipynb index 7b94274bb..e3261cd94 100644 --- a/docs/examples/toxic_language.ipynb +++ b/docs/examples/toxic_language.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -10,8 +10,6 @@ "output_type": "stream", "text": [ "Installing hub:\u001b[35m/\u001b[0m\u001b[35m/guardrails/\u001b[0m\u001b[95mtoxic_language...\u001b[0m\n", - "/Users/calebcourier/Projects/gr-mono/guardrails/docs/examples/.venv/lib/python3.12/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.\n", - " warnings.warn(\n", "✅Successfully installed guardrails/toxic_language!\n", "\n", "\n" @@ -35,9 +33,18 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n", + " from tqdm.autonotebook import tqdm, trange\n" + ] + } + ], "source": [ "# Import the guardrails package\n", "# and the ToxicLanguage validator\n", @@ -49,18 +56,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 3, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/calebcourier/Projects/gr-mono/guardrails/docs/examples/.venv/lib/python3.12/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.\n", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "# Create a Guard object with this validator\n", "# Here, we'll use the default validation method of \"sentence\"\n", @@ -73,9 +71,17 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] + }, { "data": { "text/html": [ @@ -117,9 +123,17 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 5, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] + }, { "data": { "text/html": [ @@ -164,7 +178,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -176,17 +190,25 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 7, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] + }, { "data": { "text/html": [ - "
\n",
+       "
Why can't you comprehend this?\n",
        "
\n" ], "text/plain": [ - "\n" + "Why can't you comprehend this?\n" ] }, "metadata": {}, @@ -214,7 +236,7 @@ ], "metadata": { "kernelspec": { - "display_name": "lang", + "display_name": "litellm", "language": "python", "name": "python3" }, diff --git a/docs/examples/translation_to_specific_language.ipynb b/docs/examples/translation_to_specific_language.ipynb index 6847296ed..63d3c467d 100644 --- a/docs/examples/translation_to_specific_language.ipynb +++ b/docs/examples/translation_to_specific_language.ipynb @@ -27,17 +27,7 @@ "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.2\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" - ] - } - ], + "outputs": [], "source": [ "! pip install alt-profanity-check --quiet" ] @@ -68,7 +58,16 @@ "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n", + " from tqdm.autonotebook import tqdm, trange\n" + ] + } + ], "source": [ "from profanity_check import predict\n", "from guardrails.validators import (\n", @@ -122,15 +121,15 @@ " />\n", "\n", "\n", - "\n", - "\n", + "\n", + "\n", "Translate the given statement into english language:\n", "\n", "${statement_to_be_translated}\n", "\n", "${gr.complete_xml_suffix}\n", - "\n", - "\n", + "\n", + "\n", "\n", "\"\"\"" ] @@ -257,9 +256,17 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 9, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] + }, { "data": { "text/html": [ @@ -299,7 +306,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 10, "metadata": { "tags": [] }, @@ -367,7 +374,7 @@ } ], "source": [ - "print(guard.history.last.iterations.last.inputs.msg_history[0][\"content\"])" + "print(guard.history.last.iterations.last.inputs.messages[0][\"content\"])" ] }, { @@ -379,7 +386,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -387,10 +394,7 @@ "text/html": [ "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
        "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
        "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
        "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
@@ -427,9 +431,7 @@
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ ```json                                                                                                 │ │\n",
-       "    │ │ {                                                                                                       │ │\n",
-       "    │ │   \"translated_statement\": \"chicken quesadilla\"                                                          │ │\n",
-       "    │ │ }                                                                                                       │ │\n",
+       "    │ │ {\"translated_statement\": \"chicken quesadilla\"}                                                          │ │\n",
        "    │ │ ```                                                                                                     │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
@@ -441,10 +443,7 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
@@ -481,9 +480,7 @@
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```json\u001b[0m\u001b[48;2;245;245;220m                                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"translated_statement\": \"chicken quesadilla\"\u001b[0m\u001b[48;2;245;245;220m                                                         \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\"translated_statement\": \"chicken quesadilla\"}\u001b[0m\u001b[48;2;245;245;220m                                                         \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```\u001b[0m\u001b[48;2;245;245;220m                                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
@@ -512,11 +509,19 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 18,
    "metadata": {
     "tags": []
    },
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    },
     {
      "data": {
       "text/html": [
@@ -533,6 +538,7 @@
    ],
    "source": [
     "# Set your MISTRAL_API_KEY as an environment variable\n",
+    "# import os\n",
     "# os.environ[\"MISTRAL_API_KEY\"] = \"YOUR_API_KEY\"\n",
     "\n",
     "raw_llm_response, validated_response, *rest = guard(\n",
@@ -556,7 +562,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 19,
    "metadata": {},
    "outputs": [
     {
@@ -564,10 +570,7 @@
       "text/html": [
        "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │ No prompt                                                                                               │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
        "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
        "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
        "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
@@ -603,9 +606,11 @@
        "    │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ │ ```json                                                                                                 │ │\n",
        "    │ │ {                                                                                                       │ │\n",
-       "    │ │   \"translated_statement\": \"Kill yourself\"                                                               │ │\n",
+       "    │ │   \"translated_statement\": \"kill yourself\"                                                               │ │\n",
        "    │ │ }                                                                                                       │ │\n",
+       "    │ │ ```                                                                                                     │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ {'translated_statement': ''}                                                                            │ │\n",
@@ -616,10 +621,7 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m Prompt \u001b[0m\u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mNo prompt\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Message History \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
@@ -655,9 +657,11 @@
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```json\u001b[0m\u001b[48;2;245;245;220m                                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"translated_statement\": \"Kill yourself\"\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m  \"translated_statement\": \"kill yourself\"\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m```\u001b[0m\u001b[48;2;245;245;220m                                                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{'translated_statement': ''}\u001b[0m\u001b[48;2;240;255;240m                                                                           \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
@@ -676,7 +680,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "tiff-env",
+   "display_name": "litellm",
    "language": "python",
    "name": "python3"
   },
diff --git a/docs/examples/valid_chess_moves.ipynb b/docs/examples/valid_chess_moves.ipynb
index 194f8c0e8..dd708cbf4 100644
--- a/docs/examples/valid_chess_moves.ipynb
+++ b/docs/examples/valid_chess_moves.ipynb
@@ -22,9 +22,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 1,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
+      "  from tqdm.autonotebook import tqdm, trange\n"
+     ]
+    }
+   ],
    "source": [
     "import guardrails as gd\n",
     "from rich import print"
@@ -32,19 +41,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 2,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "\n",
-      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.2\u001b[0m\n",
-      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "! pip install chess --quiet"
    ]
@@ -68,7 +67,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -108,7 +107,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -120,11 +119,13 @@
     "\n",
     "\n",
     "\n",
-    "\n",
+    "\n",
+    "\n",
     "Generate a move for the chess board. The board is currently in the following state:\n",
     "${board_state}\n",
     "${gr.complete_xml_suffix}\n",
-    "\n",
+    "\n",
+    "\n",
     "\n",
     "\n",
     "\"\"\""
@@ -139,14 +140,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [],
    "source": [
     "from pydantic import BaseModel, Field\n",
     "\n",
     "prompt = \"\"\"\n",
-    "Generate a move for the chess board. The board is currently in the following state:\n",
+    "Generate a move for the chess board. Do not repeat any moves in the following state. The board is currently in the following state:\n",
     "${board_state}\n",
     "${gr.complete_xml_suffix}\n",
     "\"\"\"\n",
@@ -180,7 +181,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -196,7 +197,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -213,7 +214,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [
     {
@@ -232,7 +233,7 @@
        "Board('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1')"
       ]
      },
-     "execution_count": 24,
+     "execution_count": 9,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -251,9 +252,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": 10,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    }
+   ],
    "source": [
     "# Set your OPENAI_API_KEY as an environment variable\n",
     "# import os\n",
@@ -266,7 +276,7 @@
     "        if board.move_stack\n",
     "        else \"Starting position.\"\n",
     "    },\n",
-    "    model=\"gpt-3.5-turbo\",\n",
+    "    model=\"gpt-4o-mini\",\n",
     "    max_tokens=2048,\n",
     "    temperature=0.3,\n",
     ")"
@@ -282,7 +292,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 26,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [
     {
@@ -344,7 +354,7 @@
     }
    ],
    "source": [
-    "print(guard.history.last.iterations.last.inputs.msg_history[0][\"content\"])"
+    "print(guard.history.last.iterations.last.inputs.messages[0][\"content\"])"
    ]
   },
   {
@@ -358,7 +368,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [
     {
@@ -381,7 +391,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [
     {
@@ -400,7 +410,7 @@
        "Board('rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - 0 1')"
       ]
      },
-     "execution_count": 28,
+     "execution_count": 13,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -419,7 +429,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 29,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [
     {
@@ -438,7 +448,7 @@
        "Board('rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2')"
       ]
      },
-     "execution_count": 29,
+     "execution_count": 14,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -458,26 +468,287 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 30,
+   "execution_count": 24,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "
Iteration(\n",
+       "    id='14601258560',\n",
+       "    index=0,\n",
+       "    call_id='14601261600',\n",
+       "    inputs=Inputs(\n",
+       "        llm_api=<guardrails.llm_providers.LiteLLMCallable object at 0x365e7f770>,\n",
+       "        llm_output=None,\n",
+       "        instructions=None,\n",
+       "        prompt=None,\n",
+       "        messages=[{'role': 'user', 'content': Prompt(\n",
+       "Generate a move for the chess board. The board is...)}],\n",
+       "        msg_history=None,\n",
+       "        prompt_params={'board_state': \"[Move.from_uci('e2e4'), Move.from_uci('e7e5')]\"},\n",
+       "        num_reasks=1,\n",
+       "        metadata={},\n",
+       "        full_schema_reask=True,\n",
+       "        stream=False\n",
+       "    ),\n",
+       "    outputs=Outputs(\n",
+       "        llm_response_info=LLMResponse(\n",
+       "            prompt_token_count=325,\n",
+       "            response_token_count=6,\n",
+       "            output='{\"move\":\"e4\"}',\n",
+       "            stream_output=None,\n",
+       "            async_stream_output=None\n",
+       "        ),\n",
+       "        raw_output=None,\n",
+       "        parsed_output={'move': 'e4'},\n",
+       "        validation_response={\n",
+       "            'move': FieldReAsk(\n",
+       "                incorrect_value='e4',\n",
+       "                fail_results=[\n",
+       "                    FailResult(\n",
+       "                        outcome='fail',\n",
+       "                        error_message=\"Value e4 is not a valid chess move. illegal san: 'e4' in \n",
+       "rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\",\n",
+       "                        fix_value=None,\n",
+       "                        error_spans=None,\n",
+       "                        metadata=None,\n",
+       "                        validated_chunk=None\n",
+       "                    )\n",
+       "                ],\n",
+       "                additional_properties={},\n",
+       "                path=['move']\n",
+       "            )\n",
+       "        },\n",
+       "        guarded_output={},\n",
+       "        reasks=[\n",
+       "            FieldReAsk(\n",
+       "                incorrect_value='e4',\n",
+       "                fail_results=[\n",
+       "                    FailResult(\n",
+       "                        outcome='fail',\n",
+       "                        error_message=\"Value e4 is not a valid chess move. illegal san: 'e4' in \n",
+       "rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\",\n",
+       "                        fix_value=None,\n",
+       "                        error_spans=None,\n",
+       "                        metadata=None,\n",
+       "                        validated_chunk=None\n",
+       "                    )\n",
+       "                ],\n",
+       "                additional_properties={},\n",
+       "                path=['move']\n",
+       "            )\n",
+       "        ],\n",
+       "        validator_logs=[\n",
+       "            ValidatorLogs(\n",
+       "                validator_name='IsValidChessMove',\n",
+       "                registered_name='is-valid-chess-move',\n",
+       "                instance_id=14553910016,\n",
+       "                property_path='$.move',\n",
+       "                value_before_validation='e4',\n",
+       "                value_after_validation=FieldReAsk(\n",
+       "                    incorrect_value='e4',\n",
+       "                    fail_results=[\n",
+       "                        FailResult(\n",
+       "                            outcome='fail',\n",
+       "                            error_message=\"Value e4 is not a valid chess move. illegal san: 'e4' in \n",
+       "rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\",\n",
+       "                            fix_value=None,\n",
+       "                            error_spans=None,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        )\n",
+       "                    ],\n",
+       "                    additional_properties={},\n",
+       "                    path=['move']\n",
+       "                ),\n",
+       "                validation_result=FailResult(\n",
+       "                    outcome='fail',\n",
+       "                    error_message=\"Value e4 is not a valid chess move. illegal san: 'e4' in \n",
+       "rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\",\n",
+       "                    fix_value=None,\n",
+       "                    error_spans=None,\n",
+       "                    metadata=None,\n",
+       "                    validated_chunk=None\n",
+       "                ),\n",
+       "                start_time=datetime.datetime(2024, 10, 10, 16, 14, 48, 709063),\n",
+       "                end_time=datetime.datetime(2024, 10, 10, 16, 14, 48, 709941)\n",
+       "            )\n",
+       "        ],\n",
+       "        error=None,\n",
+       "        exception=None\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1;35mIteration\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mid\u001b[0m=\u001b[32m'14601258560'\u001b[0m,\n", + " \u001b[33mindex\u001b[0m=\u001b[1;36m0\u001b[0m,\n", + " \u001b[33mcall_id\u001b[0m=\u001b[32m'14601261600'\u001b[0m,\n", + " \u001b[33minputs\u001b[0m=\u001b[1;35mInputs\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mllm_api\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mguardrails.llm_providers.LiteLLMCallable\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x365e7f770\u001b[0m\u001b[1m>\u001b[0m,\n", + " \u001b[33mllm_output\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33minstructions\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mprompt\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mmessages\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'role'\u001b[0m: \u001b[32m'user'\u001b[0m, \u001b[32m'content'\u001b[0m: \u001b[1;35mPrompt\u001b[0m\u001b[1m(\u001b[0m\n", + "Generate a move for the chess board. The board is\u001b[33m...\u001b[0m\u001b[1m)\u001b[0m\u001b[1m}\u001b[0m\u001b[1m]\u001b[0m,\n", + " \u001b[33mmsg_history\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mprompt_params\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'board_state'\u001b[0m: \u001b[32m\"\u001b[0m\u001b[32m[\u001b[0m\u001b[32mMove.from_uci\u001b[0m\u001b[32m(\u001b[0m\u001b[32m'e2e4'\u001b[0m\u001b[32m)\u001b[0m\u001b[32m, Move.from_uci\u001b[0m\u001b[32m(\u001b[0m\u001b[32m'e7e5'\u001b[0m\u001b[32m)\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\"\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[33mnum_reasks\u001b[0m=\u001b[1;36m1\u001b[0m,\n", + " \u001b[33mmetadata\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[33mfull_schema_reask\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n", + " \u001b[33mstream\u001b[0m=\u001b[3;91mFalse\u001b[0m\n", + " \u001b[1m)\u001b[0m,\n", + " \u001b[33moutputs\u001b[0m=\u001b[1;35mOutputs\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mllm_response_info\u001b[0m=\u001b[1;35mLLMResponse\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mprompt_token_count\u001b[0m=\u001b[1;36m325\u001b[0m,\n", + " \u001b[33mresponse_token_count\u001b[0m=\u001b[1;36m6\u001b[0m,\n", + " \u001b[33moutput\u001b[0m=\u001b[32m'\u001b[0m\u001b[32m{\u001b[0m\u001b[32m\"move\":\"e4\"\u001b[0m\u001b[32m}\u001b[0m\u001b[32m'\u001b[0m,\n", + " \u001b[33mstream_output\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33masync_stream_output\u001b[0m=\u001b[3;35mNone\u001b[0m\n", + " \u001b[1m)\u001b[0m,\n", + " \u001b[33mraw_output\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mparsed_output\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'move'\u001b[0m: \u001b[32m'e4'\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[33mvalidation_response\u001b[0m=\u001b[1m{\u001b[0m\n", + " \u001b[32m'move'\u001b[0m: \u001b[1;35mFieldReAsk\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mincorrect_value\u001b[0m=\u001b[32m'e4'\u001b[0m,\n", + " \u001b[33mfail_results\u001b[0m=\u001b[1m[\u001b[0m\n", + " \u001b[1;35mFailResult\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33moutcome\u001b[0m=\u001b[32m'fail'\u001b[0m,\n", + " \u001b[33merror_message\u001b[0m=\u001b[32m\"Value\u001b[0m\u001b[32m e4 is not a valid chess move. illegal san: 'e4' in \u001b[0m\n", + "\u001b[32mrnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\"\u001b[0m,\n", + " \u001b[33mfix_value\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33merror_spans\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mmetadata\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mvalidated_chunk\u001b[0m=\u001b[3;35mNone\u001b[0m\n", + " \u001b[1m)\u001b[0m\n", + " \u001b[1m]\u001b[0m,\n", + " \u001b[33madditional_properties\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[33mpath\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'move'\u001b[0m\u001b[1m]\u001b[0m\n", + " \u001b[1m)\u001b[0m\n", + " \u001b[1m}\u001b[0m,\n", + " \u001b[33mguarded_output\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[33mreasks\u001b[0m=\u001b[1m[\u001b[0m\n", + " \u001b[1;35mFieldReAsk\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mincorrect_value\u001b[0m=\u001b[32m'e4'\u001b[0m,\n", + " \u001b[33mfail_results\u001b[0m=\u001b[1m[\u001b[0m\n", + " \u001b[1;35mFailResult\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33moutcome\u001b[0m=\u001b[32m'fail'\u001b[0m,\n", + " \u001b[33merror_message\u001b[0m=\u001b[32m\"Value\u001b[0m\u001b[32m e4 is not a valid chess move. illegal san: 'e4' in \u001b[0m\n", + "\u001b[32mrnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\"\u001b[0m,\n", + " \u001b[33mfix_value\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33merror_spans\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mmetadata\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mvalidated_chunk\u001b[0m=\u001b[3;35mNone\u001b[0m\n", + " \u001b[1m)\u001b[0m\n", + " \u001b[1m]\u001b[0m,\n", + " \u001b[33madditional_properties\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[33mpath\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'move'\u001b[0m\u001b[1m]\u001b[0m\n", + " \u001b[1m)\u001b[0m\n", + " \u001b[1m]\u001b[0m,\n", + " \u001b[33mvalidator_logs\u001b[0m=\u001b[1m[\u001b[0m\n", + " \u001b[1;35mValidatorLogs\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mvalidator_name\u001b[0m=\u001b[32m'IsValidChessMove'\u001b[0m,\n", + " \u001b[33mregistered_name\u001b[0m=\u001b[32m'is-valid-chess-move'\u001b[0m,\n", + " \u001b[33minstance_id\u001b[0m=\u001b[1;36m14553910016\u001b[0m,\n", + " \u001b[33mproperty_path\u001b[0m=\u001b[32m'$.move'\u001b[0m,\n", + " \u001b[33mvalue_before_validation\u001b[0m=\u001b[32m'e4'\u001b[0m,\n", + " \u001b[33mvalue_after_validation\u001b[0m=\u001b[1;35mFieldReAsk\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mincorrect_value\u001b[0m=\u001b[32m'e4'\u001b[0m,\n", + " \u001b[33mfail_results\u001b[0m=\u001b[1m[\u001b[0m\n", + " \u001b[1;35mFailResult\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33moutcome\u001b[0m=\u001b[32m'fail'\u001b[0m,\n", + " \u001b[33merror_message\u001b[0m=\u001b[32m\"Value\u001b[0m\u001b[32m e4 is not a valid chess move. illegal san: 'e4' in \u001b[0m\n", + "\u001b[32mrnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\"\u001b[0m,\n", + " \u001b[33mfix_value\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33merror_spans\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mmetadata\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mvalidated_chunk\u001b[0m=\u001b[3;35mNone\u001b[0m\n", + " \u001b[1m)\u001b[0m\n", + " \u001b[1m]\u001b[0m,\n", + " \u001b[33madditional_properties\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[33mpath\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'move'\u001b[0m\u001b[1m]\u001b[0m\n", + " \u001b[1m)\u001b[0m,\n", + " \u001b[33mvalidation_result\u001b[0m=\u001b[1;35mFailResult\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33moutcome\u001b[0m=\u001b[32m'fail'\u001b[0m,\n", + " \u001b[33merror_message\u001b[0m=\u001b[32m\"Value\u001b[0m\u001b[32m e4 is not a valid chess move. illegal san: 'e4' in \u001b[0m\n", + "\u001b[32mrnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\"\u001b[0m,\n", + " \u001b[33mfix_value\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33merror_spans\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mmetadata\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mvalidated_chunk\u001b[0m=\u001b[3;35mNone\u001b[0m\n", + " \u001b[1m)\u001b[0m,\n", + " \u001b[33mstart_time\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m16\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m709063\u001b[0m\u001b[1m)\u001b[0m,\n", + " \u001b[33mend_time\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m16\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m709941\u001b[0m\u001b[1m)\u001b[0m\n", + " \u001b[1m)\u001b[0m\n", + " \u001b[1m]\u001b[0m,\n", + " \u001b[33merror\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mexception\u001b[0m=\u001b[3;35mNone\u001b[0m\n", + " \u001b[1m)\u001b[0m\n", + "\u001b[1m)\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
{\n",
+       "  \"move\": null\n",
+       "}\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m{\u001b[0m\n", + " \u001b[32m\"move\"\u001b[0m: null\n", + "\u001b[1m}\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
[Move.from_uci('e2e4'), Move.from_uci('e7e5')]\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m[\u001b[0m\u001b[1;35mMove.from_uci\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'e2e4'\u001b[0m\u001b[1m)\u001b[0m, \u001b[1;35mMove.from_uci\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'e7e5'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m]\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "raw_llm_response, validated_response, *rest = guard(\n", " messages=[{\"role\":\"user\", \"content\": prompt}],\n", " prompt_params={\n", " \"board_state\": str(board.move_stack)\n", - " if board.move_stack\n", - " else \"Starting position.\"\n", " },\n", - " model=\"gpt-3.5-turbo\",\n", + " model=\"gpt-4o-mini\",\n", " max_tokens=2048,\n", - " temperature=0.3,\n", - ")" + " temperature=0.0,\n", + ")\n", + "print(guard.history.last.iterations.first)\n", + "print(raw_llm_response)\n", + "print(board.move_stack)" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -488,15 +759,15 @@ ". . . . . . . .\n", ". . . . p . . .\n", ". . . . P . . .\n", - ". . . . . N . .\n", + ". . . . . . . .\n", "P P P P . P P P\n", - "R N B Q K B . R
" + "R N B Q K B N R
" ], "text/plain": [ - "Board('rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2')" + "Board('rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2')" ] }, - "execution_count": 31, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -507,28 +778,21 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 18, "metadata": {}, "outputs": [ { - "data": { - "image/svg+xml": [ - "
r . b q k b n r\n",
-       "p p p p . p p p\n",
-       ". . n . . . . .\n",
-       ". . . . p . . .\n",
-       ". . . . P . . .\n",
-       ". . . . . N . .\n",
-       "P P P P . P P P\n",
-       "R N B Q K B . R
" - ], - "text/plain": [ - "Board('r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - 2 3')" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" + "ename": "IllegalMoveError", + "evalue": "illegal san: 'Nc6' in rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIllegalMoveError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[18], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mboard\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpush_san\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mNc6\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m board\n", + "File \u001b[0;32m~/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/chess/__init__.py:3225\u001b[0m, in \u001b[0;36mBoard.push_san\u001b[0;34m(self, san)\u001b[0m\n\u001b[1;32m 3211\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mpush_san\u001b[39m(\u001b[38;5;28mself\u001b[39m, san: \u001b[38;5;28mstr\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Move:\n\u001b[1;32m 3212\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 3213\u001b[0m \u001b[38;5;124;03m Parses a move in standard algebraic notation, makes the move and puts\u001b[39;00m\n\u001b[1;32m 3214\u001b[0m \u001b[38;5;124;03m it onto the move stack.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 3223\u001b[0m \u001b[38;5;124;03m - :exc:`AmbiguousMoveError` if the SAN is ambiguous.\u001b[39;00m\n\u001b[1;32m 3224\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 3225\u001b[0m move \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse_san\u001b[49m\u001b[43m(\u001b[49m\u001b[43msan\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3226\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpush(move)\n\u001b[1;32m 3227\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m move\n", + "File \u001b[0;32m~/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/chess/__init__.py:3207\u001b[0m, in \u001b[0;36mBoard.parse_san\u001b[0;34m(self, san)\u001b[0m\n\u001b[1;32m 3204\u001b[0m matched_move \u001b[38;5;241m=\u001b[39m move\n\u001b[1;32m 3206\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m matched_move:\n\u001b[0;32m-> 3207\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m IllegalMoveError(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124millegal san: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msan\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m in \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfen()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 3209\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m matched_move\n", + "\u001b[0;31mIllegalMoveError\u001b[0m: illegal san: 'Nc6' in rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2" + ] } ], "source": [ @@ -539,7 +803,7 @@ ], "metadata": { "kernelspec": { - "display_name": "tiff-env", + "display_name": "litellm", "language": "python", "name": "python3" }, @@ -555,12 +819,7 @@ "pygments_lexer": "ipython3", "version": "3.12.3" }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "ef14f49bbc779f2fde64ca0552c2a99d578405052f5b73f61279551da311a8a1" - } - } + "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 diff --git a/guardrails/llm_providers.py b/guardrails/llm_providers.py index 9baf8f5ba..99df3ed90 100644 --- a/guardrails/llm_providers.py +++ b/guardrails/llm_providers.py @@ -217,7 +217,8 @@ def _invoke_llm( "function_call", safe_get(function_calling_tools, 0) ), ) - + kwargs.pop("instructions", None) + kwargs.pop("prompt", None) response = completion( model=model, *args, diff --git a/guardrails/run/runner.py b/guardrails/run/runner.py index 7b3303c99..32cd19480 100644 --- a/guardrails/run/runner.py +++ b/guardrails/run/runner.py @@ -336,7 +336,8 @@ def prepare_messages( # Format any variables in the message history with the prompt params. for msg in messages: msg_copy = copy.deepcopy(msg) - msg_copy["content"] = msg_copy["content"].format(**prompt_params) + if attempt_number == 0: + msg_copy["content"] = msg_copy["content"].format(**prompt_params) formatted_messages.append(msg_copy) # validate messages From 6dfc33701f6399058776f8b61ed5883fdcf178b1 Mon Sep 17 00:00:00 2001 From: David Tam Date: Thu, 10 Oct 2024 16:22:06 -0700 Subject: [PATCH 37/71] last few notebooks --- docs/examples/valid_chess_moves.ipynb | 337 +++--------------- docs/examples/value_within_distribution.ipynb | 50 ++- 2 files changed, 87 insertions(+), 300 deletions(-) diff --git a/docs/examples/valid_chess_moves.ipynb b/docs/examples/valid_chess_moves.ipynb index dd708cbf4..3f163a160 100644 --- a/docs/examples/valid_chess_moves.ipynb +++ b/docs/examples/valid_chess_moves.ipynb @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -67,7 +67,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -107,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ "\n", "\n", "\n", - "Generate a move for the chess board. The board is currently in the following state:\n", + "Generate a move for the chess board. Do not repeat any moves in the following state. The board is currently in the following state:\n", "${board_state}\n", "${gr.complete_xml_suffix}\n", "\n", @@ -140,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -181,7 +181,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -197,7 +197,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -214,7 +214,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -233,7 +233,7 @@ "Board('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1')" ] }, - "execution_count": 9, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -252,7 +252,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -292,14 +292,15 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n",
-       "Generate a move for the chess board. The board is currently in the following state:\n",
+       "Generate a move for the chess board. Do not repeat any moves in the following state. The board is currently in the \n",
+       "following state:\n",
        "Starting position.\n",
        "\n",
        "Given below is XML that describes the information to extract from this document and the tags to extract it into.\n",
@@ -325,7 +326,8 @@
       ],
       "text/plain": [
        "\n",
-       "Generate a move for the chess board. The board is currently in the following state:\n",
+       "Generate a move for the chess board. Do not repeat any moves in the following state. The board is currently in the \n",
+       "following state:\n",
        "Starting position.\n",
        "\n",
        "Given below is XML that describes the information to extract from this document and the tags to extract it into.\n",
@@ -368,7 +370,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [
     {
@@ -391,7 +393,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [
     {
@@ -410,7 +412,7 @@
        "Board('rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - 0 1')"
       ]
      },
-     "execution_count": 13,
+     "execution_count": 12,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -429,7 +431,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [
     {
@@ -448,7 +450,7 @@
        "Board('rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2')"
       ]
      },
-     "execution_count": 14,
+     "execution_count": 13,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -468,7 +470,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [
     {
@@ -478,257 +480,6 @@
       "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
       "  warnings.warn(\n"
      ]
-    },
-    {
-     "data": {
-      "text/html": [
-       "
Iteration(\n",
-       "    id='14601258560',\n",
-       "    index=0,\n",
-       "    call_id='14601261600',\n",
-       "    inputs=Inputs(\n",
-       "        llm_api=<guardrails.llm_providers.LiteLLMCallable object at 0x365e7f770>,\n",
-       "        llm_output=None,\n",
-       "        instructions=None,\n",
-       "        prompt=None,\n",
-       "        messages=[{'role': 'user', 'content': Prompt(\n",
-       "Generate a move for the chess board. The board is...)}],\n",
-       "        msg_history=None,\n",
-       "        prompt_params={'board_state': \"[Move.from_uci('e2e4'), Move.from_uci('e7e5')]\"},\n",
-       "        num_reasks=1,\n",
-       "        metadata={},\n",
-       "        full_schema_reask=True,\n",
-       "        stream=False\n",
-       "    ),\n",
-       "    outputs=Outputs(\n",
-       "        llm_response_info=LLMResponse(\n",
-       "            prompt_token_count=325,\n",
-       "            response_token_count=6,\n",
-       "            output='{\"move\":\"e4\"}',\n",
-       "            stream_output=None,\n",
-       "            async_stream_output=None\n",
-       "        ),\n",
-       "        raw_output=None,\n",
-       "        parsed_output={'move': 'e4'},\n",
-       "        validation_response={\n",
-       "            'move': FieldReAsk(\n",
-       "                incorrect_value='e4',\n",
-       "                fail_results=[\n",
-       "                    FailResult(\n",
-       "                        outcome='fail',\n",
-       "                        error_message=\"Value e4 is not a valid chess move. illegal san: 'e4' in \n",
-       "rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\",\n",
-       "                        fix_value=None,\n",
-       "                        error_spans=None,\n",
-       "                        metadata=None,\n",
-       "                        validated_chunk=None\n",
-       "                    )\n",
-       "                ],\n",
-       "                additional_properties={},\n",
-       "                path=['move']\n",
-       "            )\n",
-       "        },\n",
-       "        guarded_output={},\n",
-       "        reasks=[\n",
-       "            FieldReAsk(\n",
-       "                incorrect_value='e4',\n",
-       "                fail_results=[\n",
-       "                    FailResult(\n",
-       "                        outcome='fail',\n",
-       "                        error_message=\"Value e4 is not a valid chess move. illegal san: 'e4' in \n",
-       "rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\",\n",
-       "                        fix_value=None,\n",
-       "                        error_spans=None,\n",
-       "                        metadata=None,\n",
-       "                        validated_chunk=None\n",
-       "                    )\n",
-       "                ],\n",
-       "                additional_properties={},\n",
-       "                path=['move']\n",
-       "            )\n",
-       "        ],\n",
-       "        validator_logs=[\n",
-       "            ValidatorLogs(\n",
-       "                validator_name='IsValidChessMove',\n",
-       "                registered_name='is-valid-chess-move',\n",
-       "                instance_id=14553910016,\n",
-       "                property_path='$.move',\n",
-       "                value_before_validation='e4',\n",
-       "                value_after_validation=FieldReAsk(\n",
-       "                    incorrect_value='e4',\n",
-       "                    fail_results=[\n",
-       "                        FailResult(\n",
-       "                            outcome='fail',\n",
-       "                            error_message=\"Value e4 is not a valid chess move. illegal san: 'e4' in \n",
-       "rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\",\n",
-       "                            fix_value=None,\n",
-       "                            error_spans=None,\n",
-       "                            metadata=None,\n",
-       "                            validated_chunk=None\n",
-       "                        )\n",
-       "                    ],\n",
-       "                    additional_properties={},\n",
-       "                    path=['move']\n",
-       "                ),\n",
-       "                validation_result=FailResult(\n",
-       "                    outcome='fail',\n",
-       "                    error_message=\"Value e4 is not a valid chess move. illegal san: 'e4' in \n",
-       "rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\",\n",
-       "                    fix_value=None,\n",
-       "                    error_spans=None,\n",
-       "                    metadata=None,\n",
-       "                    validated_chunk=None\n",
-       "                ),\n",
-       "                start_time=datetime.datetime(2024, 10, 10, 16, 14, 48, 709063),\n",
-       "                end_time=datetime.datetime(2024, 10, 10, 16, 14, 48, 709941)\n",
-       "            )\n",
-       "        ],\n",
-       "        error=None,\n",
-       "        exception=None\n",
-       "    )\n",
-       ")\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1;35mIteration\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33mid\u001b[0m=\u001b[32m'14601258560'\u001b[0m,\n", - " \u001b[33mindex\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - " \u001b[33mcall_id\u001b[0m=\u001b[32m'14601261600'\u001b[0m,\n", - " \u001b[33minputs\u001b[0m=\u001b[1;35mInputs\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33mllm_api\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mguardrails.llm_providers.LiteLLMCallable\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x365e7f770\u001b[0m\u001b[1m>\u001b[0m,\n", - " \u001b[33mllm_output\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33minstructions\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mprompt\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mmessages\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'role'\u001b[0m: \u001b[32m'user'\u001b[0m, \u001b[32m'content'\u001b[0m: \u001b[1;35mPrompt\u001b[0m\u001b[1m(\u001b[0m\n", - "Generate a move for the chess board. The board is\u001b[33m...\u001b[0m\u001b[1m)\u001b[0m\u001b[1m}\u001b[0m\u001b[1m]\u001b[0m,\n", - " \u001b[33mmsg_history\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mprompt_params\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'board_state'\u001b[0m: \u001b[32m\"\u001b[0m\u001b[32m[\u001b[0m\u001b[32mMove.from_uci\u001b[0m\u001b[32m(\u001b[0m\u001b[32m'e2e4'\u001b[0m\u001b[32m)\u001b[0m\u001b[32m, Move.from_uci\u001b[0m\u001b[32m(\u001b[0m\u001b[32m'e7e5'\u001b[0m\u001b[32m)\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\"\u001b[0m\u001b[1m}\u001b[0m,\n", - " \u001b[33mnum_reasks\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - " \u001b[33mmetadata\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", - " \u001b[33mfull_schema_reask\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n", - " \u001b[33mstream\u001b[0m=\u001b[3;91mFalse\u001b[0m\n", - " \u001b[1m)\u001b[0m,\n", - " \u001b[33moutputs\u001b[0m=\u001b[1;35mOutputs\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33mllm_response_info\u001b[0m=\u001b[1;35mLLMResponse\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33mprompt_token_count\u001b[0m=\u001b[1;36m325\u001b[0m,\n", - " \u001b[33mresponse_token_count\u001b[0m=\u001b[1;36m6\u001b[0m,\n", - " \u001b[33moutput\u001b[0m=\u001b[32m'\u001b[0m\u001b[32m{\u001b[0m\u001b[32m\"move\":\"e4\"\u001b[0m\u001b[32m}\u001b[0m\u001b[32m'\u001b[0m,\n", - " \u001b[33mstream_output\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33masync_stream_output\u001b[0m=\u001b[3;35mNone\u001b[0m\n", - " \u001b[1m)\u001b[0m,\n", - " \u001b[33mraw_output\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mparsed_output\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'move'\u001b[0m: \u001b[32m'e4'\u001b[0m\u001b[1m}\u001b[0m,\n", - " \u001b[33mvalidation_response\u001b[0m=\u001b[1m{\u001b[0m\n", - " \u001b[32m'move'\u001b[0m: \u001b[1;35mFieldReAsk\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33mincorrect_value\u001b[0m=\u001b[32m'e4'\u001b[0m,\n", - " \u001b[33mfail_results\u001b[0m=\u001b[1m[\u001b[0m\n", - " \u001b[1;35mFailResult\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33moutcome\u001b[0m=\u001b[32m'fail'\u001b[0m,\n", - " \u001b[33merror_message\u001b[0m=\u001b[32m\"Value\u001b[0m\u001b[32m e4 is not a valid chess move. illegal san: 'e4' in \u001b[0m\n", - "\u001b[32mrnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\"\u001b[0m,\n", - " \u001b[33mfix_value\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33merror_spans\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mmetadata\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mvalidated_chunk\u001b[0m=\u001b[3;35mNone\u001b[0m\n", - " \u001b[1m)\u001b[0m\n", - " \u001b[1m]\u001b[0m,\n", - " \u001b[33madditional_properties\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", - " \u001b[33mpath\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'move'\u001b[0m\u001b[1m]\u001b[0m\n", - " \u001b[1m)\u001b[0m\n", - " \u001b[1m}\u001b[0m,\n", - " \u001b[33mguarded_output\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", - " \u001b[33mreasks\u001b[0m=\u001b[1m[\u001b[0m\n", - " \u001b[1;35mFieldReAsk\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33mincorrect_value\u001b[0m=\u001b[32m'e4'\u001b[0m,\n", - " \u001b[33mfail_results\u001b[0m=\u001b[1m[\u001b[0m\n", - " \u001b[1;35mFailResult\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33moutcome\u001b[0m=\u001b[32m'fail'\u001b[0m,\n", - " \u001b[33merror_message\u001b[0m=\u001b[32m\"Value\u001b[0m\u001b[32m e4 is not a valid chess move. illegal san: 'e4' in \u001b[0m\n", - "\u001b[32mrnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\"\u001b[0m,\n", - " \u001b[33mfix_value\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33merror_spans\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mmetadata\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mvalidated_chunk\u001b[0m=\u001b[3;35mNone\u001b[0m\n", - " \u001b[1m)\u001b[0m\n", - " \u001b[1m]\u001b[0m,\n", - " \u001b[33madditional_properties\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", - " \u001b[33mpath\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'move'\u001b[0m\u001b[1m]\u001b[0m\n", - " \u001b[1m)\u001b[0m\n", - " \u001b[1m]\u001b[0m,\n", - " \u001b[33mvalidator_logs\u001b[0m=\u001b[1m[\u001b[0m\n", - " \u001b[1;35mValidatorLogs\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33mvalidator_name\u001b[0m=\u001b[32m'IsValidChessMove'\u001b[0m,\n", - " \u001b[33mregistered_name\u001b[0m=\u001b[32m'is-valid-chess-move'\u001b[0m,\n", - " \u001b[33minstance_id\u001b[0m=\u001b[1;36m14553910016\u001b[0m,\n", - " \u001b[33mproperty_path\u001b[0m=\u001b[32m'$.move'\u001b[0m,\n", - " \u001b[33mvalue_before_validation\u001b[0m=\u001b[32m'e4'\u001b[0m,\n", - " \u001b[33mvalue_after_validation\u001b[0m=\u001b[1;35mFieldReAsk\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33mincorrect_value\u001b[0m=\u001b[32m'e4'\u001b[0m,\n", - " \u001b[33mfail_results\u001b[0m=\u001b[1m[\u001b[0m\n", - " \u001b[1;35mFailResult\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33moutcome\u001b[0m=\u001b[32m'fail'\u001b[0m,\n", - " \u001b[33merror_message\u001b[0m=\u001b[32m\"Value\u001b[0m\u001b[32m e4 is not a valid chess move. illegal san: 'e4' in \u001b[0m\n", - "\u001b[32mrnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\"\u001b[0m,\n", - " \u001b[33mfix_value\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33merror_spans\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mmetadata\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mvalidated_chunk\u001b[0m=\u001b[3;35mNone\u001b[0m\n", - " \u001b[1m)\u001b[0m\n", - " \u001b[1m]\u001b[0m,\n", - " \u001b[33madditional_properties\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", - " \u001b[33mpath\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'move'\u001b[0m\u001b[1m]\u001b[0m\n", - " \u001b[1m)\u001b[0m,\n", - " \u001b[33mvalidation_result\u001b[0m=\u001b[1;35mFailResult\u001b[0m\u001b[1m(\u001b[0m\n", - " \u001b[33moutcome\u001b[0m=\u001b[32m'fail'\u001b[0m,\n", - " \u001b[33merror_message\u001b[0m=\u001b[32m\"Value\u001b[0m\u001b[32m e4 is not a valid chess move. illegal san: 'e4' in \u001b[0m\n", - "\u001b[32mrnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2\"\u001b[0m,\n", - " \u001b[33mfix_value\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33merror_spans\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mmetadata\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mvalidated_chunk\u001b[0m=\u001b[3;35mNone\u001b[0m\n", - " \u001b[1m)\u001b[0m,\n", - " \u001b[33mstart_time\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m16\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m709063\u001b[0m\u001b[1m)\u001b[0m,\n", - " \u001b[33mend_time\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m16\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m709941\u001b[0m\u001b[1m)\u001b[0m\n", - " \u001b[1m)\u001b[0m\n", - " \u001b[1m]\u001b[0m,\n", - " \u001b[33merror\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - " \u001b[33mexception\u001b[0m=\u001b[3;35mNone\u001b[0m\n", - " \u001b[1m)\u001b[0m\n", - "\u001b[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
{\n",
-       "  \"move\": null\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1m{\u001b[0m\n", - " \u001b[32m\"move\"\u001b[0m: null\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
[Move.from_uci('e2e4'), Move.from_uci('e7e5')]\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1m[\u001b[0m\u001b[1;35mMove.from_uci\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'e2e4'\u001b[0m\u001b[1m)\u001b[0m, \u001b[1;35mMove.from_uci\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'e7e5'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m]\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ @@ -740,15 +491,12 @@ " model=\"gpt-4o-mini\",\n", " max_tokens=2048,\n", " temperature=0.0,\n", - ")\n", - "print(guard.history.last.iterations.first)\n", - "print(raw_llm_response)\n", - "print(board.move_stack)" + ")" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -759,15 +507,15 @@ ". . . . . . . .\n", ". . . . p . . .\n", ". . . . P . . .\n", - ". . . . . . . .\n", + ". . . . . N . .\n", "P P P P . P P P\n", - "R N B Q K B N R
" + "R N B Q K B . R
" ], "text/plain": [ - "Board('rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2')" + "Board('rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2')" ] }, - "execution_count": 21, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -778,21 +526,28 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "metadata": {}, "outputs": [ { - "ename": "IllegalMoveError", - "evalue": "illegal san: 'Nc6' in rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mIllegalMoveError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[18], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mboard\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpush_san\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mNc6\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m board\n", - "File \u001b[0;32m~/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/chess/__init__.py:3225\u001b[0m, in \u001b[0;36mBoard.push_san\u001b[0;34m(self, san)\u001b[0m\n\u001b[1;32m 3211\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mpush_san\u001b[39m(\u001b[38;5;28mself\u001b[39m, san: \u001b[38;5;28mstr\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Move:\n\u001b[1;32m 3212\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 3213\u001b[0m \u001b[38;5;124;03m Parses a move in standard algebraic notation, makes the move and puts\u001b[39;00m\n\u001b[1;32m 3214\u001b[0m \u001b[38;5;124;03m it onto the move stack.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 3223\u001b[0m \u001b[38;5;124;03m - :exc:`AmbiguousMoveError` if the SAN is ambiguous.\u001b[39;00m\n\u001b[1;32m 3224\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 3225\u001b[0m move \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse_san\u001b[49m\u001b[43m(\u001b[49m\u001b[43msan\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3226\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpush(move)\n\u001b[1;32m 3227\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m move\n", - "File \u001b[0;32m~/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/chess/__init__.py:3207\u001b[0m, in \u001b[0;36mBoard.parse_san\u001b[0;34m(self, san)\u001b[0m\n\u001b[1;32m 3204\u001b[0m matched_move \u001b[38;5;241m=\u001b[39m move\n\u001b[1;32m 3206\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m matched_move:\n\u001b[0;32m-> 3207\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m IllegalMoveError(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124millegal san: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msan\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m in \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfen()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 3209\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m matched_move\n", - "\u001b[0;31mIllegalMoveError\u001b[0m: illegal san: 'Nc6' in rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2" - ] + "data": { + "image/svg+xml": [ + "
r . b q k b n r\n",
+       "p p p p . p p p\n",
+       ". . n . . . . .\n",
+       ". . . . p . . .\n",
+       ". . . . P . . .\n",
+       ". . . . . N . .\n",
+       "P P P P . P P P\n",
+       "R N B Q K B . R
" + ], + "text/plain": [ + "Board('r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - 2 3')" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ diff --git a/docs/examples/value_within_distribution.ipynb b/docs/examples/value_within_distribution.ipynb index 58ab87f6b..fb3cffa20 100644 --- a/docs/examples/value_within_distribution.ipynb +++ b/docs/examples/value_within_distribution.ipynb @@ -39,14 +39,14 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/Users/calebcourier/Projects/gr-mono/guardrails/docs/examples/.venv/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:11: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n", " from tqdm.autonotebook import tqdm, trange\n" ] } @@ -74,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -83,6 +83,14 @@ "text": [ "{'value': 3}\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] } ], "source": [ @@ -104,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -113,6 +121,14 @@ "text": [ "None\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] } ], "source": [ @@ -141,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -166,9 +182,17 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -193,9 +217,17 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -221,7 +253,7 @@ ], "metadata": { "kernelspec": { - "display_name": "venv", + "display_name": "litellm", "language": "python", "name": "python3" }, @@ -235,7 +267,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.1" + "version": "3.12.3" }, "orig_nbformat": 4 }, From 955622c7b8420a77f9c66f1dba4b63fd90fcac19 Mon Sep 17 00:00:00 2001 From: David Tam Date: Fri, 11 Oct 2024 10:14:58 -0700 Subject: [PATCH 38/71] last books --- .../translation_with_quality_check.ipynb | 272 +++++++++++++++++- docs/examples/value_within_distribution.ipynb | 27 +- 2 files changed, 270 insertions(+), 29 deletions(-) diff --git a/docs/examples/translation_with_quality_check.ipynb b/docs/examples/translation_with_quality_check.ipynb index 6a24eabd2..45bc0f74a 100644 --- a/docs/examples/translation_with_quality_check.ipynb +++ b/docs/examples/translation_with_quality_check.ipynb @@ -2,9 +2,37 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Installing hub:\u001b[35m/\u001b[0m\u001b[35m/brainlogic/\u001b[0m\u001b[95mhigh_quality_translation...\u001b[0m\n", + "\u001b[2K\u001b[32m[ ===]\u001b[0m Fetching manifestst\n", + "\u001b[2K\u001b[32m[= ]\u001b[0m Downloading dependenciespendencies Running command git clone --filter=blob:none --quiet https://github.com/BrainLogicHub/high_quality_translation_validator.git /private/var/folders/yt/ltz0vbpx14j34mj55jyj39x40000gn/T/pip-req-build-hja54mr_\n", + "\u001b[2K\u001b[32m[ =]\u001b[0m Downloading dependencies\u001b[33mWARNING: typer 0.12.5 does not provide the extra 'all'\u001b[0m\u001b[33m\n", + "\u001b[2K\u001b[32m[=== ]\u001b[0m Downloading dependencies\n", + "Fetching 5 files: 100%|████████████████████████| 5/5 [00:00<00:00, 45590.26it/s]\n", + "\u001b[2K\u001b[32m[ ===]\u001b[0m Running post-install setupLightning automatically upgraded your loaded checkpoint from v1.8.2 to v2.4.0. To apply the upgrade to your files permanently, run `python -m pytorch_lightning.utilities.upgrade_checkpoint ../../../../.cache/huggingface/hub/models--Unbabel--wmt22-cometkiwi-da/snapshots/b3a8aea5a5fc22db68a554b92b3d96eb6ea75cc9/checkpoints/model.ckpt`\n", + "\u001b[2K\u001b[32m[= ]\u001b[0m Running post-install setup/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/transformers/tokenization_utils_base.py:1617: FutureWarning: `clean_up_tokenization_spaces` was not set. It will be set to `True` by default. This behavior will be deprecated in transformers v4.45, and will be then set to `False` by default. For more details check this issue: https://github.com/huggingface/transformers/issues/31884\n", + " warnings.warn(\n", + "\u001b[2K\u001b[32m[=== ]\u001b[0m Running post-install setupEncoder model frozen.\n", + "\u001b[2K\u001b[32m[ ===]\u001b[0m Running post-install setup/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/pytorch_lightning/core/saving.py:195: Found keys that are not in the model state dict but in the checkpoint: ['encoder.model.embeddings.position_ids']\n", + "\u001b[2K\u001b[32m[=== ]\u001b[0m Running post-install setup\n", + "\u001b[1A\u001b[2K✅Successfully installed brainlogic/high_quality_translation!\n", + "\n", + "\n", + "\u001b[1mImport validator:\u001b[0m\n", + "from guardrails.hub import HighQualityTranslation\n", + "\n", + "\u001b[1mGet more info:\u001b[0m\n", + "\u001b[4;94mhttps://hub.guardrailsai.com/validator/brainlogic/high_quality_translation\u001b[0m\n", + "\n" + ] + } + ], "source": [ "!guardrails hub install hub://brainlogic/high_quality_translation" ] @@ -37,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -61,11 +89,44 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading the model Unbabel/wmt22-cometkiwi-da...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8fa13706e228473b972844df05c1cdf4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Fetching 5 files: 0%| | 0/5 [00:00Raw LLM Output: I have no idea what I should write here.\n", + "\n" + ], + "text/plain": [ + "Raw LLM Output: I have no idea what I should write here.\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
Validated Output: I have no idea what I should write here.\n",
+       "
\n" + ], + "text/plain": [ + "Validated Output: I have no idea what I should write here.\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Set your OPENAI_API_KEY as an environment variable\n", "# import os\n", @@ -126,9 +239,61 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
Logs\n",
+       "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓                                          │ │\n",
+       "    │ │ ┃ Role  Content                                             ┃                                          │ │\n",
+       "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩                                          │ │\n",
+       "    │ │ │ user │                                                     │                                          │ │\n",
+       "    │ │ │      │ Translate the given statement into English:         │                                          │ │\n",
+       "    │ │ │      │                                                     │                                          │ │\n",
+       "    │ │ │      │ Ich habe keine Ahnung, was ich hier schreiben soll. │                                          │ │\n",
+       "    │ │ │      │                                                     │                                          │ │\n",
+       "    │ │ └──────┴─────────────────────────────────────────────────────┘                                          │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ │ I have no idea what I should write here.                                                                │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ │ I have no idea what I should write here.                                                                │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "
\n" + ], + "text/plain": [ + "Logs\n", + "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n", + " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m Messages \u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mTranslate the given statement into English: \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mIch habe keine Ahnung, was ich hier schreiben soll.\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴─────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mI have no idea what I should write here.\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mI have no idea what I should write here.\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "print(guard.history.last.tree)" ] @@ -145,9 +310,50 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + " warnings.warn(\n", + "GPU available: True (mps), used: False\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/pytorch_lightning/trainer/setup.py:177: GPU available but not used. You can set it by doing `Trainer(accelerator='gpu')`.\n", + "/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/pytorch_lightning/trainer/connectors/data_connector.py:419: Consider setting `persistent_workers=True` in 'predict_dataloader' to speed up the dataloader worker initialization.\n", + "Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 15.53it/s]\n" + ] + }, + { + "data": { + "text/html": [ + "
Raw LLM Output: It's such a beautiful day, I'm going to the beach.\n",
+       "
\n" + ], + "text/plain": [ + "Raw LLM Output: It's such a beautiful day, I'm going to the beach.\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
Validated Output: \n",
+       "
\n" + ], + "text/plain": [ + "Validated Output: \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Parse the code snippet\n", "statement = \"अरे भाऊ, आज रात्री जोरदार पार्टी मारूया, जमून टाकूया आणि धमाल करूया!\"\n", @@ -167,9 +373,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
Logs\n",
+       "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ No messages.                                                                                            │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ │ It's such a beautiful day, I'm going to the beach.                                                      │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ │ ''                                                                                                      │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "
\n" + ], + "text/plain": [ + "Logs\n", + "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n", + " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m Messages \u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo messages.\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mIt's such a beautiful day, I'm going to the beach.\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m''\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "print(guard.history.last.tree)" ] @@ -186,7 +428,7 @@ ], "metadata": { "kernelspec": { - "display_name": "langchain", + "display_name": "311lite", "language": "python", "name": "python3" }, @@ -200,7 +442,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.1" + "version": "3.11.3" } }, "nbformat": 4, diff --git a/docs/examples/value_within_distribution.ipynb b/docs/examples/value_within_distribution.ipynb index fb3cffa20..dd2824853 100644 --- a/docs/examples/value_within_distribution.ipynb +++ b/docs/examples/value_within_distribution.ipynb @@ -41,16 +41,7 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n", - " from tqdm.autonotebook import tqdm, trange\n" - ] - } - ], + "outputs": [], "source": [ "# Create the Guard with the SimilarToList validator\n", "from typing import Union\n", @@ -190,7 +181,11 @@ "output_type": "stream", "text": [ "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", - " warnings.warn(\n" + " warnings.warn(\n", + "HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n" ] }, { @@ -225,7 +220,11 @@ "output_type": "stream", "text": [ "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", - " warnings.warn(\n" + " warnings.warn(\n", + "HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n", + "HTTP Request: POST https://api.openai.com/v1/embeddings \"HTTP/1.1 200 OK\"\n" ] }, { @@ -253,7 +252,7 @@ ], "metadata": { "kernelspec": { - "display_name": "litellm", + "display_name": "311lite", "language": "python", "name": "python3" }, @@ -267,7 +266,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.3" + "version": "3.11.3" }, "orig_nbformat": 4 }, From 27248aa0dc4487aa433ab5ba70cc8cad6aae6f54 Mon Sep 17 00:00:00 2001 From: David Tam Date: Fri, 11 Oct 2024 17:21:07 -0700 Subject: [PATCH 39/71] update docs for messages --- docs/concepts/async_streaming.ipynb | 6690 ++++++++++++++++- docs/concepts/error_remediation.md | 1 - docs/concepts/logs.md | 20 +- docs/concepts/streaming.ipynb | 44 +- docs/concepts/streaming_structured_data.ipynb | 701 +- .../guardrails_with_chat_models.ipynb | 35 +- docs/examples/input_validation.ipynb | 4 +- docs/examples/llamaindex-output-parsing.ipynb | 4 +- docs/faq.md | 12 +- docs/guardrails_ai/faq.md | 18 +- ...nuous_integration_continuous_deployment.md | 2 +- .../how_to_guides/generate_structured_data.md | 2 +- docs/how_to_guides/llm_api_wrappers.md | 17 +- docs/how_to_guides/use_on_fail_actions.ipynb | 4 +- docs/how_to_guides/using_llms.md | 14 +- 15 files changed, 7171 insertions(+), 397 deletions(-) diff --git a/docs/concepts/async_streaming.ipynb b/docs/concepts/async_streaming.ipynb index a7199852d..1ff42e65a 100644 --- a/docs/concepts/async_streaming.ipynb +++ b/docs/concepts/async_streaming.ipynb @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -77,15 +77,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Wrap the litellm OpenAI API call with the `guard` object\n", "raw_llm_output, validated_output, *rest = await guard(\n", - " litellm.acompletion,\n", " model=\"gpt-3.5-turbo\",\n", - " prompt=prompt,\n", + " messages=[{\n", + " \"role\": \"system\",\n", + " \"content\": prompt\n", + " }],\n", " max_tokens=1024,\n", " temperature=0.3,\n", ")" @@ -93,9 +95,101 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
Logs\n",
+       "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓                                                             │ │\n",
+       "    │ │ ┃   Role  Content                        ┃                                                             │ │\n",
+       "    │ │ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩                                                             │ │\n",
+       "    │ │ │ system │ Tell me about the Apple Iphone │                                                             │ │\n",
+       "    │ │ └────────┴────────────────────────────────┘                                                             │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ │ The iPhone is a line of smartphones designed and marketed by Apple Inc. It was first introduced in 2007 │ │\n",
+       "    │ │ by then-CEO Steve Jobs, revolutionizing the mobile phone industry with its innovative design and        │ │\n",
+       "    │ │ features. The iPhone runs on Apple's iOS operating system and is known for its sleek design,            │ │\n",
+       "    │ │ high-quality camera, and user-friendly interface.                                                       │ │\n",
+       "    │ │                                                                                                         │ │\n",
+       "    │ │ Over the years, Apple has released numerous models of the iPhone, each with upgraded features and       │ │\n",
+       "    │ │ capabilities. Some of the key features of the iPhone include Face ID facial recognition technology,     │ │\n",
+       "    │ │ Siri virtual assistant, and the App Store, which offers a wide range of apps for users to download.     │ │\n",
+       "    │ │                                                                                                         │ │\n",
+       "    │ │ The iPhone has become one of the most popular smartphones in the world, with a large and dedicated fan  │ │\n",
+       "    │ │ base. It is known for its high performance, reliability, and seamless integration with other Apple      │ │\n",
+       "    │ │ products and services. The iPhone continues to be a top-selling device, with new models being released  │ │\n",
+       "    │ │ regularly to keep up with the latest technological advancements.                                        │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ │ The iPhone is a line of smartphones designed and marketed by Apple Inc. It was first introduced in 2007 │ │\n",
+       "    │ │ by then-CEO Steve Jobs, revolutionizing the mobile phone industry with its innovative design and        │ │\n",
+       "    │ │ features. The iPhone runs on Apple's iOS operating system and is known for its sleek design,            │ │\n",
+       "    │ │ high-quality camera, and user-friendly interface.                                                       │ │\n",
+       "    │ │                                                                                                         │ │\n",
+       "    │ │ Over the years, Apple has released numerous models of the iPhone, each with upgraded features and       │ │\n",
+       "    │ │ capabilities. Some of the key features of the iPhone include Face ID facial recognition technology,     │ │\n",
+       "    │ │ Siri virtual assistant, and the App Store, which offers a wide range of apps for users to download.     │ │\n",
+       "    │ │                                                                                                         │ │\n",
+       "    │ │ The iPhone has become one of the most popular smartphones in the world, with a large and dedicated fan  │ │\n",
+       "    │ │ base. It is known for its high performance, reliability, and seamless integration with other Apple      │ │\n",
+       "    │ │ products and services. The iPhone continues to be a top-selling device, with new models being released  │ │\n",
+       "    │ │ regularly to keep up with the latest technological advancements.                                        │ │\n",
+       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
+       "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "
\n" + ], + "text/plain": [ + "Logs\n", + "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n", + " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235m Role\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235msystem\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mTell me about the Apple Iphone\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└────────┴────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mThe iPhone is a line of smartphones designed and marketed by Apple Inc. It was first introduced in 2007\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mby then-CEO Steve Jobs, revolutionizing the mobile phone industry with its innovative design and \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mfeatures. The iPhone runs on Apple's iOS operating system and is known for its sleek design, \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mhigh-quality camera, and user-friendly interface.\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mOver the years, Apple has released numerous models of the iPhone, each with upgraded features and \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mcapabilities. Some of the key features of the iPhone include Face ID facial recognition technology, \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mSiri virtual assistant, and the App Store, which offers a wide range of apps for users to download.\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mThe iPhone has become one of the most popular smartphones in the world, with a large and dedicated fan \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mbase. It is known for its high performance, reliability, and seamless integration with other Apple \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mproducts and services. The iPhone continues to be a top-selling device, with new models being released \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mregularly to keep up with the latest technological advancements.\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mThe iPhone is a line of smartphones designed and marketed by Apple Inc. It was first introduced in 2007\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mby then-CEO Steve Jobs, revolutionizing the mobile phone industry with its innovative design and \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mfeatures. The iPhone runs on Apple's iOS operating system and is known for its sleek design, \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mhigh-quality camera, and user-friendly interface.\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mOver the years, Apple has released numerous models of the iPhone, each with upgraded features and \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mcapabilities. Some of the key features of the iPhone include Face ID facial recognition technology, \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mSiri virtual assistant, and the App Store, which offers a wide range of apps for users to download.\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mThe iPhone has become one of the most popular smartphones in the world, with a large and dedicated fan \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mbase. It is known for its high performance, reliability, and seamless integration with other Apple \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mproducts and services. The iPhone continues to be a top-selling device, with new models being released \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mregularly to keep up with the latest technological advancements.\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", + " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Let's see the logs\n", "print(guard.history.last.tree)" @@ -112,15 +206,51 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
ValidationOutcome(\n",
+       "    call_id='14626972736',\n",
+       "    raw_llm_output='Overall, the iPhone is known for its user-friendly interface, high-quality build, and strong \n",
+       "ecosystem of apps and services, making it a popular choice for consumers around the world.',\n",
+       "    validation_summaries=[],\n",
+       "    validated_output='\\n\\nOverall, the iPhone is known for its user-friendly interface, high-quality build, and \n",
+       "strong ecosystem of apps and services, making it a popular choice for consumers around the world.',\n",
+       "    reask=None,\n",
+       "    validation_passed=True,\n",
+       "    error=None\n",
+       ")\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mcall_id\u001b[0m=\u001b[32m'14626972736'\u001b[0m,\n", + " \u001b[33mraw_llm_output\u001b[0m=\u001b[32m'Overall, the iPhone is known for its user-friendly interface, high-quality build, and strong \u001b[0m\n", + "\u001b[32mecosystem of apps and services, making it a popular choice for consumers around the world.'\u001b[0m,\n", + " \u001b[33mvalidation_summaries\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", + " \u001b[33mvalidated_output\u001b[0m=\u001b[32m'\\n\\nOverall, the iPhone is known for its user-friendly interface, high-quality build, and \u001b[0m\n", + "\u001b[32mstrong ecosystem of apps and services, making it a popular choice for consumers around the world.'\u001b[0m,\n", + " \u001b[33mreask\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mvalidation_passed\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n", + " \u001b[33merror\u001b[0m=\u001b[3;35mNone\u001b[0m\n", + "\u001b[1m)\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Wrap the litellm OpenAI API call with the `guard` object\n", "fragment_generator = await guard(\n", - " litellm.acompletion,\n", " model=\"gpt-3.5-turbo\",\n", - " prompt=prompt,\n", + " messages=[{\n", + " \"role\": \"user\",\n", + " \"content\": prompt\n", + " }],\n", " max_tokens=1024,\n", " temperature=0,\n", " stream=True,\n", @@ -135,12 +265,6540 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
Call(\n",
+       "    id='14626972736',\n",
+       "    iterations=[\n",
+       "        Iteration(\n",
+       "            id='14626976016',\n",
+       "            index=0,\n",
+       "            call_id='14626972736',\n",
+       "            inputs=Inputs(\n",
+       "                llm_api=<guardrails.llm_providers.AsyncLiteLLMCallable object at 0x3677adbe0>,\n",
+       "                llm_output=None,\n",
+       "                instructions=None,\n",
+       "                prompt=None,\n",
+       "                messages=[{'role': 'user', 'content': Prompt(Tell me about the Apple Iphone)}],\n",
+       "                msg_history=None,\n",
+       "                prompt_params={},\n",
+       "                num_reasks=1,\n",
+       "                metadata={},\n",
+       "                full_schema_reask=False,\n",
+       "                stream=True\n",
+       "            ),\n",
+       "            outputs=Outputs(\n",
+       "                llm_response_info=LLMResponse(\n",
+       "                    prompt_token_count=None,\n",
+       "                    response_token_count=None,\n",
+       "                    output='',\n",
+       "                    stream_output=None,\n",
+       "                    async_stream_output=<openai.AsyncStream object at 0x3652e6c30>\n",
+       "                ),\n",
+       "                raw_output='',\n",
+       "                parsed_output='',\n",
+       "                validation_response='',\n",
+       "                guarded_output=None,\n",
+       "                reasks=[],\n",
+       "                validator_logs=[\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='',\n",
+       "                        value_after_validation='',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 595984),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 596421)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='The',\n",
+       "                        value_after_validation='The',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 596686),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 596991)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Apple',\n",
+       "                        value_after_validation=' Apple',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 614475),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 614755)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' iPhone',\n",
+       "                        value_after_validation=' iPhone',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 614961),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 615218)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' is',\n",
+       "                        value_after_validation=' is',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 615430),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 615682)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' a',\n",
+       "                        value_after_validation=' a',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 670812),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 671218)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' line',\n",
+       "                        value_after_validation=' line',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 671481),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 671803)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' of',\n",
+       "                        value_after_validation=' of',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 672055),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 672344)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' smartphones',\n",
+       "                        value_after_validation=' smartphones',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 706919),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 707343)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' designed',\n",
+       "                        value_after_validation=' designed',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 707646),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 708033)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' and',\n",
+       "                        value_after_validation=' and',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 708288),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 708584)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' marketed',\n",
+       "                        value_after_validation=' marketed',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 810433),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 811526)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' by',\n",
+       "                        value_after_validation=' by',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 812094),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 812644)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Apple',\n",
+       "                        value_after_validation=' Apple',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 812958),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 813405)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Inc',\n",
+       "                        value_after_validation=' Inc',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 886235),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 887491)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='.',\n",
+       "                        value_after_validation='.',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk='The Apple iPhone is a line of smartphones designed and marketed by \n",
+       "Apple Inc.'\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 888166),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 305913)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' It',\n",
+       "                        value_after_validation=' It',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 816172),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 817005)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' was',\n",
+       "                        value_after_validation=' was',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 817395),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 817899)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' first',\n",
+       "                        value_after_validation=' first',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 818301),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 818756)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' introduced',\n",
+       "                        value_after_validation=' introduced',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 819227),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 819594)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' in',\n",
+       "                        value_after_validation=' in',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 819870),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 820214)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' ',\n",
+       "                        value_after_validation=' ',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 820882),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 821200)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='200',\n",
+       "                        value_after_validation='200',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 821467),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 821787)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='7',\n",
+       "                        value_after_validation='7',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 822038),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 822317)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' by',\n",
+       "                        value_after_validation=' by',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 822545),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 822900)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' then',\n",
+       "                        value_after_validation=' then',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 823309),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 823665)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='-',\n",
+       "                        value_after_validation='-',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 823893),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 824182)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='CEO',\n",
+       "                        value_after_validation='CEO',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 824407),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 824704)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Steve',\n",
+       "                        value_after_validation=' Steve',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 825043),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 825329)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Jobs',\n",
+       "                        value_after_validation=' Jobs',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 825568),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 825864)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 826095),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 826378)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' and',\n",
+       "                        value_after_validation=' and',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 826677),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 826972)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' has',\n",
+       "                        value_after_validation=' has',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 827196),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 827470)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' since',\n",
+       "                        value_after_validation=' since',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 827690),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 827958)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' become',\n",
+       "                        value_after_validation=' become',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 828162),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 828411)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' one',\n",
+       "                        value_after_validation=' one',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 828668),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 829052)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' of',\n",
+       "                        value_after_validation=' of',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 829274),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 829598)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' the',\n",
+       "                        value_after_validation=' the',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 829842),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 830117)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' most',\n",
+       "                        value_after_validation=' most',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 830361),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 830657)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' popular',\n",
+       "                        value_after_validation=' popular',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 830865),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 831119)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' and',\n",
+       "                        value_after_validation=' and',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 831394),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 831874)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' iconic',\n",
+       "                        value_after_validation=' iconic',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 832075),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 832319)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' smartphones',\n",
+       "                        value_after_validation=' smartphones',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 832539),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 832801)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' in',\n",
+       "                        value_after_validation=' in',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 833001),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 833259)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' the',\n",
+       "                        value_after_validation=' the',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 833577),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 833825)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' world',\n",
+       "                        value_after_validation=' world',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 834022),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 834282)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='.\\n\\n',\n",
+       "                        value_after_validation='.\\n\\n',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=' It was first introduced in 2007 by then-CEO Steve Jobs, and has since\n",
+       "become one of the most popular and iconic smartphones in the world.'\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 834499),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 139296)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='The',\n",
+       "                        value_after_validation='The',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 648436),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 650081)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' iPhone',\n",
+       "                        value_after_validation=' iPhone',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 650634),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 651286)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' runs',\n",
+       "                        value_after_validation=' runs',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 651720),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 652308)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' on',\n",
+       "                        value_after_validation=' on',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 653011),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 653558)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Apple',\n",
+       "                        value_after_validation=' Apple',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 654044),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 654624)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=\"'s\",\n",
+       "                        value_after_validation=\"'s\",\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 655006),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 655417)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' iOS',\n",
+       "                        value_after_validation=' iOS',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 655704),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 656132)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' operating',\n",
+       "                        value_after_validation=' operating',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 656639),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 657088)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' system',\n",
+       "                        value_after_validation=' system',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 657506),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 657876)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' and',\n",
+       "                        value_after_validation=' and',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 658279),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 658883)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' features',\n",
+       "                        value_after_validation=' features',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 659435),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 660029)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' a',\n",
+       "                        value_after_validation=' a',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 660329),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 660920)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' sleek',\n",
+       "                        value_after_validation=' sleek',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 661445),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 662032)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' design',\n",
+       "                        value_after_validation=' design',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 662399),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 662961)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 663308),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 663734)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' high',\n",
+       "                        value_after_validation=' high',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 664093),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 664499)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='-quality',\n",
+       "                        value_after_validation='-quality',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 664865),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 665242)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' camera',\n",
+       "                        value_after_validation=' camera',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 665478),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 665800)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 666091),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 666412)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' and',\n",
+       "                        value_after_validation=' and',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 666643),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 667103)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' a',\n",
+       "                        value_after_validation=' a',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 667476),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 667778)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' wide',\n",
+       "                        value_after_validation=' wide',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 668031),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 668339)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' range',\n",
+       "                        value_after_validation=' range',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 668573),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 668841)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' of',\n",
+       "                        value_after_validation=' of',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 669133),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 669397)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' apps',\n",
+       "                        value_after_validation=' apps',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 669620),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 669895)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' available',\n",
+       "                        value_after_validation=' available',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 670135),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 670425)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' for',\n",
+       "                        value_after_validation=' for',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 670922),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 671167)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' download',\n",
+       "                        value_after_validation=' download',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 671365),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 671603)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' from',\n",
+       "                        value_after_validation=' from',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 671801),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 672041)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' the',\n",
+       "                        value_after_validation=' the',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 672241),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 672492)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' App',\n",
+       "                        value_after_validation=' App',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 672688),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 672916)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Store',\n",
+       "                        value_after_validation=' Store',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 673181),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 673432)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='.',\n",
+       "                        value_after_validation='.',\n",
+       "                        validation_result=FailResult(\n",
+       "                            outcome='fail',\n",
+       "                            error_message='Found the following competitors: Apple. Please avoid naming those \n",
+       "competitors next time',\n",
+       "                            fix_value=\"\\n\\nThe iPhone runs on [COMPETITOR]'s iOS operating system and features a \n",
+       "sleek design, high-quality camera, and a wide range of apps available for download from the App Store.\",\n",
+       "                            error_spans=[ErrorSpan(start=21, end=26, reason='Competitor was found: Apple')],\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=\"\\n\\nThe iPhone runs on Apple's iOS operating system and features a \n",
+       "sleek design, high-quality camera, and a wide range of apps available for download from the App Store.\"\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 673634),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 947419)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Over',\n",
+       "                        value_after_validation=' Over',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 459976),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 461493)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' the',\n",
+       "                        value_after_validation=' the',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 462148),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 463054)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' years',\n",
+       "                        value_after_validation=' years',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 463569),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 464154)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 464703),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 465225)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Apple',\n",
+       "                        value_after_validation=' Apple',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 465869),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 466377)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' has',\n",
+       "                        value_after_validation=' has',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 466722),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 467174)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' released',\n",
+       "                        value_after_validation=' released',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 467499),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 467868)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' multiple',\n",
+       "                        value_after_validation=' multiple',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 468201),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 468583)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' models',\n",
+       "                        value_after_validation=' models',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 469070),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 469509)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' of',\n",
+       "                        value_after_validation=' of',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 469870),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 470454)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' the',\n",
+       "                        value_after_validation=' the',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 470860),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 471344)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' iPhone',\n",
+       "                        value_after_validation=' iPhone',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 471796),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 472716)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 473340),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 474038)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' each',\n",
+       "                        value_after_validation=' each',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 474427),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 474875)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' with',\n",
+       "                        value_after_validation=' with',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 475393),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 475775)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' new',\n",
+       "                        value_after_validation=' new',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 476039),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 476355)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' features',\n",
+       "                        value_after_validation=' features',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 476609),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 476925)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' and',\n",
+       "                        value_after_validation=' and',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 477243),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 477538)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' improvements',\n",
+       "                        value_after_validation=' improvements',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 477760),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 478072)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' in',\n",
+       "                        value_after_validation=' in',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 478413),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 478740)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' performance',\n",
+       "                        value_after_validation=' performance',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 478983),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 479262)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='.\\n\\n',\n",
+       "                        value_after_validation='.\\n\\n',\n",
+       "                        validation_result=FailResult(\n",
+       "                            outcome='fail',\n",
+       "                            error_message='Found the following competitors: Apple. Please avoid naming those \n",
+       "competitors next time',\n",
+       "                            fix_value=' Over the years, [COMPETITOR] has released multiple models of the iPhone, \n",
+       "each with new features and improvements in performance.',\n",
+       "                            error_spans=[ErrorSpan(start=17, end=22, reason='Competitor was found: Apple')],\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=' Over the years, Apple has released multiple models of the iPhone, \n",
+       "each with new features and improvements in performance.'\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 479488),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 768497)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='Some',\n",
+       "                        value_after_validation='Some',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 281787),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 282862)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' key',\n",
+       "                        value_after_validation=' key',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 283444),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 284180)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' features',\n",
+       "                        value_after_validation=' features',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 284667),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 285290)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' of',\n",
+       "                        value_after_validation=' of',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 285904),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 286383)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' the',\n",
+       "                        value_after_validation=' the',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 286731),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 287406)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' iPhone',\n",
+       "                        value_after_validation=' iPhone',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 287738),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 288437)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' include',\n",
+       "                        value_after_validation=' include',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 288851),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 289408)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Face',\n",
+       "                        value_after_validation=' Face',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 289857),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 291341)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' ID',\n",
+       "                        value_after_validation=' ID',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 291729),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 292196)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' facial',\n",
+       "                        value_after_validation=' facial',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 292729),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 293238)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' recognition',\n",
+       "                        value_after_validation=' recognition',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 293654),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 294064)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' technology',\n",
+       "                        value_after_validation=' technology',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 294677),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 295403)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 295728),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 296112)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Siri',\n",
+       "                        value_after_validation=' Siri',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 296366),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 296647)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' virtual',\n",
+       "                        value_after_validation=' virtual',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 296870),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 297244)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' assistant',\n",
+       "                        value_after_validation=' assistant',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 297960),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 298310)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 298578),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 299094)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' and',\n",
+       "                        value_after_validation=' and',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 299321),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 299608)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Apple',\n",
+       "                        value_after_validation=' Apple',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 299926),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 300272)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Pay',\n",
+       "                        value_after_validation=' Pay',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 300579),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 300917)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' for',\n",
+       "                        value_after_validation=' for',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 301140),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 301449)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' contact',\n",
+       "                        value_after_validation=' contact',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 301784),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 302077)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='less',\n",
+       "                        value_after_validation='less',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 302308),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 302570)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' payments',\n",
+       "                        value_after_validation=' payments',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 302806),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 303086)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='.',\n",
+       "                        value_after_validation='.',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk='\\n\\nSome key features of the iPhone include Face ID facial recognition\n",
+       "technology, Siri virtual assistant, and Apple Pay for contactless payments.'\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 303335),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 692659)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' The',\n",
+       "                        value_after_validation=' The',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 205975),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 206697)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' iPhone',\n",
+       "                        value_after_validation=' iPhone',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 207254),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 207637)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' also',\n",
+       "                        value_after_validation=' also',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 207904),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 208290)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' integrates',\n",
+       "                        value_after_validation=' integrates',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 208684),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 209054)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' seamlessly',\n",
+       "                        value_after_validation=' seamlessly',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 209289),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 209568)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' with',\n",
+       "                        value_after_validation=' with',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 209887),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 210208)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' other',\n",
+       "                        value_after_validation=' other',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 210457),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 210740)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Apple',\n",
+       "                        value_after_validation=' Apple',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 210962),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 211231)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' products',\n",
+       "                        value_after_validation=' products',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 211463),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 211730)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 212016),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 212284)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' such',\n",
+       "                        value_after_validation=' such',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 212511),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 212780)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' as',\n",
+       "                        value_after_validation=' as',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 213006),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 213346)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' the',\n",
+       "                        value_after_validation=' the',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 213750),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 214088)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Apple',\n",
+       "                        value_after_validation=' Apple',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 214282),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 214530)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Watch',\n",
+       "                        value_after_validation=' Watch',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 214749),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 215101)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 215332),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 215574)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Air',\n",
+       "                        value_after_validation=' Air',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 215777),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 216008)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='Pod',\n",
+       "                        value_after_validation='Pod',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 216201),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 217451)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='s',\n",
+       "                        value_after_validation='s',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 217746),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 218020)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 218236),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 218484)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' and',\n",
+       "                        value_after_validation=' and',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 218681),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 218914)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' Mac',\n",
+       "                        value_after_validation=' Mac',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 219115),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 219353)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' computers',\n",
+       "                        value_after_validation=' computers',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 219551),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 219780)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='.\\n\\n',\n",
+       "                        value_after_validation='.\\n\\n',\n",
+       "                        validation_result=FailResult(\n",
+       "                            outcome='fail',\n",
+       "                            error_message='Found the following competitors: Apple. Please avoid naming those \n",
+       "competitors next time',\n",
+       "                            fix_value=' The iPhone also integrates seamlessly with other [COMPETITOR] products, \n",
+       "such as the [COMPETITOR] Watch, AirPods, and Mac computers.',\n",
+       "                            error_spans=[\n",
+       "                                ErrorSpan(start=50, end=55, reason='Competitor was found: Apple'),\n",
+       "                                ErrorSpan(start=78, end=83, reason='Competitor was found: Apple'),\n",
+       "                                ErrorSpan(start=50, end=55, reason='Competitor was found: Apple'),\n",
+       "                                ErrorSpan(start=78, end=83, reason='Competitor was found: Apple')\n",
+       "                            ],\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=' The iPhone also integrates seamlessly with other Apple products, such\n",
+       "as the Apple Watch, AirPods, and Mac computers.'\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 219981),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 520706)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='Overall',\n",
+       "                        value_after_validation='Overall',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 29878),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 30861)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 31289),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 32043)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' the',\n",
+       "                        value_after_validation=' the',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 32525),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 33024)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' iPhone',\n",
+       "                        value_after_validation=' iPhone',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 33363),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 33884)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' is',\n",
+       "                        value_after_validation=' is',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 34303),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 34809)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' known',\n",
+       "                        value_after_validation=' known',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 35268),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 35631)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' for',\n",
+       "                        value_after_validation=' for',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 35885),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 36176)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' its',\n",
+       "                        value_after_validation=' its',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 36421),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 36720)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' user',\n",
+       "                        value_after_validation=' user',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 37066),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 37434)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='-friendly',\n",
+       "                        value_after_validation='-friendly',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 37763),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 38128)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' interface',\n",
+       "                        value_after_validation=' interface',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 38406),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 38723)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 39117),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 39430)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' high',\n",
+       "                        value_after_validation=' high',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 39654),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 39952)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='-quality',\n",
+       "                        value_after_validation='-quality',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 40103),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 40288)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' build',\n",
+       "                        value_after_validation=' build',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 40487),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 40785)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 41058),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 41353)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' and',\n",
+       "                        value_after_validation=' and',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 41578),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 41846)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' strong',\n",
+       "                        value_after_validation=' strong',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 42080),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 42504)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' ecosystem',\n",
+       "                        value_after_validation=' ecosystem',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 42725),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 42987)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' of',\n",
+       "                        value_after_validation=' of',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 43306),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 43610)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' apps',\n",
+       "                        value_after_validation=' apps',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 43840),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 44108)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' and',\n",
+       "                        value_after_validation=' and',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 44332),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 44601)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' services',\n",
+       "                        value_after_validation=' services',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 44889),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 45160)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=',',\n",
+       "                        value_after_validation=',',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 45388),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 45662)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' making',\n",
+       "                        value_after_validation=' making',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 45890),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 46149)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' it',\n",
+       "                        value_after_validation=' it',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 46428),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 46692)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' a',\n",
+       "                        value_after_validation=' a',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 46912),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 47177)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' popular',\n",
+       "                        value_after_validation=' popular',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 47422),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 47597)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' choice',\n",
+       "                        value_after_validation=' choice',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 47785),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 47948)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' for',\n",
+       "                        value_after_validation=' for',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 48139),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 48371)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' consumers',\n",
+       "                        value_after_validation=' consumers',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 48569),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 48805)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' around',\n",
+       "                        value_after_validation=' around',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 48999),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 49221)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' the',\n",
+       "                        value_after_validation=' the',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 49481),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 49722)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation=' world',\n",
+       "                        value_after_validation=' world',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 49922),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 50154)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='.',\n",
+       "                        value_after_validation='.',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk='\\n\\nOverall, the iPhone is known for its user-friendly interface, \n",
+       "high-quality build, and strong ecosystem of apps and services, making it a popular choice for consumers around the \n",
+       "world.'\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 50352),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 243639)\n",
+       "                    ),\n",
+       "                    ValidatorLogs(\n",
+       "                        validator_name='CompetitorCheck',\n",
+       "                        registered_name='guardrails/competitor_check',\n",
+       "                        instance_id=4403038784,\n",
+       "                        property_path='$',\n",
+       "                        value_before_validation='',\n",
+       "                        value_after_validation='',\n",
+       "                        validation_result=PassResult(\n",
+       "                            outcome='pass',\n",
+       "                            value_override=<class \n",
+       "'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,\n",
+       "                            metadata=None,\n",
+       "                            validated_chunk=None\n",
+       "                        ),\n",
+       "                        start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 756413),\n",
+       "                        end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 758181)\n",
+       "                    )\n",
+       "                ],\n",
+       "                error=None,\n",
+       "                exception=None\n",
+       "            )\n",
+       "        )\n",
+       "    ],\n",
+       "    inputs=CallInputs(\n",
+       "        llm_api=None,\n",
+       "        llm_output=None,\n",
+       "        instructions=None,\n",
+       "        prompt=None,\n",
+       "        msg_history=None,\n",
+       "        messages=[{'role': 'user', 'content': 'Tell me about the Apple Iphone'}],\n",
+       "        prompt_params={},\n",
+       "        num_reasks=1,\n",
+       "        metadata={},\n",
+       "        full_schema_reask=False,\n",
+       "        stream=False,\n",
+       "        args=[],\n",
+       "        kwargs={'model': 'gpt-3.5-turbo', 'max_tokens': 1024, 'temperature': 0, 'stream': True}\n",
+       "    ),\n",
+       "    exception=None\n",
+       ")\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1;35mCall\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mid\u001b[0m=\u001b[32m'14626972736'\u001b[0m,\n", + " \u001b[33miterations\u001b[0m=\u001b[1m[\u001b[0m\n", + " \u001b[1;35mIteration\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mid\u001b[0m=\u001b[32m'14626976016'\u001b[0m,\n", + " \u001b[33mindex\u001b[0m=\u001b[1;36m0\u001b[0m,\n", + " \u001b[33mcall_id\u001b[0m=\u001b[32m'14626972736'\u001b[0m,\n", + " \u001b[33minputs\u001b[0m=\u001b[1;35mInputs\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mllm_api\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mguardrails.llm_providers.AsyncLiteLLMCallable\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x3677adbe0\u001b[0m\u001b[39m>,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mllm_output\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstructions\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mprompt\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmessages\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m{\u001b[0m\u001b[32m'role'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'user'\u001b[0m\u001b[39m, \u001b[0m\u001b[32m'content'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mPrompt\u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mTell me about the Apple Iphone\u001b[0m\u001b[1;39m)\u001b[0m\u001b[1;39m}\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmsg_history\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mprompt_params\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m{\u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mnum_reasks\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m{\u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mfull_schema_reask\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstream\u001b[0m\u001b[39m=\u001b[0m\u001b[3;92mTrue\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutputs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mOutputs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mllm_response_info\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mLLMResponse\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mprompt_token_count\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mresponse_token_count\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutput\u001b[0m\u001b[39m=\u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstream_output\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33masync_stream_output\u001b[0m\u001b[39m=\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mraw_output\u001b[0m\u001b[39m=\u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mparsed_output\u001b[0m\u001b[39m=\u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_response\u001b[0m\u001b[39m=\u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mguarded_output\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mreasks\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_logs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m595984\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m596421\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'The'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'The'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m596686\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m596991\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m614475\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m614755\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iPhone'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iPhone'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m614961\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m615218\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' is'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' is'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m615430\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m615682\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' a'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' a'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m670812\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m671218\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' line'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' line'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m671481\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m671803\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' of'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' of'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m672055\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m672344\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' smartphones'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' smartphones'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m706919\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m707343\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' designed'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' designed'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m707646\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m708033\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m708288\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m708584\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' marketed'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' marketed'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m810433\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m811526\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' by'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' by'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m812094\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m812644\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m812958\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m813405\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Inc'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Inc'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m886235\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m887491\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'The Apple iPhone is a line of smartphones designed and marketed by \u001b[0m\n", + "\u001b[32mApple Inc.'\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m888166\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m305913\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' It'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' It'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m816172\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m817005\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' was'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' was'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m817395\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m817899\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' first'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' first'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m818301\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m818756\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' introduced'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' introduced'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m819227\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m819594\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' in'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' in'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m819870\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m820214\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' '\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' '\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m820882\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m821200\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'200'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'200'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m821467\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m821787\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'7'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'7'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m822038\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m822317\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' by'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' by'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m822545\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m822900\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' then'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' then'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m823309\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m823665\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'-'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'-'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m823893\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m824182\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CEO'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CEO'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m824407\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m824704\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Steve'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Steve'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m825043\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m825329\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Jobs'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Jobs'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m825568\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m825864\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m826095\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m826378\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m826677\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m826972\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' has'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' has'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m827196\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m827470\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' since'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' since'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m827690\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m827958\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' become'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' become'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m828162\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m828411\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' one'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' one'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m828668\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m829052\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' of'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' of'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m829274\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m829598\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m829842\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m830117\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' most'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' most'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m830361\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m830657\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' popular'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' popular'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m830865\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m831119\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m831394\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m831874\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iconic'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iconic'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m832075\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m832319\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' smartphones'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' smartphones'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m832539\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m832801\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' in'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' in'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m833001\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m833259\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m833577\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m833825\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' world'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' world'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m834022\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m834282\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.\\n\\n'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.\\n\\n'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' It was first introduced in 2007 by then-CEO Steve Jobs, and has since\u001b[0m\n", + "\u001b[32mbecome one of the most popular and iconic smartphones in the world.'\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m834499\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m139296\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'The'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'The'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m648436\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m650081\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iPhone'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iPhone'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m650634\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m651286\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' runs'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' runs'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m651720\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m652308\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' on'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' on'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m653011\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m653558\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m654044\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m654624\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m\"'s\"\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m\"'s\"\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m655006\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m655417\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iOS'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iOS'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m655704\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m656132\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' operating'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' operating'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m656639\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m657088\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' system'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' system'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m657506\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m657876\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m658279\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m658883\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' features'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' features'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m659435\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m660029\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' a'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' a'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m660329\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m660920\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' sleek'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' sleek'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m661445\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m662032\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' design'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' design'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m662399\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m662961\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m663308\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m663734\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' high'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' high'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m664093\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m664499\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'-quality'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'-quality'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m664865\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m665242\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' camera'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' camera'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m665478\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m665800\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m666091\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m666412\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m666643\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m667103\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' a'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' a'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m667476\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m667778\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' wide'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' wide'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m668031\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m668339\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' range'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' range'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m668573\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m668841\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' of'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' of'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m669133\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m669397\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' apps'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' apps'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m669620\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m669895\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' available'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' available'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m670135\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m670425\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' for'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' for'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m670922\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m671167\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' download'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' download'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m671365\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m671603\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' from'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' from'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m671801\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m672041\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m672241\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m672492\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' App'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' App'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m672688\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m672916\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Store'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Store'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m673181\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m673432\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mFailResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'fail'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33merror_message\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Found the following competitors: Apple. Please avoid naming those \u001b[0m\n", + "\u001b[32mcompetitors next time'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mfix_value\u001b[0m\u001b[39m=\u001b[0m\u001b[32m\"\\n\\nThe iPhone runs on \u001b[0m\u001b[32m[\u001b[0m\u001b[32mCOMPETITOR\u001b[0m\u001b[32m]\u001b[0m\u001b[32m's iOS operating system and features a \u001b[0m\n", + "\u001b[32msleek design, high-quality camera, and a wide range of apps available for download from the App Store.\"\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33merror_spans\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;35mErrorSpan\u001b[0m\u001b[1;39m(\u001b[0m\u001b[33mstart\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m21\u001b[0m\u001b[39m, \u001b[0m\u001b[33mend\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m26\u001b[0m\u001b[39m, \u001b[0m\u001b[33mreason\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Competitor was found: Apple'\u001b[0m\u001b[1;39m)\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[32m\"\\n\\nThe iPhone runs on Apple's iOS operating system and features a \u001b[0m\n", + "\u001b[32msleek design, high-quality camera, and a wide range of apps available for download from the App Store.\"\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m673634\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m947419\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Over'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Over'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m459976\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m461493\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m462148\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m463054\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' years'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' years'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m463569\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m464154\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m464703\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m465225\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m465869\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m466377\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' has'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' has'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m466722\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m467174\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' released'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' released'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m467499\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m467868\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' multiple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' multiple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m468201\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m468583\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' models'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' models'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m469070\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m469509\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' of'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' of'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m469870\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m470454\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m470860\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m471344\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iPhone'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iPhone'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m471796\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m472716\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m473340\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m474038\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' each'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' each'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m474427\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m474875\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' with'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' with'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m475393\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m475775\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' new'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' new'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m476039\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m476355\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' features'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' features'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m476609\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m476925\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m477243\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m477538\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' improvements'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' improvements'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m477760\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m478072\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' in'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' in'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m478413\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m478740\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' performance'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' performance'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m478983\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m479262\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.\\n\\n'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.\\n\\n'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mFailResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'fail'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33merror_message\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Found the following competitors: Apple. Please avoid naming those \u001b[0m\n", + "\u001b[32mcompetitors next time'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mfix_value\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Over the years, \u001b[0m\u001b[32m[\u001b[0m\u001b[32mCOMPETITOR\u001b[0m\u001b[32m]\u001b[0m\u001b[32m has released multiple models of the iPhone, \u001b[0m\n", + "\u001b[32meach with new features and improvements in performance.'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33merror_spans\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;35mErrorSpan\u001b[0m\u001b[1;39m(\u001b[0m\u001b[33mstart\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m, \u001b[0m\u001b[33mend\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m22\u001b[0m\u001b[39m, \u001b[0m\u001b[33mreason\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Competitor was found: Apple'\u001b[0m\u001b[1;39m)\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Over the years, Apple has released multiple models of the iPhone, \u001b[0m\n", + "\u001b[32meach with new features and improvements in performance.'\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m479488\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m768497\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Some'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Some'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m281787\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m282862\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' key'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' key'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m283444\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m284180\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' features'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' features'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m284667\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m285290\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' of'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' of'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m285904\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m286383\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m286731\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m287406\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iPhone'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iPhone'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m287738\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m288437\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' include'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' include'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m288851\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m289408\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Face'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Face'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m289857\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m291341\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' ID'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' ID'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m291729\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m292196\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' facial'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' facial'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m292729\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m293238\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' recognition'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' recognition'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m293654\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m294064\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' technology'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' technology'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m294677\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m295403\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m295728\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m296112\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Siri'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Siri'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m296366\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m296647\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' virtual'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' virtual'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m296870\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m297244\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' assistant'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' assistant'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m297960\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m298310\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m298578\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m299094\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m299321\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m299608\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m299926\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m300272\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Pay'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Pay'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m300579\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m300917\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' for'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' for'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m301140\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m301449\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' contact'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' contact'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m301784\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m302077\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'less'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'less'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m302308\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m302570\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' payments'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' payments'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m302806\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m303086\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'\\n\\nSome key features of the iPhone include Face ID facial recognition\u001b[0m\n", + "\u001b[32mtechnology, Siri virtual assistant, and Apple Pay for contactless payments.'\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m303335\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m692659\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' The'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' The'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m205975\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m206697\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iPhone'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iPhone'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m207254\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m207637\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' also'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' also'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m207904\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m208290\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' integrates'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' integrates'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m208684\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m209054\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' seamlessly'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' seamlessly'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m209289\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m209568\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' with'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' with'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m209887\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m210208\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' other'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' other'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m210457\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m210740\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m210962\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m211231\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' products'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' products'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m211463\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m211730\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m212016\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m212284\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' such'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' such'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m212511\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m212780\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' as'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' as'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m213006\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m213346\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m213750\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m214088\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Apple'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m214282\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m214530\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Watch'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Watch'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m214749\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m215101\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m215332\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m215574\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Air'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Air'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m215777\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m216008\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Pod'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Pod'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m216201\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m217451\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m's'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m's'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m217746\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m218020\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m218236\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m218484\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m218681\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m218914\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Mac'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' Mac'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m219115\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m219353\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' computers'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' computers'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m219551\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m219780\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.\\n\\n'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.\\n\\n'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mFailResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'fail'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33merror_message\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Found the following competitors: Apple. Please avoid naming those \u001b[0m\n", + "\u001b[32mcompetitors next time'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mfix_value\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' The iPhone also integrates seamlessly with other \u001b[0m\u001b[32m[\u001b[0m\u001b[32mCOMPETITOR\u001b[0m\u001b[32m]\u001b[0m\u001b[32m products, \u001b[0m\n", + "\u001b[32msuch as the \u001b[0m\u001b[32m[\u001b[0m\u001b[32mCOMPETITOR\u001b[0m\u001b[32m]\u001b[0m\u001b[32m Watch, AirPods, and Mac computers.'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33merror_spans\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mErrorSpan\u001b[0m\u001b[1;39m(\u001b[0m\u001b[33mstart\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m50\u001b[0m\u001b[39m, \u001b[0m\u001b[33mend\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m55\u001b[0m\u001b[39m, \u001b[0m\u001b[33mreason\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Competitor was found: Apple'\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mErrorSpan\u001b[0m\u001b[1;39m(\u001b[0m\u001b[33mstart\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m78\u001b[0m\u001b[39m, \u001b[0m\u001b[33mend\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m83\u001b[0m\u001b[39m, \u001b[0m\u001b[33mreason\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Competitor was found: Apple'\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mErrorSpan\u001b[0m\u001b[1;39m(\u001b[0m\u001b[33mstart\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m50\u001b[0m\u001b[39m, \u001b[0m\u001b[33mend\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m55\u001b[0m\u001b[39m, \u001b[0m\u001b[33mreason\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Competitor was found: Apple'\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mErrorSpan\u001b[0m\u001b[1;39m(\u001b[0m\u001b[33mstart\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m78\u001b[0m\u001b[39m, \u001b[0m\u001b[33mend\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m83\u001b[0m\u001b[39m, \u001b[0m\u001b[33mreason\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Competitor was found: Apple'\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' The iPhone also integrates seamlessly with other Apple products, such\u001b[0m\n", + "\u001b[32mas the Apple Watch, AirPods, and Mac computers.'\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m219981\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m520706\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Overall'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Overall'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m29878\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m30861\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m31289\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m32043\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m32525\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m33024\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iPhone'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' iPhone'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m33363\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m33884\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' is'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' is'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m34303\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m34809\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' known'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' known'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m35268\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m35631\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' for'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' for'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m35885\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m36176\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' its'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' its'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m36421\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m36720\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' user'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' user'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m37066\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m37434\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'-friendly'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'-friendly'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m37763\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m38128\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' interface'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' interface'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m38406\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m38723\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m39117\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m39430\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' high'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' high'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m39654\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m39952\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'-quality'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'-quality'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m40103\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m40288\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' build'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' build'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m40487\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m40785\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m41058\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m41353\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m41578\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m41846\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' strong'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' strong'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m42080\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m42504\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' ecosystem'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' ecosystem'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m42725\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m42987\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' of'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' of'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m43306\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m43610\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' apps'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' apps'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m43840\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m44108\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' and'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m44332\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m44601\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' services'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' services'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m44889\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m45160\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m','\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m45388\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m45662\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' making'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' making'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m45890\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m46149\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' it'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' it'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m46428\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m46692\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' a'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' a'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m46912\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m47177\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' popular'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' popular'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m47422\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m47597\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' choice'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' choice'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m47785\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m47948\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' for'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' for'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m48139\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m48371\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' consumers'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' consumers'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m48569\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m48805\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' around'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' around'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m48999\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m49221\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' the'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m49481\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m49722\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' world'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m' world'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m49922\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m50154\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'.'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mmetadata\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidated_chunk\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'\\n\\nOverall, the iPhone is known for its user-friendly interface, \u001b[0m\n", + "\u001b[32mhigh-quality build, and strong ecosystem of apps and services, making it a popular choice for consumers around the \u001b[0m\n", + "\u001b[32mworld.'\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mstart_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m50352\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mend_time\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m243639\u001b[0m\u001b[1;39m)\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[1;35mValidatorLogs\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidator_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'CompetitorCheck'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mregistered_name\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'guardrails/competitor_check'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33minstance_id\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4403038784\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mproperty_path\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'$'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_before_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_after_validation\u001b[0m\u001b[39m=\u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalidation_result\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mPassResult\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33moutcome\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'pass'\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[39m \u001b[0m\u001b[33mvalue_override\u001b[0m\u001b[39m=\u001b[0m,\n", + " \u001b[33mmetadata\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mvalidated_chunk\u001b[0m=\u001b[3;35mNone\u001b[0m\n", + " \u001b[1m)\u001b[0m,\n", + " \u001b[33mstart_time\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m15\u001b[0m, \u001b[1;36m16\u001b[0m, \u001b[1;36m756413\u001b[0m\u001b[1m)\u001b[0m,\n", + " \u001b[33mend_time\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m10\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m15\u001b[0m, \u001b[1;36m16\u001b[0m, \u001b[1;36m758181\u001b[0m\u001b[1m)\u001b[0m\n", + " \u001b[1m)\u001b[0m\n", + " \u001b[1m]\u001b[0m,\n", + " \u001b[33merror\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mexception\u001b[0m=\u001b[3;35mNone\u001b[0m\n", + " \u001b[1m)\u001b[0m\n", + " \u001b[1m)\u001b[0m\n", + " \u001b[1m]\u001b[0m,\n", + " \u001b[33minputs\u001b[0m=\u001b[1;35mCallInputs\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mllm_api\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mllm_output\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33minstructions\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mprompt\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mmsg_history\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mmessages\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'role'\u001b[0m: \u001b[32m'user'\u001b[0m, \u001b[32m'content'\u001b[0m: \u001b[32m'Tell me about the Apple Iphone'\u001b[0m\u001b[1m}\u001b[0m\u001b[1m]\u001b[0m,\n", + " \u001b[33mprompt_params\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[33mnum_reasks\u001b[0m=\u001b[1;36m1\u001b[0m,\n", + " \u001b[33mmetadata\u001b[0m=\u001b[1m{\u001b[0m\u001b[1m}\u001b[0m,\n", + " \u001b[33mfull_schema_reask\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", + " \u001b[33mstream\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", + " \u001b[33margs\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", + " \u001b[33mkwargs\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'model'\u001b[0m: \u001b[32m'gpt-3.5-turbo'\u001b[0m, \u001b[32m'max_tokens'\u001b[0m: \u001b[1;36m1024\u001b[0m, \u001b[32m'temperature'\u001b[0m: \u001b[1;36m0\u001b[0m, \u001b[32m'stream'\u001b[0m: \u001b[3;92mTrue\u001b[0m\u001b[1m}\u001b[0m\n", + " \u001b[1m)\u001b[0m,\n", + " \u001b[33mexception\u001b[0m=\u001b[3;35mNone\u001b[0m\n", + "\u001b[1m)\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Let's see the logs\n", - "print(guard.history.last.tree)" + "print(guard.history.last)" ] }, { @@ -157,7 +6815,7 @@ ], "metadata": { "kernelspec": { - "display_name": "guard-venv", + "display_name": "litellm", "language": "python", "name": "python3" }, @@ -171,7 +6829,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.8" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/concepts/error_remediation.md b/docs/concepts/error_remediation.md index 05f03d60b..a9a7c213d 100644 --- a/docs/concepts/error_remediation.md +++ b/docs/concepts/error_remediation.md @@ -18,7 +18,6 @@ Note that this list is not exhaustive of the possible errors that could occur. ```log The callable `fn` passed to `Guard(fn, ...)` failed with the following error: {Root error message here!}. -Make sure that `fn` can be called as a function that takes in a single prompt string and returns a string. ``` diff --git a/docs/concepts/logs.md b/docs/concepts/logs.md index 4a3e41b5a..cbdff6eb7 100644 --- a/docs/concepts/logs.md +++ b/docs/concepts/logs.md @@ -33,17 +33,17 @@ docs/html/single-step-history.html ## Calls ### Initial Input -Inital inputs like prompt and instructions from a call are available on each call. +Initial inputs like messages from a call are available on each call. ```py first_call = my_guard.history.first -print("prompt\n-----") -print(first_call.prompt) +print("message\n-----") +print(first_call.messages[0]["content"]) print("prompt params\n------------- ") print(first_call.prompt_params) ``` ```log -prompt +message ----- You are a human in an enchanted forest. You come across opponents of different types. You should fight smaller opponents, run away from bigger ones, and freeze if the opponent is a bear. @@ -67,18 +67,6 @@ prompt params {'opp_type': 'grizzly'} ``` -Note: Input messages and msg_history currently can be accessed through iterations -```py -print(guard.history.last.iterations.last.inputs.msg_history) -``` -```log -[ - {"role":"system","content":"You are a helpful assistant."}, - {"role":"user","content":"Tell me a joke"} -] -``` - - ### Final Output Final output of call is accessible on a call. ```py diff --git a/docs/concepts/streaming.ipynb b/docs/concepts/streaming.ipynb index 384b3cb03..8882bade7 100644 --- a/docs/concepts/streaming.ipynb +++ b/docs/concepts/streaming.ipynb @@ -19,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -51,12 +51,41 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
ValidationOutcome(\n",
+       "    call_id='14148119808',\n",
+       "    raw_llm_output='.',\n",
+       "    validation_summaries=[],\n",
+       "    validated_output='.',\n",
+       "    reask=None,\n",
+       "    validation_passed=True,\n",
+       "    error=None\n",
+       ")\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n", + " \u001b[33mcall_id\u001b[0m=\u001b[32m'14148119808'\u001b[0m,\n", + " \u001b[33mraw_llm_output\u001b[0m=\u001b[32m'.'\u001b[0m,\n", + " \u001b[33mvalidation_summaries\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", + " \u001b[33mvalidated_output\u001b[0m=\u001b[32m'.'\u001b[0m,\n", + " \u001b[33mreask\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", + " \u001b[33mvalidation_passed\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n", + " \u001b[33merror\u001b[0m=\u001b[3;35mNone\u001b[0m\n", + "\u001b[1m)\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "fragment_generator = guard(\n", - " litellm.completion,\n", " model=\"gpt-4o\",\n", " messages=[\n", " {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n", @@ -116,7 +145,6 @@ "guard = gd.Guard()\n", "\n", "fragment_generator = await guard(\n", - " litellm.completion,\n", " model=\"gpt-3.5-turbo\",\n", " messages=[\n", " {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n", @@ -137,7 +165,7 @@ ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "litellm", "language": "python", "name": "python3" }, @@ -151,7 +179,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.8" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/concepts/streaming_structured_data.ipynb b/docs/concepts/streaming_structured_data.ipynb index f2f30e8e2..909e986ad 100644 --- a/docs/concepts/streaming_structured_data.ipynb +++ b/docs/concepts/streaming_structured_data.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -32,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -62,7 +62,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -126,7 +126,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -144,14 +144,14 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/home/zayd/workspace/guardrails/docs/.venv/lib/python3.11/site-packages/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", " warnings.warn(\n" ] }, @@ -167,7 +167,7 @@ " {'symptom': 'flaky', 'affected_area': 'eyebrows'},\n", " {'symptom': 'slightly scaly', 'affected_area': 'nares'}\n", " ],\n", - " 'current_meds': [{'medication': 'OTC STEROID CREAM', 'response': 'Moderate'}],\n", + " 'current_meds': [{'medication': 'OTC STEROID CREAM', 'response': 'moderate'}],\n", " 'miscellaneous': 'patient also suffers from diabetes'\n", "}\n", "\n" @@ -182,7 +182,7 @@ " \u001b[1m{\u001b[0m\u001b[32m'symptom'\u001b[0m: \u001b[32m'flaky'\u001b[0m, \u001b[32m'affected_area'\u001b[0m: \u001b[32m'eyebrows'\u001b[0m\u001b[1m}\u001b[0m,\n", " \u001b[1m{\u001b[0m\u001b[32m'symptom'\u001b[0m: \u001b[32m'slightly scaly'\u001b[0m, \u001b[32m'affected_area'\u001b[0m: \u001b[32m'nares'\u001b[0m\u001b[1m}\u001b[0m\n", " \u001b[1m]\u001b[0m,\n", - " \u001b[32m'current_meds'\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'medication'\u001b[0m: \u001b[32m'OTC STEROID CREAM'\u001b[0m, \u001b[32m'response'\u001b[0m: \u001b[32m'Moderate'\u001b[0m\u001b[1m}\u001b[0m\u001b[1m]\u001b[0m,\n", + " \u001b[32m'current_meds'\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'medication'\u001b[0m: \u001b[32m'OTC STEROID CREAM'\u001b[0m, \u001b[32m'response'\u001b[0m: \u001b[32m'moderate'\u001b[0m\u001b[1m}\u001b[0m\u001b[1m]\u001b[0m,\n", " \u001b[32m'miscellaneous'\u001b[0m: \u001b[32m'patient also suffers from diabetes'\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] @@ -194,9 +194,8 @@ "source": [ "# Wrap the litellm OpenAI API call with the `guard` object\n", "raw_llm_output, validated_output, *rest = guard(\n", - " litellm.completion,\n", " model=\"gpt-3.5-turbo\",\n", - " prompt=prompt,\n", + " messages=[{\"role\":\"user\", \"content\":prompt}],\n", " prompt_params={\"doctors_notes\": doctors_notes},\n", " max_tokens=1024,\n", " temperature=0.3,\n", @@ -208,7 +207,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -216,64 +215,68 @@ "text/html": [ "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Given the following doctor's notes about a patient, please extract a dictionary that contains the       │ │\n",
-       "    │ │ patient's information.                                                                                  │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ 152 y/o female with chronic macular rash to face and hair, worse in beard, eyebrows and nares.          │ │\n",
-       "    │ │ The rash is itchy, flaky and slightly scaly. Moderate response to OTC steroid cream. Patient has been   │ │\n",
-       "    │ │ using cream for 2 weeks and also suffers from diabetes.                                                 │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Given below is XML that describes the information to extract from this document and the tags to extract │ │\n",
-       "    │ │ it into.                                                                                                │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ <output>                                                                                                │ │\n",
-       "    │ │   <string description=\"Patient's gender\" name=\"gender\" required=\"true\"></string>                        │ │\n",
-       "    │ │   <integer description=\"Patient's age\" format=\"guardrails/valid_range: 0 100\" name=\"age\"                │ │\n",
-       "    │ │ required=\"true\"></integer>                                                                              │ │\n",
-       "    │ │   <list description=\"Symptoms that the patient is currently experiencing. Each symptom should be        │ │\n",
-       "    │ │ classified into  separate item in the list.\" name=\"symptoms\" required=\"true\">                           │ │\n",
-       "    │ │     <object required=\"true\">                                                                            │ │\n",
-       "    │ │       <string description=\"Symptom that a patient is experiencing\" name=\"symptom\"                       │ │\n",
-       "    │ │ required=\"true\"></string>                                                                               │ │\n",
-       "    │ │       <string description=\"What part of the body the symptom is affecting\"                              │ │\n",
-       "    │ │ format=\"guardrails/lowercase\" name=\"affected_area\" required=\"true\"></string>                            │ │\n",
-       "    │ │     </object>                                                                                           │ │\n",
-       "    │ │   </list>                                                                                               │ │\n",
-       "    │ │   <list description=\"Medications the patient is currently taking and their response\"                    │ │\n",
-       "    │ │ name=\"current_meds\" required=\"true\">                                                                    │ │\n",
-       "    │ │     <object required=\"true\">                                                                            │ │\n",
-       "    │ │       <string description=\"Name of the medication the patient is taking\" format=\"guardrails/uppercase\"  │ │\n",
-       "    │ │ name=\"medication\" required=\"true\"></string>                                                             │ │\n",
-       "    │ │       <string description=\"How the patient is responding to the medication\" name=\"response\"             │ │\n",
-       "    │ │ required=\"true\"></string>                                                                               │ │\n",
-       "    │ │     </object>                                                                                           │ │\n",
-       "    │ │   </list>                                                                                               │ │\n",
-       "    │ │   <string description=\"Any other information that is relevant to the patient's health; something that   │ │\n",
-       "    │ │ doesn't fit into the other categories.\" format=\"guardrails/lowercase; guardrails/one_line\"              │ │\n",
-       "    │ │ name=\"miscellaneous\" required=\"true\"></string>                                                          │ │\n",
-       "    │ │ </output>                                                                                               │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the │ │\n",
-       "    │ │ `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding  │ │\n",
-       "    │ │ XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g.        │ │\n",
-       "    │ │ requests for lists, objects and specific types. Be correct and concise.                                 │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:                          │ │\n",
-       "    │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`                     │ │\n",
-       "    │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO',     │ │\n",
-       "    │ │ etc.]}`                                                                                                 │ │\n",
-       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
-       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
+       "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ user │                                                                                              │ │ │\n",
+       "    │ │ │      │ Given the following doctor's notes about a patient, please extract a dictionary that         │ │ │\n",
+       "    │ │ │      │ contains the patient's information.                                                          │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ 152 y/o female with chronic macular rash to face and hair, worse in beard, eyebrows and      │ │ │\n",
+       "    │ │ │      │ nares.                                                                                       │ │ │\n",
+       "    │ │ │      │ The rash is itchy, flaky and slightly scaly. Moderate response to OTC steroid cream. Patient │ │ │\n",
+       "    │ │ │      │ has been using cream for 2 weeks and also suffers from diabetes.                             │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Given below is XML that describes the information to extract from this document and the tags │ │ │\n",
+       "    │ │ │      │ to extract it into.                                                                          │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ <output>                                                                                     │ │ │\n",
+       "    │ │ │      │   <string description=\"Patient's gender\" name=\"gender\" required=\"true\"></string>             │ │ │\n",
+       "    │ │ │      │   <integer description=\"Patient's age\" format=\"guardrails/valid_range: 0 100\" name=\"age\"     │ │ │\n",
+       "    │ │ │      │ required=\"true\"></integer>                                                                   │ │ │\n",
+       "    │ │ │      │   <list description=\"Symptoms that the patient is currently experiencing. Each symptom       │ │ │\n",
+       "    │ │ │      │ should be classified into  separate item in the list.\" name=\"symptoms\" required=\"true\">      │ │ │\n",
+       "    │ │ │      │     <object required=\"true\">                                                                 │ │ │\n",
+       "    │ │ │      │       <string description=\"Symptom that a patient is experiencing\" name=\"symptom\"            │ │ │\n",
+       "    │ │ │      │ required=\"true\"></string>                                                                    │ │ │\n",
+       "    │ │ │      │       <string description=\"What part of the body the symptom is affecting\"                   │ │ │\n",
+       "    │ │ │      │ format=\"guardrails/lowercase\" name=\"affected_area\" required=\"true\"></string>                 │ │ │\n",
+       "    │ │ │      │     </object>                                                                                │ │ │\n",
+       "    │ │ │      │   </list>                                                                                    │ │ │\n",
+       "    │ │ │      │   <list description=\"Medications the patient is currently taking and their response\"         │ │ │\n",
+       "    │ │ │      │ name=\"current_meds\" required=\"true\">                                                         │ │ │\n",
+       "    │ │ │      │     <object required=\"true\">                                                                 │ │ │\n",
+       "    │ │ │      │       <string description=\"Name of the medication the patient is taking\"                     │ │ │\n",
+       "    │ │ │      │ format=\"guardrails/uppercase\" name=\"medication\" required=\"true\"></string>                    │ │ │\n",
+       "    │ │ │      │       <string description=\"How the patient is responding to the medication\" name=\"response\"  │ │ │\n",
+       "    │ │ │      │ required=\"true\"></string>                                                                    │ │ │\n",
+       "    │ │ │      │     </object>                                                                                │ │ │\n",
+       "    │ │ │      │   </list>                                                                                    │ │ │\n",
+       "    │ │ │      │   <string description=\"Any other information that is relevant to the patient's health;       │ │ │\n",
+       "    │ │ │      │ something that doesn't fit into the other categories.\" format=\"guardrails/lowercase;         │ │ │\n",
+       "    │ │ │      │ guardrails/one_line\" name=\"miscellaneous\" required=\"true\"></string>                          │ │ │\n",
+       "    │ │ │      │ </output>                                                                                    │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in  │ │ │\n",
+       "    │ │ │      │ JSON is the `name` attribute of the corresponding XML, and the value is of the type          │ │ │\n",
+       "    │ │ │      │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │ │\n",
+       "    │ │ │      │ any types and format requests e.g. requests for lists, objects and specific types. Be        │ │ │\n",
+       "    │ │ │      │ correct and concise.                                                                         │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:               │ │ │\n",
+       "    │ │ │      │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`          │ │ │\n",
+       "    │ │ │      │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',        │ │ │\n",
+       "    │ │ │      │ 'STRING TWO', etc.]}`                                                                        │ │ │\n",
+       "    │ │ │      │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer            │ │ │\n",
+       "    │ │ │      │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':     │ │ │\n",
+       "    │ │ │      │ 1}}`                                                                                         │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │     \"gender\": \"female\",                                                                                 │ │\n",
        "    │ │     \"age\": 152,                                                                                         │ │\n",
@@ -298,13 +301,13 @@
        "    │ │     \"current_meds\": [                                                                                   │ │\n",
        "    │ │         {                                                                                               │ │\n",
        "    │ │             \"medication\": \"OTC steroid cream\",                                                          │ │\n",
-       "    │ │             \"response\": \"Moderate\"                                                                      │ │\n",
+       "    │ │             \"response\": \"moderate\"                                                                      │ │\n",
        "    │ │         }                                                                                               │ │\n",
        "    │ │     ],                                                                                                  │ │\n",
        "    │ │     \"miscellaneous\": \"patient also suffers from diabetes\"                                               │ │\n",
        "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │     'gender': 'female',                                                                                 │ │\n",
        "    │ │     'age': 100,                                                                                         │ │\n",
@@ -315,7 +318,7 @@
        "    │ │         {'symptom': 'slightly scaly', 'affected_area': 'nares'}                                         │ │\n",
        "    │ │     ],                                                                                                  │ │\n",
        "    │ │     'current_meds': [                                                                                   │ │\n",
-       "    │ │         {'medication': 'OTC STEROID CREAM', 'response': 'Moderate'}                                     │ │\n",
+       "    │ │         {'medication': 'OTC STEROID CREAM', 'response': 'moderate'}                                     │ │\n",
        "    │ │     ],                                                                                                  │ │\n",
        "    │ │     'miscellaneous': 'patient also suffers from diabetes'                                               │ │\n",
        "    │ │ }                                                                                                       │ │\n",
@@ -326,64 +329,68 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m Prompt \u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mGiven the following doctor's notes about a patient, please extract a dictionary that contains the \u001b[0m\u001b[48;2;240;248;255m     \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mpatient's information.\u001b[0m\u001b[48;2;240;248;255m                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m152 y/o female with chronic macular rash to face and hair, worse in beard, eyebrows and nares.\u001b[0m\u001b[48;2;240;248;255m         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mThe rash is itchy, flaky and slightly scaly. Moderate response to OTC steroid cream. Patient has been \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255musing cream for 2 weeks and also suffers from diabetes.\u001b[0m\u001b[48;2;240;248;255m                                                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mGiven below is XML that describes the information to extract from this document and the tags to extract\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mit into.\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                             \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                           \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                           \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                           \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                            \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m`name` attribute of the corresponding XML, and the value is of the type specified by the corresponding \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mXML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mrequests for lists, objects and specific types. Be correct and concise.\u001b[0m\u001b[48;2;240;248;255m                                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mHere are examples of simple (XML, JSON) pairs that show the expected behavior:\u001b[0m\u001b[48;2;240;248;255m                         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m- `` => `{'foo': 'example one'}`\u001b[0m\u001b[48;2;240;248;255m                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m- `` => `{\"bar\": ['STRING ONE', 'STRING TWO', \u001b[0m\u001b[48;2;240;248;255m   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255metc.]}`\u001b[0m\u001b[48;2;240;248;255m                                                                                                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;240;248;255m                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m Message History \u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven the following doctor's notes about a patient, please extract a dictionary that        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcontains the patient's information.                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m152 y/o female with chronic macular rash to face and hair, worse in beard, eyebrows and     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mnares.                                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mThe rash is itchy, flaky and slightly scaly. Moderate response to OTC steroid cream. Patient\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mhas been using cream for 2 weeks and also suffers from diabetes.                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the tags\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mto extract it into.                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field in \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mJSON is the `name` attribute of the corresponding XML, and the value is of the type         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, including\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many types and format requests e.g. requests for lists, objects and specific types. Be       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcorrect and concise.                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior:              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}`         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE',       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}`                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index':    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}`                                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"gender\": \"female\",\u001b[0m\u001b[48;2;245;245;220m                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"age\": 152,\u001b[0m\u001b[48;2;245;245;220m                                                                                        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -408,13 +415,13 @@
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"current_meds\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"medication\": \"OTC steroid cream\",\u001b[0m\u001b[48;2;245;245;220m                                                         \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"response\": \"Moderate\"\u001b[0m\u001b[48;2;245;245;220m                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"response\": \"moderate\"\u001b[0m\u001b[48;2;245;245;220m                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        }\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    ],\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"miscellaneous\": \"patient also suffers from diabetes\"\u001b[0m\u001b[48;2;245;245;220m                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'gender': 'female',\u001b[0m\u001b[48;2;240;255;240m                                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'age': 100,\u001b[0m\u001b[48;2;240;255;240m                                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
@@ -425,7 +432,7 @@
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'symptom': 'slightly scaly', 'affected_area': 'nares'}\u001b[0m\u001b[48;2;240;255;240m                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ],\u001b[0m\u001b[48;2;240;255;240m                                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'current_meds': [\u001b[0m\u001b[48;2;240;255;240m                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'medication': 'OTC STEROID CREAM', 'response': 'Moderate'}\u001b[0m\u001b[48;2;240;255;240m                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'medication': 'OTC STEROID CREAM', 'response': 'moderate'}\u001b[0m\u001b[48;2;240;255;240m                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ],\u001b[0m\u001b[48;2;240;255;240m                                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'miscellaneous': 'patient also suffers from diabetes'\u001b[0m\u001b[48;2;240;255;240m                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
@@ -453,22 +460,22 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
        "
ValidationOutcome(\n",
-       "    call_id='129880225863456',\n",
+       "    call_id='14411405568',\n",
        "    raw_llm_output='{\\n    \"gender\": \"female\",\\n    \"age\": 152,\\n    \"symptoms\": [\\n        {\\n            \n",
        "\"symptom\": \"chronic macular rash\",\\n            \"affected_area\": \"face\"\\n        },\\n        {\\n            \n",
        "\"symptom\": \"itchy\",\\n            \"affected_area\": \"beard\"\\n        },\\n        {\\n            \"symptom\": \"flaky\",\\n\n",
        "\"affected_area\": \"eyebrows\"\\n        },\\n        {\\n            \"symptom\": \"slightly scaly\",\\n            \n",
        "\"affected_area\": \"nares\"\\n        }\\n    ],\\n    \"current_meds\": [\\n        {\\n            \"medication\": \"OTC \n",
-       "steroid cream\",\\n            \"response\": \"Moderate\"\\n        }\\n    ],\\n    \"miscellaneous\": \"patient also suffers \n",
+       "steroid cream\",\\n            \"response\": \"moderate\"\\n        }\\n    ],\\n    \"miscellaneous\": \"patient also suffers \n",
        "from diabetes\"\\n}',\n",
-       "    validation_summaries=None,\n",
+       "    validation_summaries=[],\n",
        "    validated_output={\n",
        "        'gender': 'female',\n",
        "        'age': 100,\n",
@@ -478,7 +485,7 @@
        "            {'symptom': 'flaky', 'affected_area': 'eyebrows'},\n",
        "            {'symptom': 'slightly scaly', 'affected_area': 'nares'}\n",
        "        ],\n",
-       "        'current_meds': [{'medication': 'OTC STEROID CREAM', 'response': 'Moderate'}],\n",
+       "        'current_meds': [{'medication': 'OTC STEROID CREAM', 'response': 'moderate'}],\n",
        "        'miscellaneous': 'patient also suffers from diabetes'\n",
        "    },\n",
        "    reask=None,\n",
@@ -489,15 +496,15 @@
       ],
       "text/plain": [
        "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n",
-       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'129880225863456'\u001b[0m,\n",
+       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'14411405568'\u001b[0m,\n",
        "    \u001b[33mraw_llm_output\u001b[0m=\u001b[32m'\u001b[0m\u001b[32m{\u001b[0m\u001b[32m\\n    \"gender\": \"female\",\\n    \"age\": 152,\\n    \"symptoms\": \u001b[0m\u001b[32m[\u001b[0m\u001b[32m\\n        \u001b[0m\u001b[32m{\u001b[0m\u001b[32m\\n            \u001b[0m\n",
        "\u001b[32m\"symptom\": \"chronic macular rash\",\\n            \"affected_area\": \"face\"\\n        \u001b[0m\u001b[32m}\u001b[0m\u001b[32m,\\n        \u001b[0m\u001b[32m{\u001b[0m\u001b[32m\\n            \u001b[0m\n",
        "\u001b[32m\"symptom\": \"itchy\",\\n            \"affected_area\": \"beard\"\\n        \u001b[0m\u001b[32m}\u001b[0m\u001b[32m,\\n        \u001b[0m\u001b[32m{\u001b[0m\u001b[32m\\n            \"symptom\": \"flaky\",\\n\u001b[0m\n",
        "\u001b[32m\"affected_area\": \"eyebrows\"\\n        \u001b[0m\u001b[32m}\u001b[0m\u001b[32m,\\n        \u001b[0m\u001b[32m{\u001b[0m\u001b[32m\\n            \"symptom\": \"slightly scaly\",\\n            \u001b[0m\n",
        "\u001b[32m\"affected_area\": \"nares\"\\n        \u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\n    \u001b[0m\u001b[32m]\u001b[0m\u001b[32m,\\n    \"current_meds\": \u001b[0m\u001b[32m[\u001b[0m\u001b[32m\\n        \u001b[0m\u001b[32m{\u001b[0m\u001b[32m\\n            \"medication\": \"OTC \u001b[0m\n",
-       "\u001b[32msteroid cream\",\\n            \"response\": \"Moderate\"\\n        \u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\n    \u001b[0m\u001b[32m]\u001b[0m\u001b[32m,\\n    \"miscellaneous\": \"patient also suffers \u001b[0m\n",
+       "\u001b[32msteroid cream\",\\n            \"response\": \"moderate\"\\n        \u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\n    \u001b[0m\u001b[32m]\u001b[0m\u001b[32m,\\n    \"miscellaneous\": \"patient also suffers \u001b[0m\n",
        "\u001b[32mfrom diabetes\"\\n\u001b[0m\u001b[32m}\u001b[0m\u001b[32m'\u001b[0m,\n",
-       "    \u001b[33mvalidation_summaries\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+       "    \u001b[33mvalidation_summaries\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
        "    \u001b[33mvalidated_output\u001b[0m=\u001b[1m{\u001b[0m\n",
        "        \u001b[32m'gender'\u001b[0m: \u001b[32m'female'\u001b[0m,\n",
        "        \u001b[32m'age'\u001b[0m: \u001b[1;36m100\u001b[0m,\n",
@@ -507,7 +514,7 @@
        "            \u001b[1m{\u001b[0m\u001b[32m'symptom'\u001b[0m: \u001b[32m'flaky'\u001b[0m, \u001b[32m'affected_area'\u001b[0m: \u001b[32m'eyebrows'\u001b[0m\u001b[1m}\u001b[0m,\n",
        "            \u001b[1m{\u001b[0m\u001b[32m'symptom'\u001b[0m: \u001b[32m'slightly scaly'\u001b[0m, \u001b[32m'affected_area'\u001b[0m: \u001b[32m'nares'\u001b[0m\u001b[1m}\u001b[0m\n",
        "        \u001b[1m]\u001b[0m,\n",
-       "        \u001b[32m'current_meds'\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'medication'\u001b[0m: \u001b[32m'OTC STEROID CREAM'\u001b[0m, \u001b[32m'response'\u001b[0m: \u001b[32m'Moderate'\u001b[0m\u001b[1m}\u001b[0m\u001b[1m]\u001b[0m,\n",
+       "        \u001b[32m'current_meds'\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'medication'\u001b[0m: \u001b[32m'OTC STEROID CREAM'\u001b[0m, \u001b[32m'response'\u001b[0m: \u001b[32m'moderate'\u001b[0m\u001b[1m}\u001b[0m\u001b[1m]\u001b[0m,\n",
        "        \u001b[32m'miscellaneous'\u001b[0m: \u001b[32m'patient also suffers from diabetes'\u001b[0m\n",
        "    \u001b[1m}\u001b[0m,\n",
        "    \u001b[33mreask\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
@@ -523,8 +530,8 @@
    "source": [
     "# Wrap the litellm OpenAI API call with the `guard` object\n",
     "fragment_generator = guard(\n",
-    "    litellm.completion,\n",
     "    model=\"gpt-3.5-turbo\",\n",
+    "    messages=[{\"role\":\"user\", \"content\":prompt}],\n",
     "    prompt_params={\"doctors_notes\": doctors_notes},\n",
     "    max_tokens=1024,\n",
     "    temperature=0,\n",
@@ -540,7 +547,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [
     {
@@ -548,67 +555,99 @@
       "text/html": [
        "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Given the following doctor's notes about a patient, please extract a dictionary that contains the       │ │\n",
-       "    │ │ patient's information.                                                                                  │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ 152 y/o female with chronic macular rash to face and hair, worse in beard, eyebrows and nares.          │ │\n",
-       "    │ │ The rash is itchy, flaky and slightly scaly. Moderate response to OTC steroid cream. Patient has been   │ │\n",
-       "    │ │ using cream for 2 weeks and also suffers from diabetes.                                                 │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Given below is XML that describes the information to extract from this document and the tags to extract │ │\n",
-       "    │ │ it into.                                                                                                │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ <output>                                                                                                │ │\n",
-       "    │ │   <string description=\"Patient's gender\" name=\"gender\" required=\"true\"></string>                        │ │\n",
-       "    │ │   <integer description=\"Patient's age\" format=\"guardrails/valid_range: 0 100\" name=\"age\"                │ │\n",
-       "    │ │ required=\"true\"></integer>                                                                              │ │\n",
-       "    │ │   <list description=\"Symptoms that the patient is currently experiencing. Each symptom should be        │ │\n",
-       "    │ │ classified into  separate item in the list.\" name=\"symptoms\" required=\"true\">                           │ │\n",
-       "    │ │     <object required=\"true\">                                                                            │ │\n",
-       "    │ │       <string description=\"Symptom that a patient is experiencing\" name=\"symptom\"                       │ │\n",
-       "    │ │ required=\"true\"></string>                                                                               │ │\n",
-       "    │ │       <string description=\"What part of the body the symptom is affecting\"                              │ │\n",
-       "    │ │ format=\"guardrails/lowercase\" name=\"affected_area\" required=\"true\"></string>                            │ │\n",
-       "    │ │     </object>                                                                                           │ │\n",
-       "    │ │   </list>                                                                                               │ │\n",
-       "    │ │   <list description=\"Medications the patient is currently taking and their response\"                    │ │\n",
-       "    │ │ name=\"current_meds\" required=\"true\">                                                                    │ │\n",
-       "    │ │     <object required=\"true\">                                                                            │ │\n",
-       "    │ │       <string description=\"Name of the medication the patient is taking\" format=\"guardrails/uppercase\"  │ │\n",
-       "    │ │ name=\"medication\" required=\"true\"></string>                                                             │ │\n",
-       "    │ │       <string description=\"How the patient is responding to the medication\" name=\"response\"             │ │\n",
-       "    │ │ required=\"true\"></string>                                                                               │ │\n",
-       "    │ │     </object>                                                                                           │ │\n",
-       "    │ │   </list>                                                                                               │ │\n",
-       "    │ │   <string description=\"Any other information that is relevant to the patient's health; something that   │ │\n",
-       "    │ │ doesn't fit into the other categories.\" format=\"guardrails/lowercase; guardrails/one_line\"              │ │\n",
-       "    │ │ name=\"miscellaneous\" required=\"true\"></string>                                                          │ │\n",
-       "    │ │ </output>                                                                                               │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the │ │\n",
-       "    │ │ `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding  │ │\n",
-       "    │ │ XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g.        │ │\n",
-       "    │ │ requests for lists, objects and specific types. Be correct and concise.                                 │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:                          │ │\n",
-       "    │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`                     │ │\n",
-       "    │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO',     │ │\n",
-       "    │ │ etc.]}`                                                                                                 │ │\n",
-       "    │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\"          │ │\n",
-       "    │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`                        │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
+       "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ user │                                                                                              │ │ │\n",
+       "    │ │ │      │ Given the following doctor's notes about a patient, please extract a dictionary that         │ │ │\n",
+       "    │ │ │      │ contains the patient's information.                                                          │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ 152 y/o female with chronic macular rash to face and hair, worse in beard, eyebrows and      │ │ │\n",
+       "    │ │ │      │ nares.                                                                                       │ │ │\n",
+       "    │ │ │      │ The rash is itchy, flaky and slightly scaly. Moderate response to OTC steroid cream. Patient │ │ │\n",
+       "    │ │ │      │ has been using cream for 2 weeks and also suffers from diabetes.                             │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Given below is XML that describes the information to extract from this document and the tags │ │ │\n",
+       "    │ │ │      │ to extract it into.                                                                          │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ <output>                                                                                     │ │ │\n",
+       "    │ │ │      │   <string description=\"Patient's gender\" name=\"gender\" required=\"true\"></string>             │ │ │\n",
+       "    │ │ │      │   <integer description=\"Patient's age\" format=\"guardrails/valid_range: 0 100\" name=\"age\"     │ │ │\n",
+       "    │ │ │      │ required=\"true\"></integer>                                                                   │ │ │\n",
+       "    │ │ │      │   <list description=\"Symptoms that the patient is currently experiencing. Each symptom       │ │ │\n",
+       "    │ │ │      │ should be classified into  separate item in the list.\" name=\"symptoms\" required=\"true\">      │ │ │\n",
+       "    │ │ │      │     <object required=\"true\">                                                                 │ │ │\n",
+       "    │ │ │      │       <string description=\"Symptom that a patient is experiencing\" name=\"symptom\"            │ │ │\n",
+       "    │ │ │      │ required=\"true\"></string>                                                                    │ │ │\n",
+       "    │ │ │      │       <string description=\"What part of the body the symptom is affecting\"                   │ │ │\n",
+       "    │ │ │      │ format=\"guardrails/lowercase\" name=\"affected_area\" required=\"true\"></string>                 │ │ │\n",
+       "    │ │ │      │     </object>                                                                                │ │ │\n",
+       "    │ │ │      │   </list>                                                                                    │ │ │\n",
+       "    │ │ │      │   <list description=\"Medications the patient is currently taking and their response\"         │ │ │\n",
+       "    │ │ │      │ name=\"current_meds\" required=\"true\">                                                         │ │ │\n",
+       "    │ │ │      │     <object required=\"true\">                                                                 │ │ │\n",
+       "    │ │ │      │       <string description=\"Name of the medication the patient is taking\"                     │ │ │\n",
+       "    │ │ │      │ format=\"guardrails/uppercase\" name=\"medication\" required=\"true\"></string>                    │ │ │\n",
+       "    │ │ │      │       <string description=\"How the patient is responding to the medication\" name=\"response\"  │ │ │\n",
+       "    │ │ │      │ required=\"true\"></string>                                                                    │ │ │\n",
+       "    │ │ │      │     </object>                                                                                │ │ │\n",
+       "    │ │ │      │   </list>                                                                                    │ │ │\n",
+       "    │ │ │      │   <string description=\"Any other information that is relevant to the patient's health;       │ │ │\n",
+       "    │ │ │      │ something that doesn't fit into the other categories.\" format=\"guardrails/lowercase;         │ │ │\n",
+       "    │ │ │      │ guardrails/one_line\" name=\"miscellaneous\" required=\"true\"></string>                          │ │ │\n",
+       "    │ │ │      │ </output>                                                                                    │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in  │ │ │\n",
+       "    │ │ │      │ JSON is the `name` attribute of the corresponding XML, and the value is of the type          │ │ │\n",
+       "    │ │ │      │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │ │\n",
+       "    │ │ │      │ any types and format requests e.g. requests for lists, objects and specific types. Be        │ │ │\n",
+       "    │ │ │      │ correct and concise.                                                                         │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │ Here are examples of simple (XML, JSON) pairs that show the expected behavior:               │ │ │\n",
+       "    │ │ │      │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`          │ │ │\n",
+       "    │ │ │      │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE',        │ │ │\n",
+       "    │ │ │      │ 'STRING TWO', etc.]}`                                                                        │ │ │\n",
+       "    │ │ │      │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer            │ │ │\n",
+       "    │ │ │      │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index':     │ │ │\n",
+       "    │ │ │      │ 1}}`                                                                                         │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ │ {                                                                                                       │ │\n",
+       "    │ │     \"gender\": \"female\",                                                                                 │ │\n",
+       "    │ │     \"age\": 152,                                                                                         │ │\n",
+       "    │ │     \"symptoms\": [                                                                                       │ │\n",
+       "    │ │         {                                                                                               │ │\n",
+       "    │ │             \"symptom\": \"chronic macular rash\",                                                          │ │\n",
+       "    │ │             \"affected_area\": \"face\"                                                                     │ │\n",
+       "    │ │         },                                                                                              │ │\n",
+       "    │ │         {                                                                                               │ │\n",
+       "    │ │             \"symptom\": \"itchy\",                                                                         │ │\n",
+       "    │ │             \"affected_area\": \"beard\"                                                                    │ │\n",
+       "    │ │         },                                                                                              │ │\n",
+       "    │ │         {                                                                                               │ │\n",
+       "    │ │             \"symptom\": \"flaky\",                                                                         │ │\n",
+       "    │ │             \"affected_area\": \"eyebrows\"                                                                 │ │\n",
+       "    │ │         },                                                                                              │ │\n",
+       "    │ │         {                                                                                               │ │\n",
+       "    │ │             \"symptom\": \"slightly scaly\",                                                                │ │\n",
+       "    │ │             \"affected_area\": \"nares\"                                                                    │ │\n",
+       "    │ │         }                                                                                               │ │\n",
+       "    │ │     ],                                                                                                  │ │\n",
+       "    │ │     \"current_meds\": [                                                                                   │ │\n",
+       "    │ │         {                                                                                               │ │\n",
+       "    │ │             \"medication\": \"OTC steroid cream\",                                                          │ │\n",
+       "    │ │             \"response\": \"moderate\"                                                                      │ │\n",
+       "    │ │         }                                                                                               │ │\n",
+       "    │ │     ],                                                                                                  │ │\n",
+       "    │ │     \"miscellaneous\": \"patient also suffers from diabetes\"                                               │ │\n",
+       "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │     'gender': 'female',                                                                                 │ │\n",
        "    │ │     'age': 100,                                                                                         │ │\n",
@@ -619,7 +658,7 @@
        "    │ │         {'symptom': 'slightly scaly', 'affected_area': 'nares'}                                         │ │\n",
        "    │ │     ],                                                                                                  │ │\n",
        "    │ │     'current_meds': [                                                                                   │ │\n",
-       "    │ │         {'medication': 'OTC STEROID CREAM', 'response': 'Moderate'}                                     │ │\n",
+       "    │ │         {'medication': 'OTC STEROID CREAM', 'response': 'moderate'}                                     │ │\n",
        "    │ │     ],                                                                                                  │ │\n",
        "    │ │     'miscellaneous': 'patient also suffers from diabetes'                                               │ │\n",
        "    │ │ }                                                                                                       │ │\n",
@@ -630,67 +669,99 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m Prompt \u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mGiven the following doctor's notes about a patient, please extract a dictionary that contains the \u001b[0m\u001b[48;2;240;248;255m     \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mpatient's information.\u001b[0m\u001b[48;2;240;248;255m                                                                                 \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m152 y/o female with chronic macular rash to face and hair, worse in beard, eyebrows and nares.\u001b[0m\u001b[48;2;240;248;255m         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mThe rash is itchy, flaky and slightly scaly. Moderate response to OTC steroid cream. Patient has been \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255musing cream for 2 weeks and also suffers from diabetes.\u001b[0m\u001b[48;2;240;248;255m                                                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mGiven below is XML that describes the information to extract from this document and the tags to extract\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mit into.\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                               \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                             \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                           \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                           \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                           \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                            \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m    \u001b[0m\u001b[48;2;240;248;255m                                                                                          \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m  \u001b[0m\u001b[48;2;240;248;255m                                                         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m\u001b[0m\u001b[48;2;240;248;255m                                                                                              \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m`name` attribute of the corresponding XML, and the value is of the type specified by the corresponding \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mXML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. \u001b[0m\u001b[48;2;240;248;255m      \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mrequests for lists, objects and specific types. Be correct and concise.\u001b[0m\u001b[48;2;240;248;255m                                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mHere are examples of simple (XML, JSON) pairs that show the expected behavior:\u001b[0m\u001b[48;2;240;248;255m                         \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m- `` => `{'foo': 'example one'}`\u001b[0m\u001b[48;2;240;248;255m                    \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m- `` => `{\"bar\": ['STRING ONE', 'STRING TWO', \u001b[0m\u001b[48;2;240;248;255m   \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255metc.]}`\u001b[0m\u001b[48;2;240;248;255m                                                                                                \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m- `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\u001b[0m\u001b[48;2;240;248;255m                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m                                                                                                       \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m Message History \u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven the following doctor's notes about a patient, please extract a dictionary that        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcontains the patient's information.                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m152 y/o female with chronic macular rash to face and hair, worse in beard, eyebrows and     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mnares.                                                                                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mThe rash is itchy, flaky and slightly scaly. Moderate response to OTC steroid cream. Patient\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mhas been using cream for 2 weeks and also suffers from diabetes.                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGiven below is XML that describes the information to extract from this document and the tags\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mto extract it into.                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                      \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                          \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                     \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                   \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mONLY return a valid JSON object (no other text is necessary), where the key of the field in \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mJSON is the `name` attribute of the corresponding XML, and the value is of the type         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mspecified by the corresponding XML's tag. The JSON MUST conform to the XML format, including\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235many types and format requests e.g. requests for lists, objects and specific types. Be       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mcorrect and concise.                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mHere are examples of simple (XML, JSON) pairs that show the expected behavior:              \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'foo': 'example one'}`         \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{\"bar\": ['STRING ONE',       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m'STRING TWO', etc.]}`                                                                       \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m- `` => `{'baz': {'foo': 'Some String', 'index':    \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m1}}`                                                                                        \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m                                                                                                       \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"gender\": \"female\",\u001b[0m\u001b[48;2;245;245;220m                                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"age\": 152,\u001b[0m\u001b[48;2;245;245;220m                                                                                        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"symptoms\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"symptom\": \"chronic macular rash\",\u001b[0m\u001b[48;2;245;245;220m                                                         \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"affected_area\": \"face\"\u001b[0m\u001b[48;2;245;245;220m                                                                    \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"symptom\": \"itchy\",\u001b[0m\u001b[48;2;245;245;220m                                                                        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"affected_area\": \"beard\"\u001b[0m\u001b[48;2;245;245;220m                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"symptom\": \"flaky\",\u001b[0m\u001b[48;2;245;245;220m                                                                        \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"affected_area\": \"eyebrows\"\u001b[0m\u001b[48;2;245;245;220m                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"symptom\": \"slightly scaly\",\u001b[0m\u001b[48;2;245;245;220m                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"affected_area\": \"nares\"\u001b[0m\u001b[48;2;245;245;220m                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        }\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    ],\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"current_meds\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"medication\": \"OTC steroid cream\",\u001b[0m\u001b[48;2;245;245;220m                                                         \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"response\": \"moderate\"\u001b[0m\u001b[48;2;245;245;220m                                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        }\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    ],\u001b[0m\u001b[48;2;245;245;220m                                                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"miscellaneous\": \"patient also suffers from diabetes\"\u001b[0m\u001b[48;2;245;245;220m                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'gender': 'female',\u001b[0m\u001b[48;2;240;255;240m                                                                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'age': 100,\u001b[0m\u001b[48;2;240;255;240m                                                                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
@@ -701,7 +772,7 @@
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'symptom': 'slightly scaly', 'affected_area': 'nares'}\u001b[0m\u001b[48;2;240;255;240m                                        \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ],\u001b[0m\u001b[48;2;240;255;240m                                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'current_meds': [\u001b[0m\u001b[48;2;240;255;240m                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'medication': 'OTC STEROID CREAM', 'response': 'Moderate'}\u001b[0m\u001b[48;2;240;255;240m                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'medication': 'OTC STEROID CREAM', 'response': 'moderate'}\u001b[0m\u001b[48;2;240;255;240m                                    \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ],\u001b[0m\u001b[48;2;240;255;240m                                                                                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'miscellaneous': 'patient also suffers from diabetes'\u001b[0m\u001b[48;2;240;255;240m                                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
@@ -741,7 +812,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -757,7 +828,7 @@
     "        OneLine(on_fail=\"fix\"),\n",
     "    ],\n",
     "    description=\"testmeout\",\n",
-    "    prompt=prompt,\n",
+    "    messages=[{\"role\":\"user\", \"content\": prompt}],\n",
     ")"
    ]
   },
@@ -772,25 +843,31 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 10,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n",
+      "  warnings.warn(\n"
+     ]
+    },
     {
      "data": {
       "text/html": [
        "
Raw output:\n",
        "Large language models are advanced artificial intelligence systems that can generate human-like text. \n",
-       "They are trained on vast amounts of data to understand and mimic natural language patterns. \n",
-       "These models have the ability to generate coherent and contextually relevant responses to prompts. \n",
-       "\n",
+       "These models are trained on vast amounts of data to understand and mimic natural language patterns. \n",
+       "They have the ability to generate coherent and contextually relevant responses to prompts or questions\n",
        "
\n" ], "text/plain": [ "Raw output:\n", "Large language models are advanced artificial intelligence systems that can generate human-like text. \n", - "They are trained on vast amounts of data to understand and mimic natural language patterns. \n", - "These models have the ability to generate coherent and contextually relevant responses to prompts. \n", - "\n" + "These models are trained on vast amounts of data to understand and mimic natural language patterns. \n", + "They have the ability to generate coherent and contextually relevant responses to prompts or questions\n" ] }, "metadata": {}, @@ -815,7 +892,6 @@ "source": [ "# Wrap the litellm OpenAI API call with the `guard` object\n", "raw, validated, *rest = guard(\n", - " litellm.completion,\n", " model=\"gpt-3.5-turbo\",\n", " max_tokens=50,\n", " temperature=0.1,\n", @@ -837,18 +913,18 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
ValidationOutcome(\n",
-       "    call_id='129880225974544',\n",
-       "    raw_llm_output=' questions',\n",
-       "    validation_summaries=None,\n",
-       "    validated_output=' HEY HAVE THE ABILITY TO GENERATE COHERENT AND CONTEXTUALLY RELEVANT RESPONSES TO PROMPTS OR \n",
-       "QUESTIONS',\n",
+       "    call_id='14491466672',\n",
+       "    raw_llm_output=' or',\n",
+       "    validation_summaries=[],\n",
+       "    validated_output=' HEY HAVE THE ABILITY TO GENERATE COHERENT AND CONTEXTUALLY RELEVANT RESPONSES TO PROMPTS \n",
+       "OR',\n",
        "    reask=None,\n",
        "    validation_passed=False,\n",
        "    error=None\n",
@@ -857,11 +933,11 @@
       ],
       "text/plain": [
        "\u001b[1;35mValidationOutcome\u001b[0m\u001b[1m(\u001b[0m\n",
-       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'129880225974544'\u001b[0m,\n",
-       "    \u001b[33mraw_llm_output\u001b[0m=\u001b[32m' questions'\u001b[0m,\n",
-       "    \u001b[33mvalidation_summaries\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "    \u001b[33mvalidated_output\u001b[0m=\u001b[32m' HEY HAVE THE ABILITY TO GENERATE COHERENT AND CONTEXTUALLY RELEVANT RESPONSES TO PROMPTS OR \u001b[0m\n",
-       "\u001b[32mQUESTIONS'\u001b[0m,\n",
+       "    \u001b[33mcall_id\u001b[0m=\u001b[32m'14491466672'\u001b[0m,\n",
+       "    \u001b[33mraw_llm_output\u001b[0m=\u001b[32m' or'\u001b[0m,\n",
+       "    \u001b[33mvalidation_summaries\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
+       "    \u001b[33mvalidated_output\u001b[0m=\u001b[32m' HEY HAVE THE ABILITY TO GENERATE COHERENT AND CONTEXTUALLY RELEVANT RESPONSES TO PROMPTS \u001b[0m\n",
+       "\u001b[32mOR'\u001b[0m,\n",
        "    \u001b[33mreask\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "    \u001b[33mvalidation_passed\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
        "    \u001b[33merror\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
@@ -875,7 +951,6 @@
    "source": [
     "# Wrap the litellm OpenAI API call with the `guard` object\n",
     "fragment_generator = guard(\n",
-    "    litellm.completion,\n",
     "    model=\"gpt-3.5-turbo\",\n",
     "    max_tokens=50,\n",
     "    temperature=0.1,\n",
@@ -890,7 +965,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [
     {
@@ -898,20 +973,24 @@
       "text/html": [
        "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ │ Generate a short description of large language models. Each new sentence should be on another line.     │ │\n",
-       "    │ │                                                                                                         │ │\n",
-       "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮ │\n",
-       "    │ │ No message history.                                                                                     │ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
+       "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
+       "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
+       "    │ │ │ user │                                                                                              │ │ │\n",
+       "    │ │ │      │ Generate a short description of large language models. Each new sentence should be on        │ │ │\n",
+       "    │ │ │      │ another line.                                                                                │ │ │\n",
+       "    │ │ │      │                                                                                              │ │ │\n",
+       "    │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
-       "    │ │                                                                                                         │ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ │ Large language models are advanced artificial intelligence systems that can generate human-like text.   │ │\n",
+       "    │ │ These models are trained on vast amounts of text data to understand and mimic human language patterns.  │ │\n",
+       "    │ │ They have the ability to generate coherent and contextually relevant responses to prompts or            │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ 'LARGE LANGUAGE MODELS ARE ADVANCED ARTIFICIAL INTELLIGENCE SYSTEMS THAT CAN GENERATE HUMAN-LIKE TEXT.  │ │\n",
-       "    │ │ HEY HAVE THE ABILITY TO GENERATE COHERENT AND CONTEXTUALLY RELEVANT RESPONSES TO PROMPTS OR QUESTIONS'  │ │\n",
+       "    │ │ HEY HAVE THE ABILITY TO GENERATE COHERENT AND CONTEXTUALLY RELEVANT RESPONSES TO PROMPTS OR'            │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "
\n" @@ -919,20 +998,24 @@ "text/plain": [ "Logs\n", "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n", - " │ \u001b[48;2;240;248;255m╭─\u001b[0m\u001b[48;2;240;248;255m───────────────────────────────────────────────\u001b[0m Prompt \u001b[48;2;240;248;255m────────────────────────────────────────────────\u001b[0m\u001b[48;2;240;248;255m─╮\u001b[0m │\n", - " │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n", - " │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255mGenerate a short description of large language models. Each new sentence should be on another line.\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n", - " │ \u001b[48;2;240;248;255m│\u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m \u001b[0m\u001b[48;2;240;248;255m│\u001b[0m │\n", - " │ \u001b[48;2;240;248;255m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m Message History \u001b[48;2;231;223;235m───────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", - " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo message history.\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235muser\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mGenerate a short description of large language models. Each new sentence should be on \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235manother line. \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", " │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mLarge language models are advanced artificial intelligence systems that can generate human-like text. \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mThese models are trained on vast amounts of text data to understand and mimic human language patterns. \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mThey have the ability to generate coherent and contextually relevant responses to prompts or\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m'LARGE LANGUAGE MODELS ARE ADVANCED ARTIFICIAL INTELLIGENCE SYSTEMS THAT CAN GENERATE HUMAN-LIKE TEXT. \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mHEY HAVE THE ABILITY TO GENERATE COHERENT AND CONTEXTUALLY RELEVANT RESPONSES TO PROMPTS OR QUESTIONS'\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mHEY HAVE THE ABILITY TO GENERATE COHERENT AND CONTEXTUALLY RELEVANT RESPONSES TO PROMPTS OR'\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", " │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" ] @@ -956,7 +1039,7 @@ ], "metadata": { "kernelspec": { - "display_name": "guard-venv", + "display_name": "litellm", "language": "python", "name": "python3" }, @@ -970,7 +1053,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/examples/guardrails_with_chat_models.ipynb b/docs/examples/guardrails_with_chat_models.ipynb index a9d89d002..0d648c513 100644 --- a/docs/examples/guardrails_with_chat_models.ipynb +++ b/docs/examples/guardrails_with_chat_models.ipynb @@ -164,6 +164,16 @@ "\n", " ${output_schema}\"\"\"\n", " ```\n", + " messages=[\n", + " {\n", + " \"role\":\"system\",\n", + " \"content\":instructions\n", + " },\n", + " {\n", + " \"role\":\"user\",\n", + " \"content\":prompt\n", + " }\n", + " ]\n", "\n", "=== \"RAIL Spec without user message\"\n", " \n", @@ -194,6 +204,12 @@ " ${output_schema}\n", "\n", " ${gr.json_suffix_prompt_v2_wo_none}\"\"\"\n", + " messages=[\n", + " {\n", + " \"role\":\"user\",\n", + " \"content\":prompt\n", + " }\n", + " ]\n", " ```\n", "\n", "After materialization, the two variations of the RAIL specification will look like this when passed to the LLM (regarless if they were initialized from xml or a Pydantic model):\n", @@ -201,7 +217,8 @@ "=== \"RAIL Spec with instruction tag\"\n", "\n", " ```xml\n", - " \n", + " \n", + " \n", " You are a helpful assistant only capable of communicating with valid JSON, and no other text.\n", "\n", " ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, enter `null`.\n", @@ -210,10 +227,9 @@ " - `` => `{'foo': 'example one'}`\n", " - `` => `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`\n", " - `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\n", - " \n", - "\n", - "\n", - " \n", + " \n", + " \n", + " \n", " Given the following document, answer the following questions. If the answer doesn't exist in the document, enter \n", " `null`.\n", "\n", @@ -224,13 +240,15 @@ " Given below is XML that describes the information to extract from this document and the tags to extract it into.\n", "\n", " ${output_schema}\n", - " \n", + " \n", + " \n", " ```\n", "\n", "=== \"RAIL Spec without instruction tag\"\n", "\n", " ```xml\n", - " \n", + " \n", + " \n", " Given the following document, answer the following questions. If the answer doesn't exist in the document, enter `null`.\n", "\n", " ${document}\n", @@ -245,7 +263,8 @@ " - `` => `{'foo': 'example one'}`\n", " - `` => `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`\n", " - `` => `{'baz': {'foo': 'Some String', 'index': 1}}`\n", - " \n", + " \n", + " \n", " ```\n", "\n", "Here's the final RAIL spec as XML:" diff --git a/docs/examples/input_validation.ipynb b/docs/examples/input_validation.ipynb index c7535a611..269f59b3a 100644 --- a/docs/examples/input_validation.ipynb +++ b/docs/examples/input_validation.ipynb @@ -26,14 +26,14 @@ "source": [ "## Input Validation\n", "\n", - "Guardrails supports validating inputs (prompts, instructions, msg_history) with string validators." + "Guardrails supports validating inputs (messages) with string validators." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "In XML, specify the validators on the `prompt` or `instructions` tag, as such:" + "In XML, specify the validators on the `messages` tag, as such:" ] }, { diff --git a/docs/examples/llamaindex-output-parsing.ipynb b/docs/examples/llamaindex-output-parsing.ipynb index e69d30ecc..dddfb0fd5 100644 --- a/docs/examples/llamaindex-output-parsing.ipynb +++ b/docs/examples/llamaindex-output-parsing.ipynb @@ -361,7 +361,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "litellm", "language": "python", "name": "python3" }, @@ -375,7 +375,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.1" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/faq.md b/docs/faq.md index 53d1caef9..ff3f806b3 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -92,17 +92,21 @@ print(res.validated_output) # Validated outputs Make sure that you are escaping the `&` character in your `RAIL` specification. The `&` character has a special meaning in XML, and so you need to escape it with `&`. For example, if you have a prompt like this: ```xml - + + This is a prompt with an & character. - + + ``` You need to escape the `&` character like this: ```xml - + + This is a prompt with an & character. - + + ``` ## Are validators all model-based? Are they proprietary to Guardrails? diff --git a/docs/guardrails_ai/faq.md b/docs/guardrails_ai/faq.md index 5d92c9a44..cdc2d3cd2 100644 --- a/docs/guardrails_ai/faq.md +++ b/docs/guardrails_ai/faq.md @@ -5,7 +5,7 @@ If you see an exception that looks like this ``` -PromptCallableException: The callable `fn` passed to `Guard(fn, ...)` failed with the following error: `custom_llm_func() got an unexpected keyword argument 'messages'`. Make sure that `fn` can be called as a function that takes in a single prompt string and returns a string. +PromptCallableException: The callable `fn` passed to `Guard(fn, ...)` failed with the following error: `custom_llm_func() got an unexpected keyword argument 'messages'`. Make sure that `fn` can be called as a function and returns a string. ``` It means that the call to the LLM failed. This is usually triggered for one of the following reasons: @@ -13,7 +13,7 @@ It means that the call to the LLM failed. This is usually triggered for one of t 1. An API key is not present or not passed correctly to the LLM 1. The LLM API was passed arguments it doesn't expect. Our recommendation is to use the LiteLLM standard, and pass arguments that conform to that standard directly in the guard callable. It's helpful as a debugging step to remove all other arguments or to try and use the same arguments in a LiteLLM client directly. 1. The LLM API is down or experiencing issues. This is usually temporary, and you can use LiteLLM or the LLM client directly to verify if the API is working as expected. -1. You passed a custom LLM callable, and it either doesn't conform to the expected signature or it throws an error during execution. Make sure that the custom LLM callable can be called as a function that takes in a single prompt string and returns a string. +1. You passed a custom LLM callable, and it either doesn't conform to the expected signature or it throws an error during execution. Make sure that the custom LLM callable can be called as a function and returns a string. ## How can I host Guardrails as its own server @@ -73,20 +73,24 @@ print(res.validated_output) # Validated outputs ## I'm encountering an XMLSyntaxError when creating a `Guard` object from a `RAIL` specification. What should I do? -Make sure that you are escaping the `&` character in your `RAIL` specification. The `&` character has a special meaning in XML, and so you need to escape it with `&`. For example, if you have a prompt like this: +Make sure that you are escaping the `&` character in your `RAIL` specification. The `&` character has a special meaning in XML, and so you need to escape it with `&`. For example, if you have a message like this: ```xml - + + This is a prompt with an & character. - + + ``` You need to escape the `&` character like this: ```xml - + + This is a prompt with an & character. - + + ``` ## Are validators all model-based? Are they proprietary to Guardrails? diff --git a/docs/how_to_guides/continuous_integration_continuous_deployment.md b/docs/how_to_guides/continuous_integration_continuous_deployment.md index 9530dd8eb..167420533 100644 --- a/docs/how_to_guides/continuous_integration_continuous_deployment.md +++ b/docs/how_to_guides/continuous_integration_continuous_deployment.md @@ -58,7 +58,7 @@ A template can also be a local json file with the format above. A config for it guardrails create --template chatbot.json ``` -The validator arguments and entries can be updated manually or programatically. +The validator arguments and entries can be updated manually or programmatically. For example we could update kwargs to only identify and fix location. diff --git a/docs/how_to_guides/generate_structured_data.md b/docs/how_to_guides/generate_structured_data.md index 38147189e..23c27203d 100644 --- a/docs/how_to_guides/generate_structured_data.md +++ b/docs/how_to_guides/generate_structured_data.md @@ -108,7 +108,7 @@ from transformers import pipeline pipe = pipeline("text-generation", "TinyLlama/TinyLlama-1.1B-Chat-v1.0") # Inference is straightforward: -out = g(pipe, prompt=prompt).validated_output +out = g(pipe, messages=[{"role":"user","content":prompt}]).validated_output # `out` is a dict. Format it as JSON for readability: import json diff --git a/docs/how_to_guides/llm_api_wrappers.md b/docs/how_to_guides/llm_api_wrappers.md index d6a0ed658..6d9632953 100644 --- a/docs/how_to_guides/llm_api_wrappers.md +++ b/docs/how_to_guides/llm_api_wrappers.md @@ -86,7 +86,7 @@ validated_response = guard( model="ollama/llama2", max_tokens=500, api_base="http://localhost:11434", - msg_history=[{"role": "user", "content": "hello"}] + messages=[{"role": "user", "content": "hello"}] ) ``` @@ -106,7 +106,7 @@ validated_response = guard( api_base=os.environ.get("AZURE_OPENAI_API_BASE"), api_version="2023-05-15", api_key=os.environ.get("AZURE_OPENAI_API_KEY"), - msg_history=[{"role": "user", "content": "hello"}] + messages=[{"role": "user", "content": "hello"}] ) ``` @@ -123,27 +123,22 @@ guard = Guard().use(ProfanityFree()) # Function that takes the prompt as a string and returns the LLM output as string def my_llm_api( - prompt: Optional[str] = None, - instruction: Optional[str] = None, - msg_history: Optional[list[dict]] = None, **kwargs ) -> str: """Custom LLM API wrapper. - At least one of prompt, instruction or msg_history should be provided. + At least messages should be provided. Args: - prompt (str): The prompt to be passed to the LLM API - instruction (str): The instruction to be passed to the LLM API - msg_history (list[dict]): The message history to be passed to the LLM API + messages (list[dict]): The message history to be passed to the LLM API **kwargs: Any additional arguments to be passed to the LLM API Returns: str: The output of the LLM API """ - + messages=kwargs.get("messages") # Call your LLM API here - llm_output = some_llm(prompt, instruction, msg_history, **kwargs) + llm_output = some_llm(messages, **kwargs) return llm_output diff --git a/docs/how_to_guides/use_on_fail_actions.ipynb b/docs/how_to_guides/use_on_fail_actions.ipynb index 7d04ead8f..aa8ea3312 100644 --- a/docs/how_to_guides/use_on_fail_actions.ipynb +++ b/docs/how_to_guides/use_on_fail_actions.ipynb @@ -94,7 +94,7 @@ "\n", "guard = Guard().use(\n", " DetectPII(pii_entities=\"pii\", on_fail=\"exception\"),\n", - " on=\"msg_history\"\n", + " on=\"messages\"\n", ")\n", "\n", "\n", @@ -102,7 +102,7 @@ "\n", "guard = Guard().use(\n", " DetectPII(pii_entities=\"pii\", on_fail=\"exception\"),\n", - " on=\"msg_history\"\n", + " on=\"messages\"\n", ")\n", "\n", "try:\n", diff --git a/docs/how_to_guides/using_llms.md b/docs/how_to_guides/using_llms.md index 51163663b..f085baac2 100644 --- a/docs/how_to_guides/using_llms.md +++ b/docs/how_to_guides/using_llms.md @@ -305,20 +305,16 @@ guard = Guard().use(ProfanityFree()) # Function that takes the prompt as a string and returns the LLM output as string def my_llm_api( - prompt: Optional[str] = None, *, - instructions: Optional[str] = None, - msg_history: Optional[list[dict]] = None, + messages: Optional[list[dict]] = None, **kwargs ) -> str: """Custom LLM API wrapper. - At least one of prompt, instruction or msg_history should be provided. + At least one of messages should be provided. Args: - prompt (str): The prompt to be passed to the LLM API - instruction (str): The instruction to be passed to the LLM API - msg_history (list[dict]): The message history to be passed to the LLM API + messages (list[dict]): The message history to be passed to the LLM API **kwargs: Any additional arguments to be passed to the LLM API Returns: @@ -327,14 +323,14 @@ def my_llm_api( # Call your LLM API here # What you pass to the llm will depend on what arguments it accepts. - llm_output = some_llm(prompt, instructions, msg_history, **kwargs) + llm_output = some_llm(messages, **kwargs) return llm_output # Wrap your LLM API call validated_response = guard( my_llm_api, - prompt="Can you generate a list of 10 things that are not food?", + messages=[{"role":"user","content":"Can you generate a list of 10 things that are not food?"}], **kwargs, ) ``` From d2df838712d872bdc98e85a37f338cd517bcbfed Mon Sep 17 00:00:00 2001 From: David Tam Date: Mon, 14 Oct 2024 09:42:28 -0700 Subject: [PATCH 40/71] last of docs --- docs/how_to_guides/instructions.md | 2 + docs/how_to_guides/messages.md | 51 ++++++++++++ docs/how_to_guides/prompt.md | 3 + docs/how_to_guides/rail.md | 125 +++++++---------------------- 4 files changed, 86 insertions(+), 95 deletions(-) create mode 100644 docs/how_to_guides/messages.md diff --git a/docs/how_to_guides/instructions.md b/docs/how_to_guides/instructions.md index 42333455b..e7f31a31e 100644 --- a/docs/how_to_guides/instructions.md +++ b/docs/how_to_guides/instructions.md @@ -1,5 +1,7 @@ # `Instructions` Element +**Note**: Instructions element support has been dropped in 0.6.0 in support of [messages](./messages). + The `` element is passed to the LLM as secondary input. Different model may use these differently. For example, chat models may receive instructions in the system-prompt. ## 📚 Components of an Instructions Element diff --git a/docs/how_to_guides/messages.md b/docs/how_to_guides/messages.md new file mode 100644 index 000000000..9e920c40f --- /dev/null +++ b/docs/how_to_guides/messages.md @@ -0,0 +1,51 @@ +# `Messages` Element + +The `` element contains instructions and the query that describes the high level task. + +## 📚 Components of a Prompt Element + +In addition to the high level task description, messages also contains the following: + +| Component | Syntax | Description | +|-------------------|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Variables | `${variable_name}` | These are provided by the user at runtime, and substituted in the prompt. | +| Output Schema | `${output_schema}` | This is the schema of the expected output, and is compiled based on the `output` element. For more information on how the output schema is compiled for the prompt, check out [`output` element compilation](/docs/concepts/output/#adding-compiled-output-element-to-prompt). | +| Prompt Primitives | `${gr.prompt_primitive_name}` | These are pre-constructed prompts that are useful for common tasks. E.g., some primitives may contain information that helps the LLM understand the output schema better. To see the full list of prompt primitives, check out [`guardrails/constants.xml`](https://github.com/guardrails-ai/guardrails/blob/main/guardrails/constants.xml). | + +```xml + + + + +You are a helpful assistant only capable of communicating with valid JSON, and no other text. + + + +Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. + +${document} + + +${gr.xml_prefix_prompt} + + +${output_schema} + + +${gr.json_suffix_prompt} + + + +``` + +1. The instructions element contains high level background information for the LLM containing textual context and constraints. +2. The prompt contains high level task information. +3. The variable `${document}` is provided by the user at runtime. +4. `${gr.xml_prefix_prompt}` is a prompt primitive provided by guardrails. It is equivalent to typing the following lines in the prompt: `Given below is XML that describes the information to extract from this document and the tags to extract it into.` +5. `${output_schema}` is the output schema and contains information about , which is compiled based on the `output` element. +6. `${gr.json_suffix_prompt}` is a prompt primitive provided by guardrails. It is equivalent to typing the following lines in the prompt: +``` +ONLY return a valid JSON object (no other text is necessary). The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, enter `null`. +``` + +The messages element is made up of message elements with role attributes. Messages with the role system are intended to be system level prompt. Messages with the role assistant are intended to be messages from the llm to be repassed to itself as additional context and history. Messages with role user are input from the user and also convey history of the conversation. \ No newline at end of file diff --git a/docs/how_to_guides/prompt.md b/docs/how_to_guides/prompt.md index 28c02152f..501f5738a 100644 --- a/docs/how_to_guides/prompt.md +++ b/docs/how_to_guides/prompt.md @@ -1,5 +1,8 @@ # `Prompt` Element + +**Note**: Prompt element support has been dropped in 0.6.0 in support of [messages](./messages). + The `` element contains the query that describes the high level task. ## 📚 Components of a Prompt Element diff --git a/docs/how_to_guides/rail.md b/docs/how_to_guides/rail.md index 68d4db21f..7d9d537e2 100644 --- a/docs/how_to_guides/rail.md +++ b/docs/how_to_guides/rail.md @@ -78,15 +78,17 @@ Let's see an example of an `RAIL` specification in action: - + + ... - + + ``` 1. The `output` element contains the structure of the expected output of the LLM. It contains the spec for the overall structure of the LLM output, type info for each field, and the quality criteria for each field and the corrective action to be taken in case quality criteria is not met. -2. The `prompt` element contains the high level instructions that are sent to the LLM. Check out the [RAIL Prompt](#components-of-a-prompt-element) page for more details. +2. The `messages` element contains the high level instructions that are sent to the LLM. Check out the [RAIL Prompt](#components-of-a-message-element) page for more details. ## 📖 How to use `RAIL` in Guardrails? @@ -110,125 +112,58 @@ _, validated_output, *rest = guard( 1. A `Guard` object is created from a `RAIL` specification. This object manages the validation and correction of the output of the LLM, as well as the prompt that is sent to the LLM. 2. Wrap the LLM API call (`openai.Completion.create`) with the `Guard` object, and add any additional arguments that you want to pass to the LLM API call. Instead of returning the raw text object, the `Guard` object will return a JSON object that is validated and corrected according to the `RAIL` specification. -# `Instructions` Element +# `Messages` Element -The `` element is passed to the LLM as secondary input. Different model may use these differently. For example, chat models may receive instructions in the system-prompt. +The `` element contains instructions and the query that describes the high level task. -## Components of an Instructions Element +## 📚 Components of a Prompt Element -In addition to any static text describing the context of the task, instructions can also contain any of the following: - -| Component | Syntax | Description | -|-------------------|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Variables | `${variable_name}` | These are provided by the user at runtime, and substituted in the instructions. | -| Output Schema | `${output_schema}` | This is the schema of the expected output, and is compiled based on the `output` element. For more information on how the output schema is compiled for the instructions, check out [`output` element compilation](#adding-compiled-output-element-to-prompt) | -| Prompt Primitives | `${gr.prompt_primitive_name}` | These are pre-constructed blocks of text that are useful for common tasks. E.g., some primitives may contain information that helps the LLM understand the output schema better. To see the full list of prompt primitives, check out [`guardrails/constants.xml`](https://github.com/guardrails-ai/guardrails/blob/main/guardrails/constants.xml). | - - -Here's an example of how you could compose instructions using RAIL xml: -```xml - - - -You are a helpful assistant only capable of communicating with valid JSON, and no other text. - -${gr.json_suffix_prompt_examples} - - -``` - -1. The instructions element contains high level background information for the LLM containing textual context and constraints. -2. `${gr.json_suffix_prompt_examples}` is a prompt primitive provided by guardrails. It is equivalent to typing the following lines in the instructions: -```` -ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, enter `null`. - -Here are examples of simple (XML, JSON) pairs that show the expected behavior: -- ``]]> => `{'foo': 'example one'}` -- `]]>` => `{"bar": ['STRING ONE', 'STRING TWO', etc.]}` -- `
]]>` => `{'baz': {'foo': 'Some String', 'index': 1}}` -```` - -Or if you prefer Pydantic: -```py -# -instructions = """You are a helpful assistant only capable of communicating with valid JSON, and no other text. - - ${gr.json_suffix_prompt_examples}""" # -``` - - -1. The instructions element contains high level background information for the LLM containing textual context and constraints. -2. `${gr.json_suffix_prompt_examples}` is a prompt primitive provided by guardrails. It is equivalent to typing the following lines in the instructions: -```` -ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, enter `null`. - -Here are examples of simple (XML, JSON) pairs that show the expected behavior: -- ``]]> => `{'foo': 'example one'}` -- `
]]>` => `{"bar": ['STRING ONE', 'STRING TWO', etc.]}` -- `
]]>` => `{'baz': {'foo': 'Some String', 'index': 1}}` -```` - -When either of the above are compiled, it would looks like this: -``` -You are a helpful assistant only capable of communicating with valid JSON, and no other text. - -ONLY return a valid JSON object (no other text is necessary). -The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. -Be correct and concise. If you are unsure anywhere, enter `null`. - -Here are examples of simple (XML, JSON) pairs that show the expected behavior: -- `` => `{'foo': 'example one'}` -- `` => `{"bar": ['STRING ONE', 'STRING TWO', etc.]}` -- `` => `{'baz': {'foo': 'Some String', 'index': 1}}` -``` - - -For an example of using instructions alongside a prompt see [this example for using chat models](/docs/examples/guardrails_with_chat_models). - -# `Prompt` Element - -The `` element contains the query that describes the high level task. - -## Components of a Prompt Element - -In addition to the high level task description, the prompt also contains the following: +In addition to the high level task description, messages also contains the following: | Component | Syntax | Description | |-------------------|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Variables | `${variable_name}` | These are provided by the user at runtime, and substituted in the prompt. | -| Output Schema | `${output_schema}` | This is the schema of the expected output, and is compiled based on the `output` element. For more information on how the output schema is compiled for the prompt, check out [`output` element compilation](#adding-compiled-output-element-to-prompt). | +| Output Schema | `${output_schema}` | This is the schema of the expected output, and is compiled based on the `output` element. For more information on how the output schema is compiled for the prompt, check out [`output` element compilation](/docs/concepts/output/#adding-compiled-output-element-to-prompt). | | Prompt Primitives | `${gr.prompt_primitive_name}` | These are pre-constructed prompts that are useful for common tasks. E.g., some primitives may contain information that helps the LLM understand the output schema better. To see the full list of prompt primitives, check out [`guardrails/constants.xml`](https://github.com/guardrails-ai/guardrails/blob/main/guardrails/constants.xml). | ```xml - + + +You are a helpful assistant only capable of communicating with valid JSON, and no other text. + + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. -${document} - +${document} -${gr.xml_prefix_prompt} +${gr.xml_prefix_prompt} -${output_schema} +${output_schema} -${gr.json_suffix_prompt} - +${gr.json_suffix_prompt} + + ``` -1. The prompt contains high level task information. -2. The variable `${document}` is provided by the user at runtime. -3. `${gr.xml_prefix_prompt}` is a prompt primitive provided by guardrails. It is equivalent to typing the following lines in the prompt: `Given below is XML that describes the information to extract from this document and the tags to extract it into.` -4. `${output_schema}` is the output schema and contains information about , which is compiled based on the `output` element. -5. `${gr.json_suffix_prompt}` is a prompt primitive provided by guardrails. It is equivalent to typing the following lines in the prompt: +1. The instructions element contains high level background information for the LLM containing textual context and constraints. +2. The prompt contains high level task information. +3. The variable `${document}` is provided by the user at runtime. +4. `${gr.xml_prefix_prompt}` is a prompt primitive provided by guardrails. It is equivalent to typing the following lines in the prompt: `Given below is XML that describes the information to extract from this document and the tags to extract it into.` +5. `${output_schema}` is the output schema and contains information about , which is compiled based on the `output` element. +6. `${gr.json_suffix_prompt}` is a prompt primitive provided by guardrails. It is equivalent to typing the following lines in the prompt: ``` ONLY return a valid JSON object (no other text is necessary). The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, enter `null`. ``` +The messages element is made up of message elements with role attributes. Messages with the role system are intended to be system level prompt. Messages with the role assistant are intended to be messages from the llm to be repassed to itself as additional context and history. Messages with role user are input from the user and also convey history of the conversation. + # `Output` Element The `...` element of a `RAIL` spec is used to give precise specification of the expected output of the LLM. It specifies From 95e276708db3efca22e5f29c81390e46c7ee2650 Mon Sep 17 00:00:00 2001 From: David Tam Date: Thu, 17 Oct 2024 14:15:47 -0700 Subject: [PATCH 41/71] update more docs and start migration guide --- .../guardrails_with_chat_models.ipynb | 56 ++-------- docs/guardrails_server_api.md | 101 +++++------------- docs/migration_guides/0-6-migration.md | 93 ++++++++++++++++ 3 files changed, 129 insertions(+), 121 deletions(-) create mode 100644 docs/migration_guides/0-6-migration.md diff --git a/docs/examples/guardrails_with_chat_models.ipynb b/docs/examples/guardrails_with_chat_models.ipynb index 0d648c513..b669f8e58 100644 --- a/docs/examples/guardrails_with_chat_models.ipynb +++ b/docs/examples/guardrails_with_chat_models.ipynb @@ -21,10 +21,7 @@ "✅Successfully installed guardrails/one_line!\n", "\n", "\n", - "Requirement already satisfied: pypdfium2 in /Users/dtam/.pyenv/versions/3.12.1/lib/python3.12/site-packages (4.30.0)\n", - "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.2\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "Requirement already satisfied: pypdfium2 in /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages (4.30.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } @@ -62,49 +59,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/pypdfium2/_helpers/textpage.py:80: UserWarning: get_text_range() call with default params will be implicitly redirected to get_text_bounded()\n", - " warnings.warn(\"get_text_range() call with default params will be implicitly redirected to get_text_bounded()\")\n" - ] - }, - { - "data": { - "text/html": [ - "
Chase Credit Card Document:\n",
-       "\n",
-       "2/25/23, 7:59 PM about:blank\n",
-       "about:blank 1/4\n",
-       "PRICING INFORMATION\n",
-       "INTEREST RATES AND INTEREST CHARGES\n",
-       "Purchase Annual\n",
-       "Percentage Rate (APR) 0% Intro APR for the first 18 months that your Account is open.\n",
-       "After that, 19.49%. This APR will vary with the market based on the Prim\n",
-       "...\n",
-       "
\n" - ], - "text/plain": [ - "Chase Credit Card Document:\n", - "\n", - "\u001b[1;36m2\u001b[0m/\u001b[1;36m25\u001b[0m/\u001b[1;36m23\u001b[0m, \u001b[1;92m7:59\u001b[0m PM about:blank\n", - "about:blank \u001b[1;36m1\u001b[0m/\u001b[1;36m4\u001b[0m\n", - "PRICING INFORMATION\n", - "INTEREST RATES AND INTEREST CHARGES\n", - "Purchase Annual\n", - "Percentage Rate \u001b[1m(\u001b[0mAPR\u001b[1m)\u001b[0m \u001b[1;36m0\u001b[0m% Intro APR for the first \u001b[1;36m18\u001b[0m months that your Account is open.\n", - "After that, \u001b[1;36m19.49\u001b[0m%. This APR will vary with the market based on the Prim\n", - "\u001b[33m...\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import guardrails as gd\n", "from rich import print\n", @@ -149,6 +106,7 @@ " ```\n", "\n", "=== \"Pydantic with messages\"\n", + "\n", " ```py\n", " instructions = \"\"\"You are a helpful assistant only capable of communicating with valid JSON, and no other text.\n", "\n", @@ -163,7 +121,7 @@ " ${gr.xml_prefix_prompt}\n", "\n", " ${output_schema}\"\"\"\n", - " ```\n", + " \n", " messages=[\n", " {\n", " \"role\":\"system\",\n", @@ -174,6 +132,7 @@ " \"content\":prompt\n", " }\n", " ]\n", + " ```\n", "\n", "=== \"RAIL Spec without user message\"\n", " \n", @@ -194,6 +153,7 @@ " ```\n", "\n", "=== \"Pydantic without instructions\"\n", + "\n", " ```py\n", " prompt = \"\"\"Given the following document, answer the following questions. If the answer doesn't exist in the document, enter `null`.\n", "\n", @@ -325,7 +285,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ diff --git a/docs/guardrails_server_api.md b/docs/guardrails_server_api.md index 50d6f41ce..0439cfba5 100644 --- a/docs/guardrails_server_api.md +++ b/docs/guardrails_server_api.md @@ -85,7 +85,7 @@ ApiKeyAuth, BearerAuth "validators": [ { "id": "string", - "on": "prompt", + "on": "messages", "onFail": "exception", "args": [ true @@ -186,9 +186,7 @@ ApiKeyAuth, BearerAuth "inputs": { "llmApi": "string", "llmOutput": "string", - "instructions": "string", - "prompt": "string", - "msgHistory": [ + "messages": [ { "property1": null, "property2": null @@ -241,7 +239,7 @@ Status Code **200** |»» validators|[allOf]|false|none|none| |»»» ValidatorReference|[ValidatorReference](#schemavalidatorreference)|false|none|none| |»»»» id|string|true|none|The unique identifier for this Validator. Often the hub id; e.g. guardrails/regex_match| -|»»»» on|any|false|none|A reference to the property this validator should be applied against. Can be a valid JSON path or a meta-property such as "prompt" or "output"| +|»»»» on|any|false|none|A reference to the property this validator should be applied against. Can be a valid JSON path or a meta-property such as "messages" or "output"| *anyOf* @@ -408,9 +406,7 @@ Status Code **200** |»»»»»» inputs|[inputs](#schemainputs)|false|none|none| |»»»»»»» llmApi|string|false|none|The LLM resource targeted by the user. e.g. openai.chat.completions.create| |»»»»»»» llmOutput|string|false|none|The string output from an external LLM call provided by the user via Guard.parse.| -|»»»»»»» instructions|string|false|none|The instructions for chat models.| -|»»»»»»» prompt|string|false|none|The prompt for the LLM.| -|»»»»»»» msgHistory|[object]|false|none|The message history for chat models.| +|»»»»»»» messages|[object]|false|none|The message history for chat models.| |»»»»»»»» **additionalProperties**|any|false|none|none| |»»»»»»» promptParams|object|false|none|Parameters to be formatted into the prompt.| |»»»»»»»» **additionalProperties**|any|false|none|none| @@ -666,9 +662,6 @@ Status Code **200** |Property|Value| |---|---| -|*anonymous*|prompt| -|*anonymous*|instructions| -|*anonymous*|msg_history| |*anonymous*|messages| |*anonymous*|output| |onFail|exception| @@ -710,7 +703,7 @@ ApiKeyAuth, BearerAuth "validators": [ { "id": "string", - "on": "prompt", + "on": "messages", "onFail": "exception", "args": [ true @@ -910,9 +903,7 @@ ApiKeyAuth, BearerAuth |»»»»» inputs|body|[inputs](#schemainputs)|false|none| |»»»»»» llmApi|body|string|false|The LLM resource targeted by the user. e.g. openai.chat.completions.create| |»»»»»» llmOutput|body|string|false|The string output from an external LLM call provided by the user via Guard.parse.| -|»»»»»» instructions|body|string|false|The instructions for chat models.| -|»»»»»» prompt|body|string|false|The prompt for the LLM.| -|»»»»»» msgHistory|body|[object]|false|The message history for chat models.| +|»»»»»» messages|body|[object]|false|The message history for chat models.| |»»»»»»» **additionalProperties**|body|any|false|none| |»»»»»» promptParams|body|object|false|Parameters to be formatted into the prompt.| |»»»»»»» **additionalProperties**|body|any|false|none| @@ -1008,9 +999,6 @@ ApiKeyAuth, BearerAuth |Parameter|Value| |---|---| -|»»»» *anonymous*|prompt| -|»»»» *anonymous*|instructions| -|»»»» *anonymous*|msg_history| |»»»» *anonymous*|messages| |»»»» *anonymous*|output| |»»» onFail|exception| @@ -1048,7 +1036,7 @@ ApiKeyAuth, BearerAuth "validators": [ { "id": "string", - "on": "prompt", + "on": "messages", "onFail": "exception", "args": [ true @@ -1149,9 +1137,7 @@ ApiKeyAuth, BearerAuth "inputs": { "llmApi": "string", "llmOutput": "string", - "instructions": "string", - "prompt": "string", - "msgHistory": [ + "messages": [ { "property1": null, "property2": null @@ -1221,7 +1207,7 @@ ApiKeyAuth, BearerAuth "validators": [ { "id": "string", - "on": "prompt", + "on": "messages", "onFail": "exception", "args": [ true @@ -1322,9 +1308,7 @@ ApiKeyAuth, BearerAuth "inputs": { "llmApi": "string", "llmOutput": "string", - "instructions": "string", - "prompt": "string", - "msgHistory": [ + "messages": [ { "property1": null, "property2": null @@ -1385,7 +1369,7 @@ ApiKeyAuth, BearerAuth "validators": [ { "id": "string", - "on": "prompt", + "on": "messages", "onFail": "exception", "args": [ true @@ -1586,9 +1570,7 @@ ApiKeyAuth, BearerAuth |»»»»» inputs|body|[inputs](#schemainputs)|false|none| |»»»»»» llmApi|body|string|false|The LLM resource targeted by the user. e.g. openai.chat.completions.create| |»»»»»» llmOutput|body|string|false|The string output from an external LLM call provided by the user via Guard.parse.| -|»»»»»» instructions|body|string|false|The instructions for chat models.| -|»»»»»» prompt|body|string|false|The prompt for the LLM.| -|»»»»»» msgHistory|body|[object]|false|The message history for chat models.| +|»»»»»» messages|body|[object]|false|The message history for chat models.| |»»»»»»» **additionalProperties**|body|any|false|none| |»»»»»» promptParams|body|object|false|Parameters to be formatted into the prompt.| |»»»»»»» **additionalProperties**|body|any|false|none| @@ -1684,9 +1666,6 @@ ApiKeyAuth, BearerAuth |Parameter|Value| |---|---| -|»»»» *anonymous*|prompt| -|»»»» *anonymous*|instructions| -|»»»» *anonymous*|msg_history| |»»»» *anonymous*|messages| |»»»» *anonymous*|output| |»»» onFail|exception| @@ -1724,7 +1703,7 @@ ApiKeyAuth, BearerAuth "validators": [ { "id": "string", - "on": "prompt", + "on": "messages", "onFail": "exception", "args": [ true @@ -1825,9 +1804,7 @@ ApiKeyAuth, BearerAuth "inputs": { "llmApi": "string", "llmOutput": "string", - "instructions": "string", - "prompt": "string", - "msgHistory": [ + "messages": [ { "property1": null, "property2": null @@ -1896,7 +1873,7 @@ ApiKeyAuth, BearerAuth "validators": [ { "id": "string", - "on": "prompt", + "on": "messages", "onFail": "exception", "args": [ true @@ -1997,9 +1974,7 @@ ApiKeyAuth, BearerAuth "inputs": { "llmApi": "string", "llmOutput": "string", - "instructions": "string", - "prompt": "string", - "msgHistory": [ + "messages": [ { "property1": null, "property2": null @@ -2069,9 +2044,7 @@ ApiKeyAuth, BearerAuth "inputs": { "llmApi": "string", "llmOutput": "string", - "instructions": "string", - "prompt": "string", - "msgHistory": [ + "messages": [ { "property1": null, "property2": null @@ -2125,9 +2098,7 @@ Status Code **200** |»»»» inputs|[inputs](#schemainputs)|false|none|none| |»»»»» llmApi|string|false|none|The LLM resource targeted by the user. e.g. openai.chat.completions.create| |»»»»» llmOutput|string|false|none|The string output from an external LLM call provided by the user via Guard.parse.| -|»»»»» instructions|string|false|none|The instructions for chat models.| -|»»»»» prompt|string|false|none|The prompt for the LLM.| -|»»»»» msgHistory|[object]|false|none|The message history for chat models.| +|»»»»» messages|[object]|false|none|The message history for chat models.| |»»»»»» **additionalProperties**|any|false|none|none| |»»»»» promptParams|object|false|none|Parameters to be formatted into the prompt.| |»»»»»» **additionalProperties**|any|false|none|none| @@ -3101,7 +3072,7 @@ continued "validators": [ { "id": "string", - "on": "prompt", + "on": "messages", "onFail": "exception", "args": [ true @@ -3202,9 +3173,7 @@ continued "inputs": { "llmApi": "string", "llmOutput": "string", - "instructions": "string", - "prompt": "string", - "msgHistory": [ + "messages": [ { "property1": null, "property2": null @@ -3369,9 +3338,7 @@ Information from the LLM response. { "llmApi": "string", "llmOutput": "string", - "instructions": "string", - "prompt": "string", - "msgHistory": [ + "messages": [ { "property1": null, "property2": null @@ -3425,7 +3392,7 @@ and ```json { "id": "string", - "on": "prompt", + "on": "messages", "onFail": "exception", "args": [ true @@ -3471,8 +3438,6 @@ continued |Property|Value| |---|---| |*anonymous*|prompt| -|*anonymous*|instructions| -|*anonymous*|msg_history| |*anonymous*|messages| |*anonymous*|output| |onFail|exception| @@ -3981,9 +3946,7 @@ and { "llmApi": "string", "llmOutput": "string", - "instructions": "string", - "prompt": "string", - "msgHistory": [ + "messages": [ { "property1": null, "property2": null @@ -4012,9 +3975,7 @@ Inputs |---|---|---|---|---| |llmApi|string|false|none|The LLM resource targeted by the user. e.g. openai.chat.completions.create| |llmOutput|string|false|none|The string output from an external LLM call provided by the user via Guard.parse.| -|instructions|string|false|none|The instructions for chat models.| -|prompt|string|false|none|The prompt for the LLM.| -|msgHistory|[object]|false|none|The message history for chat models.| +|messages|[object]|false|none|The message history for chat models.| |» **additionalProperties**|any|false|none|none| |promptParams|object|false|none|Parameters to be formatted into the prompt.| |» **additionalProperties**|any|false|none|none| @@ -4318,9 +4279,7 @@ continued "inputs": { "llmApi": "string", "llmOutput": "string", - "instructions": "string", - "prompt": "string", - "msgHistory": [ + "messages": [ { "property1": null, "property2": null @@ -4433,9 +4392,7 @@ Iteration "inputs": { "llmApi": "string", "llmOutput": "string", - "instructions": "string", - "prompt": "string", - "msgHistory": [ + "messages": [ { "property1": null, "property2": null @@ -4491,7 +4448,7 @@ Call "validators": [ { "id": "string", - "on": "prompt", + "on": "messages", "onFail": "exception", "args": [ true @@ -4592,9 +4549,7 @@ Call "inputs": { "llmApi": "string", "llmOutput": "string", - "instructions": "string", - "prompt": "string", - "msgHistory": [ + "messages": [ { "property1": null, "property2": null diff --git a/docs/migration_guides/0-6-migration.md b/docs/migration_guides/0-6-migration.md new file mode 100644 index 000000000..e77b82884 --- /dev/null +++ b/docs/migration_guides/0-6-migration.md @@ -0,0 +1,93 @@ +# Migrating to 0.6.0 + +## New Features + +### Messages support for reask and RAILS +`Guard.__call` and rails now fully support `reask_messages` as an argument. + +### For `Guard.__call` +```py +response = guard( + messages=[{ + "role":"user", + "content":"tell me a joke" + }], + reask_messages=[{ + "role":"system" + "content":"your previous joke failed validation can you tell me another joke?" + }] +) +``` + +#### For Rail +``` + + + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. + + ${document} + + ${gr.xml_prefix_prompt} + + + ${question} + + + + + + You were asked ${question} and it was not correct can you try again? + + + +``` + +## Improvements + +### Per message validation and fix support +Message validation is now more granular and executed on a per message content basis. +This allows for on_fix behavior to be fully supported. + +## Backwards-incompatible changes +### Validator onFail default behavior is now exception +Previously the default behavior for validation failure was noop. This meant developers were required to set it on_fail to exception or check validation_failed +to know if validation failed. This was unintuitive for new users and led to confusion around if validators were working or not. This new behavior will require +exception handling be added or configurations manually to be set to noop if desired. + +### Simplified schema injection behavior +Previously prompt and instruction suffixes and formatting hints were sometimes automatically injected +into prompt and instructions if guardrails detected xml or a structured schema being used for output. +This caused confusion and unexpected behavior when arguments to llms were being mutated without a developer asking for it. +Developers will now need to intentionally include Guardrails template variables such as `${gr.complete_xml_suffix_v2}` + +### Guardrails Server migration from Flask to FastAPI +In 0.5.X guard.__call and guard.validate async streaming received support for on_fail="fix" merge and parallelized async validation. +We have updated the server to use FastAPI which is build on ASGI to be able to fully take advantage of these improvements. +config.py now fully supports the definition of AsyncGuards and streaming=true as a request argument. +We recommend the combination of `gunicorn` and `uvicorn.workers.UvicornWorker`s + +### Streamlined prompt, instructions and msg_history arguments into messages +`Guard.__call` prompt, instruction, reask_prompt and reask_instruction arguments have been streamlined into messages and reask_messages +Instructions should be specified with the role system and prompts with the role user. Any of the out of the box supported llms that require only one text prompt will automatically have the messages converted to one unless a custom callable is being used. +``` +# version < 0.6.0 +guard( + instructions="you are a funny assistant", + prompt="tell me a joke" +) + +# version >= 0.6.0 +guard( + messages=[ + {"role":"system", "content":"you are a funny assistant"}, + {"role":"user", "content":"tell me a joke"} + ] +) +``` + +### Removal of guardrails OpenAI, Cohere, Anthropic Callables +These callables are being removed in favor of support through passing no callable and setting the appropriate api key and model argument. See LINK TO DOCS for more info. + +### Prompt no longer a required positional argument on custom callables +Custom callables will no longer throw an error if the prompt arg is missing in their declaration and guardrails will no longer pass prompt as the first argument. They need to be updated to the messages kwarg to get text input. If a custom callables underlying llm only accepts a single string a helper exists that can compose messages into one otherwise some code to adapt them will be required. \ No newline at end of file From ef2863bdaf47a288a4bbaaacb79369e8d7aed586 Mon Sep 17 00:00:00 2001 From: David Tam Date: Thu, 17 Oct 2024 14:38:29 -0700 Subject: [PATCH 42/71] fix tests and format --- docs/faq.md | 2 +- guardrails/classes/history/inputs.py | 2 +- guardrails/run/async_runner.py | 2 +- guardrails/run/runner.py | 2 +- tests/integration_tests/test_async_streaming.py | 14 ++++++++++++-- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/docs/faq.md b/docs/faq.md index ff3f806b3..9cc32301c 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -29,7 +29,7 @@ It means that the call to the LLM failed. This is usually triggered for one of t 1. An API key is not present or not passed correctly to the LLM 1. The LLM API was passed arguments it doesn't expect. Our recommendation is to use the LiteLLM standard, and pass arguments that conform to that standard directly in the guard callable. It's helpful as a debugging step to remove all other arguments or to try and use the same arguments in a LiteLLM client directly. 1. The LLM API is down or experiencing issues. This is usually temporary, and you can use LiteLLM or the LLM client directly to verify if the API is working as expected. -1. You passed a custom LLM callable, and it either doesn't conform to the expected signature or it throws an error during execution. Make sure that the custom LLM callable can be called as a function that takes in a single prompt string and returns a string. +1. You passed a custom LLM callable, and it either doesn't conform to the expected signature or it throws an error during execution. Make sure that the custom LLM callable can be called as a function that takes in messages kwarg and returns a string. ## How can I host Guardrails as its own server diff --git a/guardrails/classes/history/inputs.py b/guardrails/classes/history/inputs.py index 18ec9114b..2e152fc4b 100644 --- a/guardrails/classes/history/inputs.py +++ b/guardrails/classes/history/inputs.py @@ -98,7 +98,7 @@ def to_dict(self) -> Dict[str, Any]: @classmethod def from_interface(cls, i_inputs: IInputs) -> "Inputs": deserialized_messages = None - if i_inputs.messages: # type: ignore + if hasattr(i_inputs, "messages") and i_inputs.messages: # type: ignore deserialized_messages = [] for msg in i_inputs.messages: # type: ignore ser_msg = {**msg} diff --git a/guardrails/run/async_runner.py b/guardrails/run/async_runner.py index 64cc43b51..0f2df99a9 100644 --- a/guardrails/run/async_runner.py +++ b/guardrails/run/async_runner.py @@ -296,7 +296,7 @@ async def async_prepare( """Prepare by running pre-processing and input validation. Returns: - The instructions, prompt, and message history. + The messages. """ prompt_params = prompt_params or {} if api is None: diff --git a/guardrails/run/runner.py b/guardrails/run/runner.py index 32cd19480..6f495ba27 100644 --- a/guardrails/run/runner.py +++ b/guardrails/run/runner.py @@ -75,7 +75,7 @@ class Runner: disable_tracer: Optional[bool] = True # QUESTION: Are any of these init args actually necessary for initialization? - # ANSWER: _Maybe_ prompt, instructions, and messages for Prompt initialization + # ANSWER: _Maybe_ messages for Prompt initialization # but even that can happen at execution time. # TODO: In versions >=0.6.x, remove this class and just execute a Guard functionally def __init__( diff --git a/tests/integration_tests/test_async_streaming.py b/tests/integration_tests/test_async_streaming.py index cb6fe18c0..a33ae4e80 100644 --- a/tests/integration_tests/test_async_streaming.py +++ b/tests/integration_tests/test_async_streaming.py @@ -165,7 +165,12 @@ async def test_async_streaming_fix_behavior_two_validators(mocker): max_tokens=10, temperature=0, stream=True, - prompt=prompt, + messages=[ + { + "role": "user", + "content": prompt, + } + ], ) text = "" original = "" @@ -211,7 +216,12 @@ async def test_async_streaming_filter_behavior(mocker): max_tokens=10, temperature=0, stream=True, - prompt=prompt, + messages=[ + { + "role": "user", + "content": prompt, + } + ], ) validated = "" From 58d16ecd1b783fc7872570f6b2ea95d0f7fa2ce6 Mon Sep 17 00:00:00 2001 From: David Tam Date: Fri, 18 Oct 2024 10:28:19 -0700 Subject: [PATCH 43/71] update some tests --- guardrails/llm_providers.py | 12 ++++++++++-- tests/integration_tests/test_guard.py | 10 +++++++--- tests/unit_tests/test_llm_providers.py | 4 +++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/guardrails/llm_providers.py b/guardrails/llm_providers.py index d06711be0..3f6972c88 100644 --- a/guardrails/llm_providers.py +++ b/guardrails/llm_providers.py @@ -379,7 +379,15 @@ def _invoke_llm( class HuggingFacePipelineCallable(PromptCallableBase): - def _invoke_llm(self, prompt: str, pipeline: Any, *args, **kwargs) -> LLMResponse: + def _invoke_llm( + self, + pipeline: Any, + *args, + messages: Union[ + list[dict[str, Union[str, Prompt, Instructions]]], MessageHistory + ], + **kwargs, + ) -> LLMResponse: try: import transformers # noqa: F401 # type: ignore except ImportError: @@ -400,7 +408,7 @@ def _invoke_llm(self, prompt: str, pipeline: Any, *args, **kwargs) -> LLMRespons temperature = kwargs.pop("temperature", None) if temperature == 0: temperature = None - + prompt = messages_string(messages) trace_operation( input_mime_type="application/json", input_value={ diff --git a/tests/integration_tests/test_guard.py b/tests/integration_tests/test_guard.py index 0ae7c92ba..7fb99b094 100644 --- a/tests/integration_tests/test_guard.py +++ b/tests/integration_tests/test_guard.py @@ -994,7 +994,7 @@ def custom_llm( guard = gd.Guard.for_pydantic(Task) _, dict_o, *rest = guard( custom_llm, - prompt="What is the status of this task?", + messages=[{"role": "user", "content": "What is the status of this task?"}], ) assert dict_o == {"status": "not started"} @@ -1002,7 +1002,9 @@ def custom_llm( guard = gd.Guard.for_pydantic(Task) result = guard( custom_llm, - prompt="What is the status of this task REALLY?", + messages=[ + {"role": "user", "content": "What is the status of this task REALLY?"} + ], num_reasks=0, ) @@ -1351,7 +1353,9 @@ def test_guard_for_pydantic_with_mock_hf_pipeline(): pipe = make_mock_pipeline() guard = Guard() - _ = guard(pipe, prompt="Don't care about the output.") + _ = guard( + pipe, messages=[{"role": "user", "content": "Don't care about the output."}] + ) @pytest.mark.skipif( diff --git a/tests/unit_tests/test_llm_providers.py b/tests/unit_tests/test_llm_providers.py index a6de294c4..8f35db426 100644 --- a/tests/unit_tests/test_llm_providers.py +++ b/tests/unit_tests/test_llm_providers.py @@ -258,7 +258,9 @@ def test_hugging_face_pipeline_callable(): from guardrails.llm_providers import HuggingFacePipelineCallable hf_model_callable = HuggingFacePipelineCallable() - response = hf_model_callable("Hello", pipeline=pipeline) + response = hf_model_callable( + pipeline=pipeline, messages=[{"role": "user", "content": "Hello"}] + ) assert isinstance(response, LLMResponse) is True assert response.output == "Hello there!" From d3cfed9750dc9f109bf35d10feef4e83ea3ea461 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Fri, 18 Oct 2024 17:28:29 -0400 Subject: [PATCH 44/71] bumped api version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 76e2a3266..39346d8b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,7 +57,7 @@ opentelemetry-exporter-otlp-proto-http = "^1.24.0" guardrails-hub-types = "^0.0.4" guardrails-api-client = ">=0.3.8" diff-match-patch = "^20230430" -guardrails-api = ">=0.0.1" +guardrails-api = ">=0.1.0,<0.2.0" mlflow = {version = ">=2.0.1", optional = true} uvloop = {version = "^0.20.0", optional = true} semver = "^3.0.2" From 97f34577919829dc2d971933ea868464b72b3a44 Mon Sep 17 00:00:00 2001 From: zsimjee Date: Fri, 18 Oct 2024 15:41:17 -0700 Subject: [PATCH 45/71] dep updates --- poetry.lock | 6113 +++++++++++++++++++++++++----------------------- pyproject.toml | 4 +- 2 files changed, 3200 insertions(+), 2917 deletions(-) diff --git a/poetry.lock b/poetry.lock index aae967a0a..efddec70b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,99 +1,130 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. + +[[package]] +name = "aiocache" +version = "0.12.3" +description = "multi backend asyncio cache" +optional = false +python-versions = "*" +files = [ + {file = "aiocache-0.12.3-py2.py3-none-any.whl", hash = "sha256:889086fc24710f431937b87ad3720a289f7fc31c4fd8b68e9f918b9bacd8270d"}, + {file = "aiocache-0.12.3.tar.gz", hash = "sha256:f528b27bf4d436b497a1d0d1a8f59a542c153ab1e37c3621713cb376d44c4713"}, +] + +[package.extras] +memcached = ["aiomcache (>=0.5.2)"] +msgpack = ["msgpack (>=0.5.5)"] +redis = ["redis (>=4.2.0)"] [[package]] name = "aiohappyeyeballs" -version = "2.3.5" +version = "2.4.3" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.3.5-py3-none-any.whl", hash = "sha256:4d6dea59215537dbc746e93e779caea8178c866856a721c9c660d7a5a7b8be03"}, - {file = "aiohappyeyeballs-2.3.5.tar.gz", hash = "sha256:6fa48b9f1317254f122a07a131a86b71ca6946ca989ce6326fff54a99a920105"}, + {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, + {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, ] [[package]] name = "aiohttp" -version = "3.10.2" +version = "3.10.10" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95213b3d79c7e387144e9cb7b9d2809092d6ff2c044cb59033aedc612f38fb6d"}, - {file = "aiohttp-3.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1aa005f060aff7124cfadaa2493f00a4e28ed41b232add5869e129a2e395935a"}, - {file = "aiohttp-3.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eabe6bf4c199687592f5de4ccd383945f485779c7ffb62a9b9f1f8a3f9756df8"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e010736fc16d21125c7e2dc5c350cd43c528b85085c04bf73a77be328fe944"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99f81f9c1529fd8e03be4a7bd7df32d14b4f856e90ef6e9cbad3415dbfa9166c"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d611d1a01c25277bcdea06879afbc11472e33ce842322496b211319aa95441bb"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00191d38156e09e8c81ef3d75c0d70d4f209b8381e71622165f22ef7da6f101"}, - {file = "aiohttp-3.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74c091a5ded6cb81785de2d7a8ab703731f26de910dbe0f3934eabef4ae417cc"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:18186a80ec5a701816adbf1d779926e1069392cf18504528d6e52e14b5920525"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5a7ceb2a0d2280f23a02c64cd0afdc922079bb950400c3dd13a1ab2988428aac"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8bd7be6ff6c162a60cb8fce65ee879a684fbb63d5466aba3fa5b9288eb04aefa"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fae962b62944eaebff4f4fddcf1a69de919e7b967136a318533d82d93c3c6bd1"}, - {file = "aiohttp-3.10.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a0fde16d284efcacbe15fb0c1013f0967b6c3e379649239d783868230bf1db42"}, - {file = "aiohttp-3.10.2-cp310-cp310-win32.whl", hash = "sha256:f81cd85a0e76ec7b8e2b6636fe02952d35befda4196b8c88f3cec5b4fb512839"}, - {file = "aiohttp-3.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:54ba10eb5a3481c28282eb6afb5f709aedf53cf9c3a31875ffbdc9fc719ffd67"}, - {file = "aiohttp-3.10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:87fab7f948e407444c2f57088286e00e2ed0003ceaf3d8f8cc0f60544ba61d91"}, - {file = "aiohttp-3.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ec6ad66ed660d46503243cbec7b2b3d8ddfa020f984209b3b8ef7d98ce69c3f2"}, - {file = "aiohttp-3.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a4be88807283bd96ae7b8e401abde4ca0bab597ba73b5e9a2d98f36d451e9aac"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01c98041f90927c2cbd72c22a164bb816fa3010a047d264969cf82e1d4bcf8d1"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54e36c67e1a9273ecafab18d6693da0fb5ac48fd48417e4548ac24a918c20998"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7de3ddb6f424af54535424082a1b5d1ae8caf8256ebd445be68c31c662354720"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dd9c7db94b4692b827ce51dcee597d61a0e4f4661162424faf65106775b40e7"}, - {file = "aiohttp-3.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e57e21e1167705f8482ca29cc5d02702208d8bf4aff58f766d94bcd6ead838cd"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a1a50e59b720060c29e2951fd9f13c01e1ea9492e5a527b92cfe04dd64453c16"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:686c87782481fda5ee6ba572d912a5c26d9f98cc5c243ebd03f95222af3f1b0f"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:dafb4abb257c0ed56dc36f4e928a7341b34b1379bd87e5a15ce5d883c2c90574"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:494a6f77560e02bd7d1ab579fdf8192390567fc96a603f21370f6e63690b7f3d"}, - {file = "aiohttp-3.10.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6fe8503b1b917508cc68bf44dae28823ac05e9f091021e0c41f806ebbb23f92f"}, - {file = "aiohttp-3.10.2-cp311-cp311-win32.whl", hash = "sha256:4ddb43d06ce786221c0dfd3c91b4892c318eaa36b903f7c4278e7e2fa0dd5102"}, - {file = "aiohttp-3.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:ca2f5abcb0a9a47e56bac173c01e9f6c6e7f27534d91451c5f22e6a35a5a2093"}, - {file = "aiohttp-3.10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:14eb6b17f6246959fb0b035d4f4ae52caa870c4edfb6170aad14c0de5bfbf478"}, - {file = "aiohttp-3.10.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:465e445ec348d4e4bd349edd8b22db75f025da9d7b6dc1369c48e7935b85581e"}, - {file = "aiohttp-3.10.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:341f8ece0276a828d95b70cd265d20e257f5132b46bf77d759d7f4e0443f2906"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01fbb87b5426381cd9418b3ddcf4fc107e296fa2d3446c18ce6c76642f340a3"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c474af073e1a6763e1c5522bbb2d85ff8318197e4c6c919b8d7886e16213345"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d9076810a5621236e29b2204e67a68e1fe317c8727ee4c9abbfbb1083b442c38"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8f515d6859e673940e08de3922b9c4a2249653b0ac181169313bd6e4b1978ac"}, - {file = "aiohttp-3.10.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:655e583afc639bef06f3b2446972c1726007a21003cd0ef57116a123e44601bc"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8da9449a575133828cc99985536552ea2dcd690e848f9d41b48d8853a149a959"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:19073d57d0feb1865d12361e2a1f5a49cb764bf81a4024a3b608ab521568093a"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8e98e1845805f184d91fda6f9ab93d7c7b0dddf1c07e0255924bfdb151a8d05"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:377220a5efde6f9497c5b74649b8c261d3cce8a84cb661be2ed8099a2196400a"}, - {file = "aiohttp-3.10.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92f7f4a4dc9cdb5980973a74d43cdbb16286dacf8d1896b6c3023b8ba8436f8e"}, - {file = "aiohttp-3.10.2-cp312-cp312-win32.whl", hash = "sha256:9bb2834a6f11d65374ce97d366d6311a9155ef92c4f0cee543b2155d06dc921f"}, - {file = "aiohttp-3.10.2-cp312-cp312-win_amd64.whl", hash = "sha256:518dc3cb37365255708283d1c1c54485bbacccd84f0a0fb87ed8917ba45eda5b"}, - {file = "aiohttp-3.10.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7f98e70bbbf693086efe4b86d381efad8edac040b8ad02821453083d15ec315f"}, - {file = "aiohttp-3.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9f6f0b252a009e98fe84028a4ec48396a948e7a65b8be06ccfc6ef68cf1f614d"}, - {file = "aiohttp-3.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9360e3ffc7b23565600e729e8c639c3c50d5520e05fdf94aa2bd859eef12c407"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3988044d1635c7821dd44f0edfbe47e9875427464e59d548aece447f8c22800a"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a9d59da1543a6f1478c3436fd49ec59be3868bca561a33778b4391005e499d"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9f49bdb94809ac56e09a310a62f33e5f22973d6fd351aac72a39cd551e98194"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddfd2dca3f11c365d6857a07e7d12985afc59798458a2fdb2ffa4a0332a3fd43"}, - {file = "aiohttp-3.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c1508ec97b2cd3e120bfe309a4ff8e852e8a7460f1ef1de00c2c0ed01e33c"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:49904f38667c44c041a0b44c474b3ae36948d16a0398a8f8cd84e2bb3c42a069"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:352f3a4e5f11f3241a49b6a48bc5b935fabc35d1165fa0d87f3ca99c1fcca98b"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:fc61f39b534c5d5903490478a0dd349df397d2284a939aa3cbaa2fb7a19b8397"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:ad2274e707be37420d0b6c3d26a8115295fe9d8e6e530fa6a42487a8ca3ad052"}, - {file = "aiohttp-3.10.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c836bf3c7512100219fe1123743fd8dd9a2b50dd7cfb0c3bb10d041309acab4b"}, - {file = "aiohttp-3.10.2-cp38-cp38-win32.whl", hash = "sha256:53e8898adda402be03ff164b0878abe2d884e3ea03a4701e6ad55399d84b92dc"}, - {file = "aiohttp-3.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:7cc8f65f5b22304693de05a245b6736b14cb5bc9c8a03da6e2ae9ef15f8b458f"}, - {file = "aiohttp-3.10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9dfc906d656e14004c5bc672399c1cccc10db38df2b62a13fb2b6e165a81c316"}, - {file = "aiohttp-3.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:91b10208b222ddf655c3a3d5b727879d7163db12b634492df41a9182a76edaae"}, - {file = "aiohttp-3.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9fd16b5e1a7bdd14668cd6bde60a2a29b49147a535c74f50d8177d11b38433a7"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2bfdda4971bd79201f59adbad24ec2728875237e1c83bba5221284dbbf57bda"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69d73f869cf29e8a373127fc378014e2b17bcfbe8d89134bc6fb06a2f67f3cb3"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df59f8486507c421c0620a2c3dce81fbf1d54018dc20ff4fecdb2c106d6e6abc"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df930015db36b460aa9badbf35eccbc383f00d52d4b6f3de2ccb57d064a6ade"}, - {file = "aiohttp-3.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:562b1153ab7f766ee6b8b357ec777a302770ad017cf18505d34f1c088fccc448"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d984db6d855de58e0fde1ef908d48fe9a634cadb3cf715962722b4da1c40619d"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:14dc3fcb0d877911d775d511eb617a486a8c48afca0a887276e63db04d3ee920"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b52a27a5c97275e254704e1049f4b96a81e67d6205f52fa37a4777d55b0e98ef"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:cd33d9de8cfd006a0d0fe85f49b4183c57e91d18ffb7e9004ce855e81928f704"}, - {file = "aiohttp-3.10.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1238fc979160bc03a92fff9ad021375ff1c8799c6aacb0d8ea1b357ea40932bb"}, - {file = "aiohttp-3.10.2-cp39-cp39-win32.whl", hash = "sha256:e2f43d238eae4f0b04f58d4c0df4615697d4ca3e9f9b1963d49555a94f0f5a04"}, - {file = "aiohttp-3.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:947847f07a8f81d7b39b2d0202fd73e61962ebe17ac2d8566f260679e467da7b"}, - {file = "aiohttp-3.10.2.tar.gz", hash = "sha256:4d1f694b5d6e459352e5e925a42e05bac66655bfde44d81c59992463d2897014"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"}, + {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"}, + {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"}, + {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"}, + {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"}, + {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"}, + {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"}, + {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"}, + {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"}, + {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"}, + {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"}, + {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"}, + {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"}, + {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"}, ] [package.dependencies] @@ -103,7 +134,7 @@ async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -124,24 +155,24 @@ frozenlist = ">=1.1.0" [[package]] name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" +version = "0.7.16" +description = "A light, configurable Sphinx theme" optional = true -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] name = "alembic" -version = "1.13.2" +version = "1.13.3" description = "A database migration tool for SQLAlchemy." optional = true python-versions = ">=3.8" files = [ - {file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"}, - {file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"}, + {file = "alembic-1.13.3-py3-none-any.whl", hash = "sha256:908e905976d15235fae59c9ac42c4c5b75cfcefe3d27c0fbf7ae15a37715d80e"}, + {file = "alembic-1.13.3.tar.gz", hash = "sha256:203503117415561e203aa14541740643a611f641517f0209fcae63e9fa09f1a2"}, ] [package.dependencies] @@ -152,20 +183,6 @@ typing-extensions = ">=4" [package.extras] tz = ["backports.zoneinfo"] -[[package]] -name = "aniso8601" -version = "9.0.1" -description = "A library for parsing ISO 8601 strings." -optional = true -python-versions = "*" -files = [ - {file = "aniso8601-9.0.1-py2.py3-none-any.whl", hash = "sha256:1d2b7ef82963909e93c4f24ce48d4de9e66009a21bf1c1e1c85bdd0812fe412f"}, - {file = "aniso8601-9.0.1.tar.gz", hash = "sha256:72e3117667eedf66951bb2d93f4296a56b94b078a8a95905a052611fb3f1b973"}, -] - -[package.extras] -dev = ["black", "coverage", "isort", "pre-commit", "pyenchant", "pylint"] - [[package]] name = "annotated-types" version = "0.7.0" @@ -199,13 +216,13 @@ typing-extensions = ">=4.5,<5" [[package]] name = "anyio" -version = "4.4.0" +version = "4.6.2.post1" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, + {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, ] [package.dependencies] @@ -215,9 +232,9 @@ sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "appnope" @@ -306,6 +323,23 @@ types-python-dateutil = ">=2.8.10" doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] +[[package]] +name = "asgiref" +version = "3.8.1" +description = "ASGI specs, helper code, and adapters" +optional = false +python-versions = ">=3.8" +files = [ + {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, + {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} + +[package.extras] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] + [[package]] name = "asttokens" version = "2.4.1" @@ -351,48 +385,37 @@ files = [ [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "babel" -version = "2.15.0" +version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] - [[package]] name = "backports-tarfile" version = "1.2.0" @@ -499,7 +522,7 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] name = "blinker" version = "1.8.2" description = "Fast, simple object-to-object and broadcast signaling" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01"}, @@ -508,17 +531,17 @@ files = [ [[package]] name = "boto3" -version = "1.34.132" +version = "1.35.44" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.132-py3-none-any.whl", hash = "sha256:b5d1681a0d8bf255787c8b37f911d706672d5722c9ace5342cd283a3cdb04820"}, - {file = "boto3-1.34.132.tar.gz", hash = "sha256:3b2964060620f1bbe9574b5f8d3fb2a4e087faacfc6023c24154b184f1b16443"}, + {file = "boto3-1.35.44-py3-none-any.whl", hash = "sha256:18416d07b41e6094101a44f8b881047dcec6b846dad0b9f83b9bbf2f0cd93d07"}, + {file = "boto3-1.35.44.tar.gz", hash = "sha256:7f8e8a252458d584d8cf7877c372c4f74ec103356eedf43d2dd9e479f47f3639"}, ] [package.dependencies] -botocore = ">=1.34.132,<1.35.0" +botocore = ">=1.35.44,<1.36.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -527,13 +550,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.132" +version = "1.35.44" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.132-py3-none-any.whl", hash = "sha256:06ef8b4bd3b3cb5a9b9a4273a543b257be3304030978ba51516b576a65156c39"}, - {file = "botocore-1.34.132.tar.gz", hash = "sha256:372a6cfce29e5de9bcf8c95af901d0bc3e27d8aa2295fadee295424f95f43f16"}, + {file = "botocore-1.35.44-py3-none-any.whl", hash = "sha256:55388e80624401d017a9a2b8109afd94814f7e666b53e28fce51375cfa8d9326"}, + {file = "botocore-1.35.44.tar.gz", hash = "sha256:1fcd97b966ad8a88de4106fe1bd3bbd6d8dadabe99bbd4a6aadcf11cb6c66b39"}, ] [package.dependencies] @@ -545,18 +568,7 @@ urllib3 = [ ] [package.extras] -crt = ["awscrt (==0.20.11)"] - -[[package]] -name = "cachelib" -version = "0.9.0" -description = "A collection of cache libraries in the same API interface." -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachelib-0.9.0-py3-none-any.whl", hash = "sha256:811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3"}, - {file = "cachelib-0.9.0.tar.gz", hash = "sha256:38222cc7c1b79a23606de5c2607f4925779e37cdcea1c2ad21b8bae94b5425a5"}, -] +crt = ["awscrt (==0.22.0)"] [[package]] name = "cachetools" @@ -571,13 +583,13 @@ files = [ [[package]] name = "cairocffi" -version = "1.7.0" +version = "1.7.1" description = "cffi-based cairo bindings for Python" optional = false python-versions = ">=3.8" files = [ - {file = "cairocffi-1.7.0-py3-none-any.whl", hash = "sha256:1f29a8d41dbda4090c0aa33bcdea64f3b493e95f74a43ea107c4a8a7b7f632ef"}, - {file = "cairocffi-1.7.0.tar.gz", hash = "sha256:7761863603894305f3160eca68452f373433ca8745ab7dd445bd2c6ce50dcab7"}, + {file = "cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f"}, + {file = "cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b"}, ] [package.dependencies] @@ -612,74 +624,89 @@ test = ["flake8", "isort", "pytest"] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -698,101 +725,116 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -811,13 +853,13 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "cloudpickle" -version = "3.0.0" +version = "3.1.0" description = "Pickler class to extend the standard pickle.Pickler functionality" optional = true python-versions = ">=3.8" files = [ - {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, - {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, + {file = "cloudpickle-3.1.0-py3-none-any.whl", hash = "sha256:fe11acda67f61aaaec473e3afe030feb131d78a43461b718185363384f1ba12e"}, + {file = "cloudpickle-3.1.0.tar.gz", hash = "sha256:81a929b6e3c7335c863c771d673d105f02efdb89dfaba0c90495d1c64796601b"}, ] [[package]] @@ -951,63 +993,73 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist" [[package]] name = "coverage" -version = "7.5.3" +version = "7.6.3" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "coverage-7.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45"}, - {file = "coverage-7.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c"}, - {file = "coverage-7.5.3-cp310-cp310-win32.whl", hash = "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84"}, - {file = "coverage-7.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac"}, - {file = "coverage-7.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974"}, - {file = "coverage-7.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614"}, - {file = "coverage-7.5.3-cp311-cp311-win32.whl", hash = "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9"}, - {file = "coverage-7.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a"}, - {file = "coverage-7.5.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8"}, - {file = "coverage-7.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84"}, - {file = "coverage-7.5.3-cp312-cp312-win32.whl", hash = "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08"}, - {file = "coverage-7.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb"}, - {file = "coverage-7.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb"}, - {file = "coverage-7.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0"}, - {file = "coverage-7.5.3-cp38-cp38-win32.whl", hash = "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485"}, - {file = "coverage-7.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56"}, - {file = "coverage-7.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85"}, - {file = "coverage-7.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd"}, - {file = "coverage-7.5.3-cp39-cp39-win32.whl", hash = "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d"}, - {file = "coverage-7.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0"}, - {file = "coverage-7.5.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884"}, - {file = "coverage-7.5.3.tar.gz", hash = "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f"}, + {file = "coverage-7.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6da42bbcec130b188169107ecb6ee7bd7b4c849d24c9370a0c884cf728d8e976"}, + {file = "coverage-7.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c222958f59b0ae091f4535851cbb24eb57fc0baea07ba675af718fb5302dddb2"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab84a8b698ad5a6c365b08061920138e7a7dd9a04b6feb09ba1bfae68346ce6d"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70a6756ce66cd6fe8486c775b30889f0dc4cb20c157aa8c35b45fd7868255c5c"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c2e6fa98032fec8282f6b27e3f3986c6e05702828380618776ad794e938f53a"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:921fbe13492caf6a69528f09d5d7c7d518c8d0e7b9f6701b7719715f29a71e6e"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6d99198203f0b9cb0b5d1c0393859555bc26b548223a769baf7e321a627ed4fc"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87cd2e29067ea397a47e352efb13f976eb1b03e18c999270bb50589323294c6e"}, + {file = "coverage-7.6.3-cp310-cp310-win32.whl", hash = "sha256:a3328c3e64ea4ab12b85999eb0779e6139295bbf5485f69d42cf794309e3d007"}, + {file = "coverage-7.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bca4c8abc50d38f9773c1ec80d43f3768df2e8576807d1656016b9d3eeaa96fd"}, + {file = "coverage-7.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c51ef82302386d686feea1c44dbeef744585da16fcf97deea2a8d6c1556f519b"}, + {file = "coverage-7.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ca37993206402c6c35dc717f90d4c8f53568a8b80f0bf1a1b2b334f4d488fba"}, + {file = "coverage-7.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c77326300b839c44c3e5a8fe26c15b7e87b2f32dfd2fc9fee1d13604347c9b38"}, + {file = "coverage-7.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e484e479860e00da1f005cd19d1c5d4a813324e5951319ac3f3eefb497cc549"}, + {file = "coverage-7.6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c6c0f4d53ef603397fc894a895b960ecd7d44c727df42a8d500031716d4e8d2"}, + {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:37be7b5ea3ff5b7c4a9db16074dc94523b5f10dd1f3b362a827af66a55198175"}, + {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:43b32a06c47539fe275106b376658638b418c7cfdfff0e0259fbf877e845f14b"}, + {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee77c7bef0724165e795b6b7bf9c4c22a9b8468a6bdb9c6b4281293c6b22a90f"}, + {file = "coverage-7.6.3-cp311-cp311-win32.whl", hash = "sha256:43517e1f6b19f610a93d8227e47790722c8bf7422e46b365e0469fc3d3563d97"}, + {file = "coverage-7.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:04f2189716e85ec9192df307f7c255f90e78b6e9863a03223c3b998d24a3c6c6"}, + {file = "coverage-7.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27bd5f18d8f2879e45724b0ce74f61811639a846ff0e5c0395b7818fae87aec6"}, + {file = "coverage-7.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d546cfa78844b8b9c1c0533de1851569a13f87449897bbc95d698d1d3cb2a30f"}, + {file = "coverage-7.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9975442f2e7a5cfcf87299c26b5a45266ab0696348420049b9b94b2ad3d40234"}, + {file = "coverage-7.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:583049c63106c0555e3ae3931edab5669668bbef84c15861421b94e121878d3f"}, + {file = "coverage-7.6.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2341a78ae3a5ed454d524206a3fcb3cec408c2a0c7c2752cd78b606a2ff15af4"}, + {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a4fb91d5f72b7e06a14ff4ae5be625a81cd7e5f869d7a54578fc271d08d58ae3"}, + {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e279f3db904e3b55f520f11f983cc8dc8a4ce9b65f11692d4718ed021ec58b83"}, + {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa23ce39661a3e90eea5f99ec59b763b7d655c2cada10729ed920a38bfc2b167"}, + {file = "coverage-7.6.3-cp312-cp312-win32.whl", hash = "sha256:52ac29cc72ee7e25ace7807249638f94c9b6a862c56b1df015d2b2e388e51dbd"}, + {file = "coverage-7.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:40e8b1983080439d4802d80b951f4a93d991ef3261f69e81095a66f86cf3c3c6"}, + {file = "coverage-7.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9134032f5aa445ae591c2ba6991d10136a1f533b1d2fa8f8c21126468c5025c6"}, + {file = "coverage-7.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:99670790f21a96665a35849990b1df447993880bb6463a0a1d757897f30da929"}, + {file = "coverage-7.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc7d6b380ca76f5e817ac9eef0c3686e7834c8346bef30b041a4ad286449990"}, + {file = "coverage-7.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7b26757b22faf88fcf232f5f0e62f6e0fd9e22a8a5d0d5016888cdfe1f6c1c4"}, + {file = "coverage-7.6.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c59d6a4a4633fad297f943c03d0d2569867bd5372eb5684befdff8df8522e39"}, + {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f263b18692f8ed52c8de7f40a0751e79015983dbd77b16906e5b310a39d3ca21"}, + {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79644f68a6ff23b251cae1c82b01a0b51bc40c8468ca9585c6c4b1aeee570e0b"}, + {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71967c35828c9ff94e8c7d405469a1fb68257f686bca7c1ed85ed34e7c2529c4"}, + {file = "coverage-7.6.3-cp313-cp313-win32.whl", hash = "sha256:e266af4da2c1a4cbc6135a570c64577fd3e6eb204607eaff99d8e9b710003c6f"}, + {file = "coverage-7.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:ea52bd218d4ba260399a8ae4bb6b577d82adfc4518b93566ce1fddd4a49d1dce"}, + {file = "coverage-7.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8d4c6ea0f498c7c79111033a290d060c517853a7bcb2f46516f591dab628ddd3"}, + {file = "coverage-7.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:331b200ad03dbaa44151d74daeb7da2cf382db424ab923574f6ecca7d3b30de3"}, + {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54356a76b67cf8a3085818026bb556545ebb8353951923b88292556dfa9f812d"}, + {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebec65f5068e7df2d49466aab9128510c4867e532e07cb6960075b27658dca38"}, + {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33a785ea8354c480515e781554d3be582a86297e41ccbea627a5c632647f2cd"}, + {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f7ddb920106bbbbcaf2a274d56f46956bf56ecbde210d88061824a95bdd94e92"}, + {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:70d24936ca6c15a3bbc91ee9c7fc661132c6f4c9d42a23b31b6686c05073bde5"}, + {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c30e42ea11badb147f0d2e387115b15e2bd8205a5ad70d6ad79cf37f6ac08c91"}, + {file = "coverage-7.6.3-cp313-cp313t-win32.whl", hash = "sha256:365defc257c687ce3e7d275f39738dcd230777424117a6c76043459db131dd43"}, + {file = "coverage-7.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:23bb63ae3f4c645d2d82fa22697364b0046fbafb6261b258a58587441c5f7bd0"}, + {file = "coverage-7.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da29ceabe3025a1e5a5aeeb331c5b1af686daab4ff0fb4f83df18b1180ea83e2"}, + {file = "coverage-7.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df8c05a0f574d480947cba11b947dc41b1265d721c3777881da2fb8d3a1ddfba"}, + {file = "coverage-7.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec1e3b40b82236d100d259854840555469fad4db64f669ab817279eb95cd535c"}, + {file = "coverage-7.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4adeb878a374126f1e5cf03b87f66279f479e01af0e9a654cf6d1509af46c40"}, + {file = "coverage-7.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43d6a66e33b1455b98fc7312b124296dad97a2e191c80320587234a77b1b736e"}, + {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1990b1f4e2c402beb317840030bb9f1b6a363f86e14e21b4212e618acdfce7f6"}, + {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:12f9515d875859faedb4144fd38694a761cd2a61ef9603bf887b13956d0bbfbb"}, + {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99ded130555c021d99729fabd4ddb91a6f4cc0707df4b1daf912c7850c373b13"}, + {file = "coverage-7.6.3-cp39-cp39-win32.whl", hash = "sha256:c3a79f56dee9136084cf84a6c7c4341427ef36e05ae6415bf7d787c96ff5eaa3"}, + {file = "coverage-7.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:aac7501ae73d4a02f4b7ac8fcb9dc55342ca98ffb9ed9f2dfb8a25d53eda0e4d"}, + {file = "coverage-7.6.3-pp39.pp310-none-any.whl", hash = "sha256:b9853509b4bf57ba7b1f99b9d866c422c9c5248799ab20e652bbb8a184a38181"}, + {file = "coverage-7.6.3.tar.gz", hash = "sha256:bb7d5fe92bd0dc235f63ebe9f8c6e0884f7360f88f3411bfed1350c872ef2054"}, ] [package.dependencies] @@ -1018,38 +1070,38 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "43.0.1" +version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a"}, - {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042"}, - {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494"}, - {file = "cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2"}, - {file = "cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d"}, - {file = "cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1"}, - {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa"}, - {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4"}, - {file = "cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47"}, - {file = "cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2"}, - {file = "cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d"}, + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] [package.dependencies] @@ -1062,7 +1114,7 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "cryptography-vectors (==43.0.1)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -1148,13 +1200,13 @@ databind = ">=4.5.2,<5.0.0" [[package]] name = "databricks-sdk" -version = "0.31.1" +version = "0.35.0" description = "Databricks SDK for Python (Beta)" optional = true python-versions = ">=3.7" files = [ - {file = "databricks_sdk-0.31.1-py3-none-any.whl", hash = "sha256:9ab286f87ae1cc98a00ef7d207e40661f4d14a464071425ad169d235919b35f6"}, - {file = "databricks_sdk-0.31.1.tar.gz", hash = "sha256:8609e655d0e5ecb15c2a8a6468e737f8dcb4f28c33239388de3ab386b921d790"}, + {file = "databricks_sdk-0.35.0-py3-none-any.whl", hash = "sha256:00cce49014dfa1d5912cb18e376d28b2de8829a8f645d87d4040bae048630578"}, + {file = "databricks_sdk-0.35.0.tar.gz", hash = "sha256:9446409fd321b43ac586653120b16734d13a97674fee9f89b6562f24d32d48e0"}, ] [package.dependencies] @@ -1162,38 +1214,43 @@ google-auth = ">=2.0,<3.0" requests = ">=2.28.1,<3" [package.extras] -dev = ["autoflake", "databricks-connect", "ipython", "ipywidgets", "isort", "pycodestyle", "pyfakefs", "pytest", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-xdist", "requests-mock", "wheel", "yapf"] +dev = ["autoflake", "databricks-connect", "httpx", "ipython", "ipywidgets", "isort", "langchain-openai", "openai", "pycodestyle", "pyfakefs", "pytest", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-xdist", "requests-mock", "wheel", "yapf"] notebook = ["ipython (>=8,<9)", "ipywidgets (>=8,<9)"] +openai = ["httpx", "langchain-openai", "openai"] [[package]] name = "debugpy" -version = "1.8.1" +version = "1.8.7" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, - {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, - {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, - {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, - {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, - {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, - {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, - {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, - {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, - {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, - {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, - {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, - {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, - {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, - {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, - {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, - {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, - {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, - {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, - {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, - {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, - {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, + {file = "debugpy-1.8.7-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b"}, + {file = "debugpy-1.8.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9"}, + {file = "debugpy-1.8.7-cp310-cp310-win32.whl", hash = "sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55"}, + {file = "debugpy-1.8.7-cp310-cp310-win_amd64.whl", hash = "sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037"}, + {file = "debugpy-1.8.7-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f"}, + {file = "debugpy-1.8.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0"}, + {file = "debugpy-1.8.7-cp311-cp311-win32.whl", hash = "sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2"}, + {file = "debugpy-1.8.7-cp311-cp311-win_amd64.whl", hash = "sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211"}, + {file = "debugpy-1.8.7-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706"}, + {file = "debugpy-1.8.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2"}, + {file = "debugpy-1.8.7-cp312-cp312-win32.whl", hash = "sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca"}, + {file = "debugpy-1.8.7-cp312-cp312-win_amd64.whl", hash = "sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39"}, + {file = "debugpy-1.8.7-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40"}, + {file = "debugpy-1.8.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7"}, + {file = "debugpy-1.8.7-cp313-cp313-win32.whl", hash = "sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba"}, + {file = "debugpy-1.8.7-cp313-cp313-win_amd64.whl", hash = "sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa"}, + {file = "debugpy-1.8.7-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:4b908291a1d051ef3331484de8e959ef3e66f12b5e610c203b5b75d2725613a7"}, + {file = "debugpy-1.8.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da8df5b89a41f1fd31503b179d0a84a5fdb752dddd5b5388dbd1ae23cda31ce9"}, + {file = "debugpy-1.8.7-cp38-cp38-win32.whl", hash = "sha256:b12515e04720e9e5c2216cc7086d0edadf25d7ab7e3564ec8b4521cf111b4f8c"}, + {file = "debugpy-1.8.7-cp38-cp38-win_amd64.whl", hash = "sha256:93176e7672551cb5281577cdb62c63aadc87ec036f0c6a486f0ded337c504596"}, + {file = "debugpy-1.8.7-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:90d93e4f2db442f8222dec5ec55ccfc8005821028982f1968ebf551d32b28907"}, + {file = "debugpy-1.8.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6db2a370e2700557a976eaadb16243ec9c91bd46f1b3bb15376d7aaa7632c81"}, + {file = "debugpy-1.8.7-cp39-cp39-win32.whl", hash = "sha256:a6cf2510740e0c0b4a40330640e4b454f928c7b99b0c9dbf48b11efba08a8cda"}, + {file = "debugpy-1.8.7-cp39-cp39-win_amd64.whl", hash = "sha256:6a9d9d6d31846d8e34f52987ee0f1a904c7baa4912bf4843ab39dadf9b8f3e0d"}, + {file = "debugpy-1.8.7-py2.py3-none-any.whl", hash = "sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae"}, + {file = "debugpy-1.8.7.zip", hash = "sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e"}, ] [[package]] @@ -1251,13 +1308,13 @@ dev = ["attribution (==1.6.2)", "black (==23.3.0)", "flit (==3.8.0)", "mypy (==1 [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, - {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, ] [[package]] @@ -1358,13 +1415,13 @@ test = ["black", "pytest"] [[package]] name = "docutils" -version = "0.20.1" +version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, - {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] [[package]] @@ -1380,13 +1437,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -1394,13 +1451,13 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.0.1" +version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] @@ -1408,56 +1465,72 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "faiss-cpu" -version = "1.8.0" +version = "1.9.0" description = "A library for efficient similarity search and clustering of dense vectors." optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "faiss-cpu-1.8.0.tar.gz", hash = "sha256:3ee1549491728f37b65267c192a94661a907154a8ae0546ad50a564b8be0d82e"}, - {file = "faiss_cpu-1.8.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:134a064c7411acf7d1d863173a9d2605c5a59bd573639ab39a5ded5ca983b1b2"}, - {file = "faiss_cpu-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba8e6202d561ac57394c9d691ff17f8fa6eb9a077913a993fce0a154ec0176f1"}, - {file = "faiss_cpu-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66e9fa7b70556a39681f06e0652f4124c8ddb0a1924afe4f0e40b6924dc845b"}, - {file = "faiss_cpu-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51aaef5a1255d0ea88ea7e52a2415f98c5dd2dd9cec10348d55136541eeec99f"}, - {file = "faiss_cpu-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:38152761242870ec7019e0397cbd0ed0b0716562029ce41a71bb38448bd6d5bc"}, - {file = "faiss_cpu-1.8.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:c9e6ad94b86626be1a0faff3e53c4ca169eba88aa156d7e90c5a2e9ba30558fb"}, - {file = "faiss_cpu-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4601dbd81733bf1bc3bff690aac981289fb386dc8e60d0c4eec8a37ba6856d20"}, - {file = "faiss_cpu-1.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa943d3b5e8c5c77cdd629d9c3c6f78d7da616e586fdd1b94aecbf2e5fa9ba06"}, - {file = "faiss_cpu-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b644b366c3b239b34fa3e08bf65bfc78a24eda1e1ea5b2b6d9be3e8fc73d8179"}, - {file = "faiss_cpu-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:f85ecf3514850f93985be238351f5a70736133cfae784b372640aa17c6343a1b"}, - {file = "faiss_cpu-1.8.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:61abc0129a357ac00f17f5167f14dff41480de2cc852f306c3d4cd36b893ccbd"}, - {file = "faiss_cpu-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b788186d6eb94e6333e1aa8bb6c84b66e967458ecdd1cee22e16f04c43ee674c"}, - {file = "faiss_cpu-1.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5658d90a202c62e4a69c5b065785e9ddcaf6986cb395c16afed8dbe4c58c31a2"}, - {file = "faiss_cpu-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d460a372efce547e53d3c47d2c2a8a90b186ad245969048c10c1d7a1e5cf21b"}, - {file = "faiss_cpu-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:9e6520324f0a6764dd267b3c32c76958bf2b1ec36752950f6fab31a7295980a0"}, - {file = "faiss_cpu-1.8.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:fc44be179d5b7f690484ef0d0caf817fea2698a5275a0c7fb6cbf406e5b2e4d1"}, - {file = "faiss_cpu-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bbd6f0bc2e1424a12dc7e19d2cc95b53124867966b21110d26f909227e7ed1f1"}, - {file = "faiss_cpu-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06e7add0c8a06ce8fb0443c38fcaf49c45fb74527ea633b819e56452608e64f5"}, - {file = "faiss_cpu-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b864e23c1817fa6cfe9bbec096fd7140d596002934f71aa89b196ffb1b9cd846"}, - {file = "faiss_cpu-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:655433755845adbb6f0961e2f8980703640cb9faa96f1cd1ea190252149e0d0a"}, - {file = "faiss_cpu-1.8.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:e81fc376a3bcda213ffb395dda1018c953ce927c587731ad582f4e6c2b225363"}, - {file = "faiss_cpu-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c6fa6b7eaf558307b4ab118a236e8d1da79a8685222928e4dd52e277dba144a"}, - {file = "faiss_cpu-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652f6812ef2e8b0f9b18209828c590bc618aca82e7f1c1b1888f52928258e406"}, - {file = "faiss_cpu-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:304da4e0d19044374b63a5b6467028572eac4bd3f32bc9e8783d800a03fb1f02"}, - {file = "faiss_cpu-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:cb475d3f25f08c97ac64dfe026f113e2aeb9829b206b3b046256c3b40dd7eb62"}, -] - -[package.dependencies] -numpy = "*" + {file = "faiss_cpu-1.9.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:e415a149893629db2215776395460d0cf79ac5f56a62242de68f788a22b66818"}, + {file = "faiss_cpu-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81f211896107a114450297571210684701d1fce5b998d8a06e2549f6be7af20c"}, + {file = "faiss_cpu-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf76982c45027817df7816232dad9d2f6471637ceaa76c1cc72e858c6e31d8d3"}, + {file = "faiss_cpu-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:091d3df18dc9ae43e47203ff0c3c8ffcd51939a6de17e851751dcc263c86b16b"}, + {file = "faiss_cpu-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:eababc154e95930045f86d2483aeb4ed8451b1bb9b97451a2633df20190f5ee2"}, + {file = "faiss_cpu-1.9.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:b0e9208a36da519dc2eb90e4c44c66a6812a5b68457582d8ed21d04e910e3d1f"}, + {file = "faiss_cpu-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6a4b2871057560020b83ad7bb5aaf3b97b64f980f9af2ca99ba34eeb4fe38bdf"}, + {file = "faiss_cpu-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f1dc3a42ea386f49a86a9d09a3e30a40fa2e678395df5c2f5706c3f26f06751"}, + {file = "faiss_cpu-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2baeed5f1d8b006533c71184cc29065892647774a3df9c6f6dc31c1b694f57fa"}, + {file = "faiss_cpu-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:81d8fcb0ef92c9e7af2f7104e321895462681a598aff6d526a8da8272a61c1dd"}, + {file = "faiss_cpu-1.9.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:2ed784120f6be7a7cde90f507831e670b4edc94f20cc7955eef3ae5fba70d449"}, + {file = "faiss_cpu-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:358be27446389c9df374fba17221ae5e45a7a8c943c4c675f81814d6fb7c31b1"}, + {file = "faiss_cpu-1.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a0b5ec546c7455cf526326194ace125199769ccbc90bb69b464cd4a26b7f4d"}, + {file = "faiss_cpu-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f03a4882e27c71ead60d84d06263d3f8592c842f0f469eeaf7883cfd4f2bfa"}, + {file = "faiss_cpu-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:39a163c2c3c33df10b82fd3b61cb6c8bd7884e2526f1393de32ed71814c5cbfb"}, + {file = "faiss_cpu-1.9.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b04745b9b93736a7bdf18dd459a3362d154a6dae2e450de3f804f193154d79c9"}, + {file = "faiss_cpu-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25dd895a952b5f6dad5dcdb901f853e33359e24ee2b871f418b87af054ed06e0"}, + {file = "faiss_cpu-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0010ddfd16f7c71e1119111973fe2f34b6abc6b40492b688244e821b5a931964"}, + {file = "faiss_cpu-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5908e619b3ab2cd1f23f939a995cc2559408dffa9795b69ca78f89a08b993873"}, + {file = "faiss_cpu-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc40f1029515baa0228c0c5113b870c5d94961d3232ca25f127162945424375b"}, + {file = "faiss_cpu-1.9.0.tar.gz", hash = "sha256:587fcea9fa478e9307a388754824a032849d317894a607586c3cdd8c8aeb7233"}, +] + +[package.dependencies] +numpy = ">=1.25.0,<3.0" +packaging = "*" [[package]] name = "faker" -version = "25.2.0" +version = "25.9.2" description = "Faker is a Python package that generates fake data for you." optional = false python-versions = ">=3.8" files = [ - {file = "Faker-25.2.0-py3-none-any.whl", hash = "sha256:cfe97c4857c4c36ee32ea4aaabef884895992e209bae4cbd26807cf3e05c6918"}, - {file = "Faker-25.2.0.tar.gz", hash = "sha256:45b84f47ff1ef86e3d1a8d11583ca871ecf6730fad0660edadc02576583a2423"}, + {file = "Faker-25.9.2-py3-none-any.whl", hash = "sha256:7f8cbd179a7351648bea31f53d021a2bdfdeb59e9b830e121a635916615e0ecd"}, + {file = "Faker-25.9.2.tar.gz", hash = "sha256:ca94843600a4089a91394023fef014bb41fee509f8c4beef1530018373e770fb"}, ] [package.dependencies] python-dateutil = ">=2.4" +[[package]] +name = "fastapi" +version = "0.115.2" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.115.2-py3-none-any.whl", hash = "sha256:61704c71286579cc5a598763905928f24ee98bfcc07aabe84cfefb98812bbc86"}, + {file = "fastapi-0.115.2.tar.gz", hash = "sha256:3995739e0b09fa12f984bce8fa9ae197b35d433750d3d312422d846e283697ee"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.37.2,<0.41.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "python-multipart (>=0.0.7)", "uvicorn[standard] (>=0.12.0)"] + [[package]] name = "fastcore" version = "1.4.2" @@ -1478,13 +1551,13 @@ dev = ["matplotlib", "nbdev (>=0.2.39)", "numpy", "pandas", "pillow", "torch"] [[package]] name = "fastjsonschema" -version = "2.19.1" +version = "2.20.0" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, - {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, + {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, + {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, ] [package.extras] @@ -1510,25 +1583,25 @@ pyyaml = "*" [[package]] name = "filelock" -version = "3.14.0" +version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] -typing = ["typing-extensions (>=4.8)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "flask" version = "3.0.3" description = "A simple framework for building complex web applications." -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "flask-3.0.3-py3-none-any.whl", hash = "sha256:34e815dfaa43340d1d15a5c3a02b8476004037eb4840b34910c6e21679d288f3"}, @@ -1547,99 +1620,61 @@ Werkzeug = ">=3.0.0" async = ["asgiref (>=3.2)"] dotenv = ["python-dotenv"] -[[package]] -name = "flask-caching" -version = "2.3.0" -description = "Adds caching support to Flask applications." -optional = false -python-versions = ">=3.8" -files = [ - {file = "Flask_Caching-2.3.0-py3-none-any.whl", hash = "sha256:51771c75682e5abc1483b78b96d9131d7941dc669b073852edfa319dd4e29b6e"}, - {file = "flask_caching-2.3.0.tar.gz", hash = "sha256:d7e4ca64a33b49feb339fcdd17e6ba25f5e01168cf885e53790e885f83a4d2cf"}, -] - -[package.dependencies] -cachelib = ">=0.9.0,<0.10.0" -Flask = "*" - -[[package]] -name = "flask-cors" -version = "4.0.1" -description = "A Flask extension adding a decorator for CORS support" -optional = false -python-versions = "*" -files = [ - {file = "Flask_Cors-4.0.1-py2.py3-none-any.whl", hash = "sha256:f2a704e4458665580c074b714c4627dd5a306b333deb9074d0b1794dfa2fb677"}, - {file = "flask_cors-4.0.1.tar.gz", hash = "sha256:eeb69b342142fdbf4766ad99357a7f3876a2ceb77689dc10ff912aac06c389e4"}, -] - -[package.dependencies] -Flask = ">=0.9" - -[[package]] -name = "flask-sqlalchemy" -version = "3.1.1" -description = "Add SQLAlchemy support to your Flask application." -optional = false -python-versions = ">=3.8" -files = [ - {file = "flask_sqlalchemy-3.1.1-py3-none-any.whl", hash = "sha256:4ba4be7f419dc72f4efd8802d69974803c37259dd42f3913b0dcf75c9447e0a0"}, - {file = "flask_sqlalchemy-3.1.1.tar.gz", hash = "sha256:e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312"}, -] - -[package.dependencies] -flask = ">=2.2.5" -sqlalchemy = ">=2.0.16" - [[package]] name = "fonttools" -version = "4.53.1" +version = "4.54.1" description = "Tools to manipulate font files" optional = true python-versions = ">=3.8" files = [ - {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, - {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, - {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, - {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, - {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, - {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, - {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, - {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, - {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, - {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, - {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, - {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, - {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, - {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, + {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, + {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, + {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, + {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, + {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, + {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, + {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, + {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, + {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, + {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, + {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, + {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, + {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, + {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, + {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, + {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, ] [package.extras] @@ -1755,13 +1790,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.6.0" +version = "2024.9.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.6.0-py3-none-any.whl", hash = "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee"}, - {file = "fsspec-2024.6.0.tar.gz", hash = "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2"}, + {file = "fsspec-2024.9.0-py3-none-any.whl", hash = "sha256:a0947d552d8a6efa72cc2c730b12c41d043509156966cca4fb157b0f2a0c574b"}, + {file = "fsspec-2024.9.0.tar.gz", hash = "sha256:4b0afb90c2f21832df142f292649035d80b421f60a9e1c027802e5a0da2b04e8"}, ] [package.extras] @@ -1862,13 +1897,13 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", [[package]] name = "google-auth" -version = "2.34.0" +version = "2.35.0" description = "Google Authentication Library" optional = true python-versions = ">=3.7" files = [ - {file = "google_auth-2.34.0-py2.py3-none-any.whl", hash = "sha256:72fd4733b80b6d777dcde515628a9eb4a577339437012874ea286bca7261ee65"}, - {file = "google_auth-2.34.0.tar.gz", hash = "sha256:8eb87396435c19b20d32abd2f984e31c191a15284af72eb922f10e5bde9c04cc"}, + {file = "google_auth-2.35.0-py2.py3-none-any.whl", hash = "sha256:25df55f327ef021de8be50bad0dfd4a916ad0de96da86cd05661c9297723ad3f"}, + {file = "google_auth-2.35.0.tar.gz", hash = "sha256:f4c64ed4e01e8e8b646ef34c018f8bf3338df0c8e37d8b3bba40e7f574a3278a"}, ] [package.dependencies] @@ -1885,52 +1920,55 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "googleapis-common-protos" -version = "1.63.1" +version = "1.65.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"}, - {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"}, + {file = "googleapis_common_protos-1.65.0-py2.py3-none-any.whl", hash = "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63"}, + {file = "googleapis_common_protos-1.65.0.tar.gz", hash = "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0"}, ] [package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "graphene" -version = "3.3" +version = "3.4" description = "GraphQL Framework for Python" optional = true python-versions = "*" files = [ - {file = "graphene-3.3-py2.py3-none-any.whl", hash = "sha256:bb3810be33b54cb3e6969506671eb72319e8d7ba0d5ca9c8066472f75bf35a38"}, - {file = "graphene-3.3.tar.gz", hash = "sha256:529bf40c2a698954217d3713c6041d69d3f719ad0080857d7ee31327112446b0"}, + {file = "graphene-3.4-py2.py3-none-any.whl", hash = "sha256:28bf359b802cdb808130a5521135d4c88a262564598cfdc91628d2c172b99dce"}, + {file = "graphene-3.4.tar.gz", hash = "sha256:65e5ec84c5b7fb4fc41518acfbafb62ebb393d3982fbba00cd5393e431a80b97"}, ] [package.dependencies] -aniso8601 = ">=8,<10" graphql-core = ">=3.1,<3.3" graphql-relay = ">=3.1,<3.3" +typing-extensions = ">=4.7.1,<5" [package.extras] -dev = ["black (==22.3.0)", "coveralls (>=3.3,<4)", "flake8 (>=4,<5)", "iso8601 (>=1,<2)", "mock (>=4,<5)", "pytest (>=6,<7)", "pytest-asyncio (>=0.16,<2)", "pytest-benchmark (>=3.4,<4)", "pytest-cov (>=3,<4)", "pytest-mock (>=3,<4)", "pytz (==2022.1)", "snapshottest (>=0.6,<1)"] -test = ["coveralls (>=3.3,<4)", "iso8601 (>=1,<2)", "mock (>=4,<5)", "pytest (>=6,<7)", "pytest-asyncio (>=0.16,<2)", "pytest-benchmark (>=3.4,<4)", "pytest-cov (>=3,<4)", "pytest-mock (>=3,<4)", "pytz (==2022.1)", "snapshottest (>=0.6,<1)"] +dev = ["coveralls (>=3.3,<5)", "pytest (>=8,<9)", "pytest-asyncio (>=0.16,<2)", "pytest-benchmark (>=4,<5)", "pytest-cov (>=5,<6)", "pytest-mock (>=3,<4)", "ruff (==0.5.0)"] +test = ["coveralls (>=3.3,<5)", "pytest (>=8,<9)", "pytest-asyncio (>=0.16,<2)", "pytest-benchmark (>=4,<5)", "pytest-cov (>=5,<6)", "pytest-mock (>=3,<4)"] [[package]] name = "graphql-core" -version = "3.2.3" +version = "3.2.5" description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." optional = true -python-versions = ">=3.6,<4" +python-versions = "<4,>=3.6" files = [ - {file = "graphql-core-3.2.3.tar.gz", hash = "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"}, - {file = "graphql_core-3.2.3-py3-none-any.whl", hash = "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3"}, + {file = "graphql_core-3.2.5-py3-none-any.whl", hash = "sha256:2f150d5096448aa4f8ab26268567bbfeef823769893b39c1a2e1409590939c8a"}, + {file = "graphql_core-3.2.5.tar.gz", hash = "sha256:e671b90ed653c808715645e3998b7ab67d382d55467b7e2978549111bbabf8d5"}, ] +[package.dependencies] +typing-extensions = {version = ">=4,<5", markers = "python_version < \"3.10\""} + [[package]] name = "graphql-relay" version = "3.2.0" @@ -1947,69 +1985,84 @@ graphql-core = ">=3.2,<3.3" [[package]] name = "greenlet" -version = "3.0.3" +version = "3.1.1" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ - {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, - {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, - {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, - {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, - {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, - {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, - {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, - {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, - {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, - {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, - {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, - {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, ] [package.extras] @@ -2032,109 +2085,139 @@ colorama = ">=0.4" [[package]] name = "grpcio" -version = "1.64.0" +version = "1.67.0" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.64.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:3b09c3d9de95461214a11d82cc0e6a46a6f4e1f91834b50782f932895215e5db"}, - {file = "grpcio-1.64.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:7e013428ab472892830287dd082b7d129f4d8afef49227a28223a77337555eaa"}, - {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:02cc9cc3f816d30f7993d0d408043b4a7d6a02346d251694d8ab1f78cc723e7e"}, - {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5de082d936e0208ce8db9095821361dfa97af8767a6607ae71425ac8ace15c"}, - {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b7bf346391dffa182fba42506adf3a84f4a718a05e445b37824136047686a1"}, - {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b2cbdfba18408389a1371f8c2af1659119e1831e5ed24c240cae9e27b4abc38d"}, - {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca4f15427d2df592e0c8f3d38847e25135e4092d7f70f02452c0e90d6a02d6d"}, - {file = "grpcio-1.64.0-cp310-cp310-win32.whl", hash = "sha256:7c1f5b2298244472bcda49b599be04579f26425af0fd80d3f2eb5fd8bc84d106"}, - {file = "grpcio-1.64.0-cp310-cp310-win_amd64.whl", hash = "sha256:73f84f9e5985a532e47880b3924867de16fa1aa513fff9b26106220c253c70c5"}, - {file = "grpcio-1.64.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2a18090371d138a57714ee9bffd6c9c9cb2e02ce42c681aac093ae1e7189ed21"}, - {file = "grpcio-1.64.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:59c68df3a934a586c3473d15956d23a618b8f05b5e7a3a904d40300e9c69cbf0"}, - {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b52e1ec7185512103dd47d41cf34ea78e7a7361ba460187ddd2416b480e0938c"}, - {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d598b5d5e2c9115d7fb7e2cb5508d14286af506a75950762aa1372d60e41851"}, - {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01615bbcae6875eee8091e6b9414072f4e4b00d8b7e141f89635bdae7cf784e5"}, - {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0b2dfe6dcace264807d9123d483d4c43274e3f8c39f90ff51de538245d7a4145"}, - {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7f17572dc9acd5e6dfd3014d10c0b533e9f79cd9517fc10b0225746f4c24b58e"}, - {file = "grpcio-1.64.0-cp311-cp311-win32.whl", hash = "sha256:6ec5ed15b4ffe56e2c6bc76af45e6b591c9be0224b3fb090adfb205c9012367d"}, - {file = "grpcio-1.64.0-cp311-cp311-win_amd64.whl", hash = "sha256:597191370951b477b7a1441e1aaa5cacebeb46a3b0bd240ec3bb2f28298c7553"}, - {file = "grpcio-1.64.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:1ce4cd5a61d4532651079e7aae0fedf9a80e613eed895d5b9743e66b52d15812"}, - {file = "grpcio-1.64.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:650a8150a9b288f40d5b7c1d5400cc11724eae50bd1f501a66e1ea949173649b"}, - {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8de0399b983f8676a7ccfdd45e5b2caec74a7e3cc576c6b1eecf3b3680deda5e"}, - {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46b8b43ba6a2a8f3103f103f97996cad507bcfd72359af6516363c48793d5a7b"}, - {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a54362f03d4dcfae63be455d0a7d4c1403673498b92c6bfe22157d935b57c7a9"}, - {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1f8ea18b928e539046bb5f9c124d717fbf00cc4b2d960ae0b8468562846f5aa1"}, - {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c56c91bd2923ddb6e7ed28ebb66d15633b03e0df22206f22dfcdde08047e0a48"}, - {file = "grpcio-1.64.0-cp312-cp312-win32.whl", hash = "sha256:874c741c8a66f0834f653a69e7e64b4e67fcd4a8d40296919b93bab2ccc780ba"}, - {file = "grpcio-1.64.0-cp312-cp312-win_amd64.whl", hash = "sha256:0da1d921f8e4bcee307aeef6c7095eb26e617c471f8cb1c454fd389c5c296d1e"}, - {file = "grpcio-1.64.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:c46fb6bfca17bfc49f011eb53416e61472fa96caa0979b4329176bdd38cbbf2a"}, - {file = "grpcio-1.64.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3d2004e85cf5213995d09408501f82c8534700d2babeb81dfdba2a3bff0bb396"}, - {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6d5541eb460d73a07418524fb64dcfe0adfbcd32e2dac0f8f90ce5b9dd6c046c"}, - {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f279ad72dd7d64412e10f2443f9f34872a938c67387863c4cd2fb837f53e7d2"}, - {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85fda90b81da25993aa47fae66cae747b921f8f6777550895fb62375b776a231"}, - {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a053584079b793a54bece4a7d1d1b5c0645bdbee729215cd433703dc2532f72b"}, - {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:579dd9fb11bc73f0de061cab5f8b2def21480fd99eb3743ed041ad6a1913ee2f"}, - {file = "grpcio-1.64.0-cp38-cp38-win32.whl", hash = "sha256:23b6887bb21d77649d022fa1859e05853fdc2e60682fd86c3db652a555a282e0"}, - {file = "grpcio-1.64.0-cp38-cp38-win_amd64.whl", hash = "sha256:753cb58683ba0c545306f4e17dabf468d29cb6f6b11832e1e432160bb3f8403c"}, - {file = "grpcio-1.64.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:2186d76a7e383e1466e0ea2b0febc343ffeae13928c63c6ec6826533c2d69590"}, - {file = "grpcio-1.64.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0f30596cdcbed3c98024fb4f1d91745146385b3f9fd10c9f2270cbfe2ed7ed91"}, - {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:d9171f025a196f5bcfec7e8e7ffb7c3535f7d60aecd3503f9e250296c7cfc150"}, - {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf4c8daed18ae2be2f1fc7d613a76ee2a2e28fdf2412d5c128be23144d28283d"}, - {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3550493ac1d23198d46dc9c9b24b411cef613798dc31160c7138568ec26bc9b4"}, - {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3161a8f8bb38077a6470508c1a7301cd54301c53b8a34bb83e3c9764874ecabd"}, - {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e8fabe2cc57a369638ab1ad8e6043721014fdf9a13baa7c0e35995d3a4a7618"}, - {file = "grpcio-1.64.0-cp39-cp39-win32.whl", hash = "sha256:31890b24d47b62cc27da49a462efe3d02f3c120edb0e6c46dcc0025506acf004"}, - {file = "grpcio-1.64.0-cp39-cp39-win_amd64.whl", hash = "sha256:5a56797dea8c02e7d3a85dfea879f286175cf4d14fbd9ab3ef2477277b927baa"}, - {file = "grpcio-1.64.0.tar.gz", hash = "sha256:257baf07f53a571c215eebe9679c3058a313fd1d1f7c4eede5a8660108c52d9c"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.64.0)"] + {file = "grpcio-1.67.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:bd79929b3bb96b54df1296cd3bf4d2b770bd1df6c2bdf549b49bab286b925cdc"}, + {file = "grpcio-1.67.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:16724ffc956ea42967f5758c2f043faef43cb7e48a51948ab593570570d1e68b"}, + {file = "grpcio-1.67.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:2b7183c80b602b0ad816315d66f2fb7887614ead950416d60913a9a71c12560d"}, + {file = "grpcio-1.67.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efe32b45dd6d118f5ea2e5deaed417d8a14976325c93812dd831908522b402c9"}, + {file = "grpcio-1.67.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe89295219b9c9e47780a0f1c75ca44211e706d1c598242249fe717af3385ec8"}, + {file = "grpcio-1.67.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa8d025fae1595a207b4e47c2e087cb88d47008494db258ac561c00877d4c8f8"}, + {file = "grpcio-1.67.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f95e15db43e75a534420e04822df91f645664bf4ad21dfaad7d51773c80e6bb4"}, + {file = "grpcio-1.67.0-cp310-cp310-win32.whl", hash = "sha256:a6b9a5c18863fd4b6624a42e2712103fb0f57799a3b29651c0e5b8119a519d65"}, + {file = "grpcio-1.67.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6eb68493a05d38b426604e1dc93bfc0137c4157f7ab4fac5771fd9a104bbaa6"}, + {file = "grpcio-1.67.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:e91d154689639932305b6ea6f45c6e46bb51ecc8ea77c10ef25aa77f75443ad4"}, + {file = "grpcio-1.67.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cb204a742997277da678611a809a8409657b1398aaeebf73b3d9563b7d154c13"}, + {file = "grpcio-1.67.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:ae6de510f670137e755eb2a74b04d1041e7210af2444103c8c95f193340d17ee"}, + {file = "grpcio-1.67.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74b900566bdf68241118f2918d312d3bf554b2ce0b12b90178091ea7d0a17b3d"}, + {file = "grpcio-1.67.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4e95e43447a02aa603abcc6b5e727d093d161a869c83b073f50b9390ecf0fa8"}, + {file = "grpcio-1.67.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0bb94e66cd8f0baf29bd3184b6aa09aeb1a660f9ec3d85da615c5003154bc2bf"}, + {file = "grpcio-1.67.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:82e5bd4b67b17c8c597273663794a6a46a45e44165b960517fe6d8a2f7f16d23"}, + {file = "grpcio-1.67.0-cp311-cp311-win32.whl", hash = "sha256:7fc1d2b9fd549264ae585026b266ac2db53735510a207381be509c315b4af4e8"}, + {file = "grpcio-1.67.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac11ecb34a86b831239cc38245403a8de25037b448464f95c3315819e7519772"}, + {file = "grpcio-1.67.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:227316b5631260e0bef8a3ce04fa7db4cc81756fea1258b007950b6efc90c05d"}, + {file = "grpcio-1.67.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d90cfdafcf4b45a7a076e3e2a58e7bc3d59c698c4f6470b0bb13a4d869cf2273"}, + {file = "grpcio-1.67.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:77196216d5dd6f99af1c51e235af2dd339159f657280e65ce7e12c1a8feffd1d"}, + {file = "grpcio-1.67.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c05a26a0f7047f720da41dc49406b395c1470eef44ff7e2c506a47ac2c0591"}, + {file = "grpcio-1.67.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3840994689cc8cbb73d60485c594424ad8adb56c71a30d8948d6453083624b52"}, + {file = "grpcio-1.67.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5a1e03c3102b6451028d5dc9f8591131d6ab3c8a0e023d94c28cb930ed4b5f81"}, + {file = "grpcio-1.67.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:682968427a63d898759474e3b3178d42546e878fdce034fd7474ef75143b64e3"}, + {file = "grpcio-1.67.0-cp312-cp312-win32.whl", hash = "sha256:d01793653248f49cf47e5695e0a79805b1d9d4eacef85b310118ba1dfcd1b955"}, + {file = "grpcio-1.67.0-cp312-cp312-win_amd64.whl", hash = "sha256:985b2686f786f3e20326c4367eebdaed3e7aa65848260ff0c6644f817042cb15"}, + {file = "grpcio-1.67.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:8c9a35b8bc50db35ab8e3e02a4f2a35cfba46c8705c3911c34ce343bd777813a"}, + {file = "grpcio-1.67.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:42199e704095b62688998c2d84c89e59a26a7d5d32eed86d43dc90e7a3bd04aa"}, + {file = "grpcio-1.67.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c4c425f440fb81f8d0237c07b9322fc0fb6ee2b29fbef5f62a322ff8fcce240d"}, + {file = "grpcio-1.67.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:323741b6699cd2b04a71cb38f502db98f90532e8a40cb675393d248126a268af"}, + {file = "grpcio-1.67.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:662c8e105c5e5cee0317d500eb186ed7a93229586e431c1bf0c9236c2407352c"}, + {file = "grpcio-1.67.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f6bd2ab135c64a4d1e9e44679a616c9bc944547357c830fafea5c3caa3de5153"}, + {file = "grpcio-1.67.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:2f55c1e0e2ae9bdd23b3c63459ee4c06d223b68aeb1961d83c48fb63dc29bc03"}, + {file = "grpcio-1.67.0-cp313-cp313-win32.whl", hash = "sha256:fd6bc27861e460fe28e94226e3673d46e294ca4673d46b224428d197c5935e69"}, + {file = "grpcio-1.67.0-cp313-cp313-win_amd64.whl", hash = "sha256:cf51d28063338608cd8d3cd64677e922134837902b70ce00dad7f116e3998210"}, + {file = "grpcio-1.67.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:7f200aca719c1c5dc72ab68be3479b9dafccdf03df530d137632c534bb6f1ee3"}, + {file = "grpcio-1.67.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0892dd200ece4822d72dd0952f7112c542a487fc48fe77568deaaa399c1e717d"}, + {file = "grpcio-1.67.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:f4d613fbf868b2e2444f490d18af472ccb47660ea3df52f068c9c8801e1f3e85"}, + {file = "grpcio-1.67.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c69bf11894cad9da00047f46584d5758d6ebc9b5950c0dc96fec7e0bce5cde9"}, + {file = "grpcio-1.67.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9bca3ca0c5e74dea44bf57d27e15a3a3996ce7e5780d61b7c72386356d231db"}, + {file = "grpcio-1.67.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:014dfc020e28a0d9be7e93a91f85ff9f4a87158b7df9952fe23cc42d29d31e1e"}, + {file = "grpcio-1.67.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d4ea4509d42c6797539e9ec7496c15473177ce9abc89bc5c71e7abe50fc25737"}, + {file = "grpcio-1.67.0-cp38-cp38-win32.whl", hash = "sha256:9d75641a2fca9ae1ae86454fd25d4c298ea8cc195dbc962852234d54a07060ad"}, + {file = "grpcio-1.67.0-cp38-cp38-win_amd64.whl", hash = "sha256:cff8e54d6a463883cda2fab94d2062aad2f5edd7f06ae3ed030f2a74756db365"}, + {file = "grpcio-1.67.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:62492bd534979e6d7127b8a6b29093161a742dee3875873e01964049d5250a74"}, + {file = "grpcio-1.67.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eef1dce9d1a46119fd09f9a992cf6ab9d9178b696382439446ca5f399d7b96fe"}, + {file = "grpcio-1.67.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:f623c57a5321461c84498a99dddf9d13dac0e40ee056d884d6ec4ebcab647a78"}, + {file = "grpcio-1.67.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54d16383044e681f8beb50f905249e4e7261dd169d4aaf6e52eab67b01cbbbe2"}, + {file = "grpcio-1.67.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2a44e572fb762c668e4812156b81835f7aba8a721b027e2d4bb29fb50ff4d33"}, + {file = "grpcio-1.67.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:391df8b0faac84d42f5b8dfc65f5152c48ed914e13c522fd05f2aca211f8bfad"}, + {file = "grpcio-1.67.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfd9306511fdfc623a1ba1dc3bc07fbd24e6cfbe3c28b4d1e05177baa2f99617"}, + {file = "grpcio-1.67.0-cp39-cp39-win32.whl", hash = "sha256:30d47dbacfd20cbd0c8be9bfa52fdb833b395d4ec32fe5cff7220afc05d08571"}, + {file = "grpcio-1.67.0-cp39-cp39-win_amd64.whl", hash = "sha256:f55f077685f61f0fbd06ea355142b71e47e4a26d2d678b3ba27248abfe67163a"}, + {file = "grpcio-1.67.0.tar.gz", hash = "sha256:e090b2553e0da1c875449c8e75073dd4415dd71c9bde6a406240fdf4c0ee467c"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.67.0)"] [[package]] name = "guardrails-api" -version = "0.0.1" +version = "0.1.0a1" description = "Guardrails API" optional = false python-versions = "<4,>=3.8" files = [ - {file = "guardrails_api-0.0.1-py3-none-any.whl", hash = "sha256:c0c16a3eb28dd9dea2f24d3cc32fee8fe9cc29c9cde5f84bb660212c0516b467"}, - {file = "guardrails_api-0.0.1.tar.gz", hash = "sha256:b1e353005bf3b74adc1dc1aad8d0fc23d110529adf5e99b713ac02852da0ae8a"}, + {file = "guardrails_api-0.1.0a1-py3-none-any.whl", hash = "sha256:4685447b2ffbddce77de14d165e28a12437154fabc203678bc33edb2670d647c"}, + {file = "guardrails_api-0.1.0a1.tar.gz", hash = "sha256:0ea1e0b8ac7c240bb58f4649dd547a7772c94a245ff9701f9b688872d0bc3563"}, ] [package.dependencies] +aiocache = ">=0.11.1" boto3 = ">=1.34.115,<2" -flask = ">=3.0.3,<4" -Flask-Caching = ">=2.3.0,<3" -Flask-Cors = ">=4.0.1,<5" -Flask-SQLAlchemy = ">=3.1.1,<4" -guardrails-ai = ">=0.5.0a11" +fastapi = ">=0.114.1" +guardrails-ai = ">=0.5.12" jsonschema = ">=4.22.0,<5" litellm = ">=1.39.3,<2" opentelemetry-api = ">=1.0.0,<2" opentelemetry-exporter-otlp-proto-grpc = ">=1.0.0,<2" opentelemetry-exporter-otlp-proto-http = ">=1.0.0,<2" -opentelemetry-instrumentation-flask = ">=0.12b0,<1" +opentelemetry-instrumentation-fastapi = ">=0.48b0" opentelemetry-sdk = ">=1.0.0,<2" psycopg2-binary = ">=2.9.9,<3" referencing = ">=0.35.1,<1" +requests = ">=2.32.3" +SQLAlchemy = ">=2.0.34" typer = ">=0.9.4,<1" -Werkzeug = ">=3.0.3,<4" +uvicorn = ">=0.30.6" [package.extras] dev = ["coverage", "gunicorn (>=22.0.0,<23)", "pytest", "pytest-mock", "ruff"] [[package]] name = "guardrails-api-client" -version = "0.3.8" +version = "0.3.9" description = "Guardrails API Client." optional = false python-versions = "<4,>=3.8" files = [ - {file = "guardrails_api_client-0.3.8-py3-none-any.whl", hash = "sha256:2becd5ac9c720879a997e50e2a813d9e77a6fb1a7068a96b1b9712dd6dd9efb8"}, - {file = "guardrails_api_client-0.3.8.tar.gz", hash = "sha256:2e1e45cddf727534a378bc99f7f98da0800960918c75bda010b8bc493b946d16"}, + {file = "guardrails_api_client-0.3.9-py3-none-any.whl", hash = "sha256:f24110690669007ca276ddfea928770c9e1ba360e4a70b06cb6e63aceffd0d4f"}, + {file = "guardrails_api_client-0.3.9.tar.gz", hash = "sha256:dac110182381cd779579c217028534db20168dd659f2484c5c2d21aa9560d2fc"}, ] [package.extras] dev = ["pyright", "pytest", "pytest-cov", "ruff"] +[[package]] +name = "guardrails-api-client" +version = "0.3.13" +description = "Guardrails API Client." +optional = false +python-versions = "<4,>=3.8" +files = [ + {file = "guardrails_api_client-0.3.13-py3-none-any.whl", hash = "sha256:c9c5297355d022428a573e6e845d4876cdfbda81635d9c65fb107db1f3bb0ac2"}, + {file = "guardrails_api_client-0.3.13.tar.gz", hash = "sha256:4f0f1a7e7ef100138fb99634d75e3330e9abba9d4e8363f27af8bc7e722e2d88"}, +] + +[package.dependencies] +pydantic = ">=2" +python-dateutil = ">=2.5.3" +setuptools = ">=21.0.0" +typing-extensions = ">=4.7.1" +urllib3 = ">=1.25.3,<2.1.0" + +[package.extras] +dev = ["pyright", "pytest", "pytest-cov", "ruff"] + [[package]] name = "guardrails-hub-types" version = "0.0.4" @@ -2183,13 +2266,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.6" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, ] [package.dependencies] @@ -2200,17 +2283,17 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" -version = "0.27.0" +version = "0.27.2" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, + {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, + {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, ] [package.dependencies] @@ -2225,16 +2308,17 @@ brotli = ["brotli", "brotlicffi"] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "huggingface-hub" -version = "0.19.4" +version = "0.26.0" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.19.4-py3-none-any.whl", hash = "sha256:dba013f779da16f14b606492828f3760600a1e1801432d09fe1c33e50b825bb5"}, - {file = "huggingface_hub-0.19.4.tar.gz", hash = "sha256:176a4fc355a851c17550e7619488f383189727eab209534d7cef2114dae77b22"}, + {file = "huggingface_hub-0.26.0-py3-none-any.whl", hash = "sha256:e43b8f36042b2103b48dea822535e08f5f089c4aa7013a067fca7b4ebf7f85a3"}, + {file = "huggingface_hub-0.26.0.tar.gz", hash = "sha256:524fe9281b015b76aa73ff1a83bf1cbe8cab851c9ac5ae5fcd2a25d5173ce629"}, ] [package.dependencies] @@ -2247,16 +2331,17 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] -docs = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "hf-doc-builder", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)", "watchdog"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] -inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"] -quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp"] +quality = ["libcst (==1.4.0)", "mypy (==1.5.1)", "ruff (>=0.5.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] -torch = ["torch"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors[torch]", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] [[package]] @@ -2275,13 +2360,13 @@ pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_ve [[package]] name = "identify" -version = "2.5.36" +version = "2.6.1" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, - {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, + {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, + {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, ] [package.extras] @@ -2289,117 +2374,17 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] -[[package]] -name = "ijson" -version = "3.3.0" -description = "Iterative JSON parser with standard Python iterator interfaces" -optional = false -python-versions = "*" -files = [ - {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7f7a5250599c366369fbf3bc4e176f5daa28eb6bc7d6130d02462ed335361675"}, - {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f87a7e52f79059f9c58f6886c262061065eb6f7554a587be7ed3aa63e6b71b34"}, - {file = "ijson-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b73b493af9e947caed75d329676b1b801d673b17481962823a3e55fe529c8b8b"}, - {file = "ijson-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5576415f3d76290b160aa093ff968f8bf6de7d681e16e463a0134106b506f49"}, - {file = "ijson-3.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e9ffe358d5fdd6b878a8a364e96e15ca7ca57b92a48f588378cef315a8b019e"}, - {file = "ijson-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8643c255a25824ddd0895c59f2319c019e13e949dc37162f876c41a283361527"}, - {file = "ijson-3.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:df3ab5e078cab19f7eaeef1d5f063103e1ebf8c26d059767b26a6a0ad8b250a3"}, - {file = "ijson-3.3.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3dc1fb02c6ed0bae1b4bf96971258bf88aea72051b6e4cebae97cff7090c0607"}, - {file = "ijson-3.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e9afd97339fc5a20f0542c971f90f3ca97e73d3050cdc488d540b63fae45329a"}, - {file = "ijson-3.3.0-cp310-cp310-win32.whl", hash = "sha256:844c0d1c04c40fd1b60f148dc829d3f69b2de789d0ba239c35136efe9a386529"}, - {file = "ijson-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d654d045adafdcc6c100e8e911508a2eedbd2a1b5f93f930ba13ea67d7704ee9"}, - {file = "ijson-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:501dce8eaa537e728aa35810656aa00460a2547dcb60937c8139f36ec344d7fc"}, - {file = "ijson-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:658ba9cad0374d37b38c9893f4864f284cdcc7d32041f9808fba8c7bcaadf134"}, - {file = "ijson-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2636cb8c0f1023ef16173f4b9a233bcdb1df11c400c603d5f299fac143ca8d70"}, - {file = "ijson-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd174b90db68c3bcca273e9391934a25d76929d727dc75224bf244446b28b03b"}, - {file = "ijson-3.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97a9aea46e2a8371c4cf5386d881de833ed782901ac9f67ebcb63bb3b7d115af"}, - {file = "ijson-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c594c0abe69d9d6099f4ece17763d53072f65ba60b372d8ba6de8695ce6ee39e"}, - {file = "ijson-3.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8e0ff16c224d9bfe4e9e6bd0395826096cda4a3ef51e6c301e1b61007ee2bd24"}, - {file = "ijson-3.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0015354011303175eae7e2ef5136414e91de2298e5a2e9580ed100b728c07e51"}, - {file = "ijson-3.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034642558afa57351a0ffe6de89e63907c4cf6849070cc10a3b2542dccda1afe"}, - {file = "ijson-3.3.0-cp311-cp311-win32.whl", hash = "sha256:192e4b65495978b0bce0c78e859d14772e841724d3269fc1667dc6d2f53cc0ea"}, - {file = "ijson-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:72e3488453754bdb45c878e31ce557ea87e1eb0f8b4fc610373da35e8074ce42"}, - {file = "ijson-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:988e959f2f3d59ebd9c2962ae71b97c0df58323910d0b368cc190ad07429d1bb"}, - {file = "ijson-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b2f73f0d0fce5300f23a1383d19b44d103bb113b57a69c36fd95b7c03099b181"}, - {file = "ijson-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0ee57a28c6bf523d7cb0513096e4eb4dac16cd935695049de7608ec110c2b751"}, - {file = "ijson-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0155a8f079c688c2ccaea05de1ad69877995c547ba3d3612c1c336edc12a3a5"}, - {file = "ijson-3.3.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ab00721304af1ae1afa4313ecfa1bf16b07f55ef91e4a5b93aeaa3e2bd7917c"}, - {file = "ijson-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40ee3821ee90be0f0e95dcf9862d786a7439bd1113e370736bfdf197e9765bfb"}, - {file = "ijson-3.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3b6987a0bc3e6d0f721b42c7a0198ef897ae50579547b0345f7f02486898f5"}, - {file = "ijson-3.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:63afea5f2d50d931feb20dcc50954e23cef4127606cc0ecf7a27128ed9f9a9e6"}, - {file = "ijson-3.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b5c3e285e0735fd8c5a26d177eca8b52512cdd8687ca86ec77a0c66e9c510182"}, - {file = "ijson-3.3.0-cp312-cp312-win32.whl", hash = "sha256:907f3a8674e489abdcb0206723e5560a5cb1fa42470dcc637942d7b10f28b695"}, - {file = "ijson-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8f890d04ad33262d0c77ead53c85f13abfb82f2c8f078dfbf24b78f59534dfdd"}, - {file = "ijson-3.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b9d85a02e77ee8ea6d9e3fd5d515bcc3d798d9c1ea54817e5feb97a9bc5d52fe"}, - {file = "ijson-3.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6576cdc36d5a09b0c1a3d81e13a45d41a6763188f9eaae2da2839e8a4240bce"}, - {file = "ijson-3.3.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5589225c2da4bb732c9c370c5961c39a6db72cf69fb2a28868a5413ed7f39e6"}, - {file = "ijson-3.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad04cf38164d983e85f9cba2804566c0160b47086dcca4cf059f7e26c5ace8ca"}, - {file = "ijson-3.3.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:a3b730ef664b2ef0e99dec01b6573b9b085c766400af363833e08ebc1e38eb2f"}, - {file = "ijson-3.3.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:4690e3af7b134298055993fcbea161598d23b6d3ede11b12dca6815d82d101d5"}, - {file = "ijson-3.3.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:aaa6bfc2180c31a45fac35d40e3312a3d09954638ce0b2e9424a88e24d262a13"}, - {file = "ijson-3.3.0-cp36-cp36m-win32.whl", hash = "sha256:44367090a5a876809eb24943f31e470ba372aaa0d7396b92b953dda953a95d14"}, - {file = "ijson-3.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7e2b3e9ca957153557d06c50a26abaf0d0d6c0ddf462271854c968277a6b5372"}, - {file = "ijson-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47c144117e5c0e2babb559bc8f3f76153863b8dd90b2d550c51dab5f4b84a87f"}, - {file = "ijson-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ce02af5fbf9ba6abb70765e66930aedf73311c7d840478f1ccecac53fefbf3"}, - {file = "ijson-3.3.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ac6c3eeed25e3e2cb9b379b48196413e40ac4e2239d910bb33e4e7f6c137745"}, - {file = "ijson-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d92e339c69b585e7b1d857308ad3ca1636b899e4557897ccd91bb9e4a56c965b"}, - {file = "ijson-3.3.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:8c85447569041939111b8c7dbf6f8fa7a0eb5b2c4aebb3c3bec0fb50d7025121"}, - {file = "ijson-3.3.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:542c1e8fddf082159a5d759ee1412c73e944a9a2412077ed00b303ff796907dc"}, - {file = "ijson-3.3.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:30cfea40936afb33b57d24ceaf60d0a2e3d5c1f2335ba2623f21d560737cc730"}, - {file = "ijson-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:6b661a959226ad0d255e49b77dba1d13782f028589a42dc3172398dd3814c797"}, - {file = "ijson-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:0b003501ee0301dbf07d1597482009295e16d647bb177ce52076c2d5e64113e0"}, - {file = "ijson-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3e8d8de44effe2dbd0d8f3eb9840344b2d5b4cc284a14eb8678aec31d1b6bea8"}, - {file = "ijson-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9cd5c03c63ae06d4f876b9844c5898d0044c7940ff7460db9f4cd984ac7862b5"}, - {file = "ijson-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04366e7e4a4078d410845e58a2987fd9c45e63df70773d7b6e87ceef771b51ee"}, - {file = "ijson-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de7c1ddb80fa7a3ab045266dca169004b93f284756ad198306533b792774f10a"}, - {file = "ijson-3.3.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8851584fb931cffc0caa395f6980525fd5116eab8f73ece9d95e6f9c2c326c4c"}, - {file = "ijson-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdcfc88347fd981e53c33d832ce4d3e981a0d696b712fbcb45dcc1a43fe65c65"}, - {file = "ijson-3.3.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3917b2b3d0dbbe3296505da52b3cb0befbaf76119b2edaff30bd448af20b5400"}, - {file = "ijson-3.3.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:e10c14535abc7ddf3fd024aa36563cd8ab5d2bb6234a5d22c77c30e30fa4fb2b"}, - {file = "ijson-3.3.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3aba5c4f97f4e2ce854b5591a8b0711ca3b0c64d1b253b04ea7b004b0a197ef6"}, - {file = "ijson-3.3.0-cp38-cp38-win32.whl", hash = "sha256:b325f42e26659df1a0de66fdb5cde8dd48613da9c99c07d04e9fb9e254b7ee1c"}, - {file = "ijson-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:ff835906f84451e143f31c4ce8ad73d83ef4476b944c2a2da91aec8b649570e1"}, - {file = "ijson-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3c556f5553368dff690c11d0a1fb435d4ff1f84382d904ccc2dc53beb27ba62e"}, - {file = "ijson-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e4396b55a364a03ff7e71a34828c3ed0c506814dd1f50e16ebed3fc447d5188e"}, - {file = "ijson-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6850ae33529d1e43791b30575070670070d5fe007c37f5d06aebc1dd152ab3f"}, - {file = "ijson-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36aa56d68ea8def26778eb21576ae13f27b4a47263a7a2581ab2ef58b8de4451"}, - {file = "ijson-3.3.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7ec759c4a0fc820ad5dc6a58e9c391e7b16edcb618056baedbedbb9ea3b1524"}, - {file = "ijson-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b51bab2c4e545dde93cb6d6bb34bf63300b7cd06716f195dd92d9255df728331"}, - {file = "ijson-3.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:92355f95a0e4da96d4c404aa3cff2ff033f9180a9515f813255e1526551298c1"}, - {file = "ijson-3.3.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8795e88adff5aa3c248c1edce932db003d37a623b5787669ccf205c422b91e4a"}, - {file = "ijson-3.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8f83f553f4cde6d3d4eaf58ec11c939c94a0ec545c5b287461cafb184f4b3a14"}, - {file = "ijson-3.3.0-cp39-cp39-win32.whl", hash = "sha256:ead50635fb56577c07eff3e557dac39533e0fe603000684eea2af3ed1ad8f941"}, - {file = "ijson-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:c8a9befb0c0369f0cf5c1b94178d0d78f66d9cebb9265b36be6e4f66236076b8"}, - {file = "ijson-3.3.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2af323a8aec8a50fa9effa6d640691a30a9f8c4925bd5364a1ca97f1ac6b9b5c"}, - {file = "ijson-3.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f64f01795119880023ba3ce43072283a393f0b90f52b66cc0ea1a89aa64a9ccb"}, - {file = "ijson-3.3.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a716e05547a39b788deaf22725490855337fc36613288aa8ae1601dc8c525553"}, - {file = "ijson-3.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473f5d921fadc135d1ad698e2697025045cd8ed7e5e842258295012d8a3bc702"}, - {file = "ijson-3.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd26b396bc3a1e85f4acebeadbf627fa6117b97f4c10b177d5779577c6607744"}, - {file = "ijson-3.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:25fd49031cdf5fd5f1fd21cb45259a64dad30b67e64f745cc8926af1c8c243d3"}, - {file = "ijson-3.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b72178b1e565d06ab19319965022b36ef41bcea7ea153b32ec31194bec032a2"}, - {file = "ijson-3.3.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d0b6b637d05dbdb29d0bfac2ed8425bb369e7af5271b0cc7cf8b801cb7360c2"}, - {file = "ijson-3.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5378d0baa59ae422905c5f182ea0fd74fe7e52a23e3821067a7d58c8306b2191"}, - {file = "ijson-3.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:99f5c8ab048ee4233cc4f2b461b205cbe01194f6201018174ac269bf09995749"}, - {file = "ijson-3.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:45ff05de889f3dc3d37a59d02096948ce470699f2368b32113954818b21aa74a"}, - {file = "ijson-3.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efb521090dd6cefa7aafd120581947b29af1713c902ff54336b7c7130f04c47"}, - {file = "ijson-3.3.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87c727691858fd3a1c085d9980d12395517fcbbf02c69fbb22dede8ee03422da"}, - {file = "ijson-3.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0420c24e50389bc251b43c8ed379ab3e3ba065ac8262d98beb6735ab14844460"}, - {file = "ijson-3.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8fdf3721a2aa7d96577970f5604bd81f426969c1822d467f07b3d844fa2fecc7"}, - {file = "ijson-3.3.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:891f95c036df1bc95309951940f8eea8537f102fa65715cdc5aae20b8523813b"}, - {file = "ijson-3.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed1336a2a6e5c427f419da0154e775834abcbc8ddd703004108121c6dd9eba9d"}, - {file = "ijson-3.3.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0c819f83e4f7b7f7463b2dc10d626a8be0c85fbc7b3db0edc098c2b16ac968e"}, - {file = "ijson-3.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33afc25057377a6a43c892de34d229a86f89ea6c4ca3dd3db0dcd17becae0dbb"}, - {file = "ijson-3.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7914d0cf083471856e9bc2001102a20f08e82311dfc8cf1a91aa422f9414a0d6"}, - {file = "ijson-3.3.0.tar.gz", hash = "sha256:7f172e6ba1bee0d4c8f8ebd639577bfe429dee0f3f96775a067b8bae4492d8a0"}, -] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] [[package]] name = "imagesize" @@ -2414,32 +2399,32 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.11.0" +version = "8.4.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.11.0-py3-none-any.whl", hash = "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b"}, - {file = "importlib_metadata-6.11.0.tar.gz", hash = "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443"}, + {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, + {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "importlib-resources" -version = "6.4.4" +version = "6.4.5" description = "Read resources from Python packages" optional = true python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.4.4-py3-none-any.whl", hash = "sha256:dda242603d1c9cd836c3368b1174ed74cb4049ecd209e7a1a0104620c18c5c11"}, - {file = "importlib_resources-6.4.4.tar.gz", hash = "sha256:20600c8b7361938dc0bb2d5ec0297802e575df486f5a544fa414da65e13721f7"}, + {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, + {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, ] [package.dependencies] @@ -2464,29 +2449,15 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "intel-openmp" -version = "2021.4.0" -description = "Intel OpenMP* Runtime Library" -optional = true -python-versions = "*" -files = [ - {file = "intel_openmp-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:41c01e266a7fdb631a7609191709322da2bbf24b252ba763f125dd651bcc7675"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:3b921236a38384e2016f0f3d65af6732cf2c12918087128a9163225451e776f2"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:e2240ab8d01472fed04f3544a878cda5da16c26232b7ea1b59132dbfb48b186e"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:6e863d8fd3d7e8ef389d52cf97a50fe2afe1a19247e8c0d168ce021546f96fc9"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f"}, -] - [[package]] name = "ipykernel" -version = "6.29.4" +version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, - {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, ] [package.dependencies] @@ -2513,60 +2484,58 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio [[package]] name = "ipython" -version = "8.12.3" +version = "8.18.1" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c"}, - {file = "ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363"}, + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] [[package]] name = "ipywidgets" -version = "8.1.3" +version = "8.1.5" description = "Jupyter interactive widgets" optional = true python-versions = ">=3.7" files = [ - {file = "ipywidgets-8.1.3-py3-none-any.whl", hash = "sha256:efafd18f7a142248f7cb0ba890a68b96abd4d6e88ddbda483c9130d12667eaf2"}, - {file = "ipywidgets-8.1.3.tar.gz", hash = "sha256:f5f9eeaae082b1823ce9eac2575272952f40d748893972956dc09700a6392d9c"}, + {file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"}, + {file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"}, ] [package.dependencies] comm = ">=0.1.3" ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.11,<3.1.0" +jupyterlab-widgets = ">=3.0.12,<3.1.0" traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.11,<4.1.0" +widgetsnbextension = ">=4.0.12,<4.1.0" [package.extras] test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] @@ -2589,7 +2558,7 @@ arrow = ">=0.15.0" name = "itsdangerous" version = "2.2.0" description = "Safely pass data to untrusted environments and back." -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, @@ -2616,39 +2585,43 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-ena [[package]] name = "jaraco-context" -version = "5.3.0" +version = "6.0.1" description = "Useful decorators and context managers" optional = false python-versions = ">=3.8" files = [ - {file = "jaraco.context-5.3.0-py3-none-any.whl", hash = "sha256:3e16388f7da43d384a1a7cd3452e72e14732ac9fe459678773a3608a812bf266"}, - {file = "jaraco.context-5.3.0.tar.gz", hash = "sha256:c2f67165ce1f9be20f32f650f25d8edfc1646a8aeee48ae06fb35f90763576d2"}, + {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, + {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, ] [package.dependencies] "backports.tarfile" = {version = "*", markers = "python_version < \"3.12\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["portend", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "jaraco-functools" -version = "4.0.1" +version = "4.1.0" description = "Functools like those found in stdlib" optional = false python-versions = ">=3.8" files = [ - {file = "jaraco.functools-4.0.1-py3-none-any.whl", hash = "sha256:3b24ccb921d6b593bdceb56ce14799204f473976e2a9d4b15b04d0f2c2326664"}, - {file = "jaraco_functools-4.0.1.tar.gz", hash = "sha256:d33fa765374c0611b52f8b3a795f8900869aa88c84769d4d1746cd68fb28c3e8"}, + {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"}, + {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"}, ] [package.dependencies] more-itertools = "*" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.classes", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["jaraco.classes", "pytest (>=6,!=8.1.*)"] +type = ["pytest-mypy"] [[package]] name = "jedi" @@ -2701,6 +2674,88 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jiter" +version = "0.6.1" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jiter-0.6.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d08510593cb57296851080018006dfc394070178d238b767b1879dc1013b106c"}, + {file = "jiter-0.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adef59d5e2394ebbad13b7ed5e0306cceb1df92e2de688824232a91588e77aa7"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e02f7a27f2bcc15b7d455c9df05df8ffffcc596a2a541eeda9a3110326e7a3"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed69a7971d67b08f152c17c638f0e8c2aa207e9dd3a5fcd3cba294d39b5a8d2d"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2019d966e98f7c6df24b3b8363998575f47d26471bfb14aade37630fae836a1"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36c0b51a285b68311e207a76c385650322734c8717d16c2eb8af75c9d69506e7"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:220e0963b4fb507c525c8f58cde3da6b1be0bfddb7ffd6798fb8f2531226cdb1"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa25c7a9bf7875a141182b9c95aed487add635da01942ef7ca726e42a0c09058"}, + {file = "jiter-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e90552109ca8ccd07f47ca99c8a1509ced93920d271bb81780a973279974c5ab"}, + {file = "jiter-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:67723a011964971864e0b484b0ecfee6a14de1533cff7ffd71189e92103b38a8"}, + {file = "jiter-0.6.1-cp310-none-win32.whl", hash = "sha256:33af2b7d2bf310fdfec2da0177eab2fedab8679d1538d5b86a633ebfbbac4edd"}, + {file = "jiter-0.6.1-cp310-none-win_amd64.whl", hash = "sha256:7cea41c4c673353799906d940eee8f2d8fd1d9561d734aa921ae0f75cb9732f4"}, + {file = "jiter-0.6.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b03c24e7da7e75b170c7b2b172d9c5e463aa4b5c95696a368d52c295b3f6847f"}, + {file = "jiter-0.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:47fee1be677b25d0ef79d687e238dc6ac91a8e553e1a68d0839f38c69e0ee491"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0d2f6e01a8a0fb0eab6d0e469058dab2be46ff3139ed2d1543475b5a1d8e7"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b809e39e342c346df454b29bfcc7bca3d957f5d7b60e33dae42b0e5ec13e027"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e9ac7c2f092f231f5620bef23ce2e530bd218fc046098747cc390b21b8738a7a"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e51a2d80d5fe0ffb10ed2c82b6004458be4a3f2b9c7d09ed85baa2fbf033f54b"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3343d4706a2b7140e8bd49b6c8b0a82abf9194b3f0f5925a78fc69359f8fc33c"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82521000d18c71e41c96960cb36e915a357bc83d63a8bed63154b89d95d05ad1"}, + {file = "jiter-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c843e7c1633470708a3987e8ce617ee2979ee18542d6eb25ae92861af3f1d62"}, + {file = "jiter-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a2e861658c3fe849efc39b06ebb98d042e4a4c51a8d7d1c3ddc3b1ea091d0784"}, + {file = "jiter-0.6.1-cp311-none-win32.whl", hash = "sha256:7d72fc86474862c9c6d1f87b921b70c362f2b7e8b2e3c798bb7d58e419a6bc0f"}, + {file = "jiter-0.6.1-cp311-none-win_amd64.whl", hash = "sha256:3e36a320634f33a07794bb15b8da995dccb94f944d298c8cfe2bd99b1b8a574a"}, + {file = "jiter-0.6.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1fad93654d5a7dcce0809aff66e883c98e2618b86656aeb2129db2cd6f26f867"}, + {file = "jiter-0.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4e6e340e8cd92edab7f6a3a904dbbc8137e7f4b347c49a27da9814015cc0420c"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:691352e5653af84ed71763c3c427cff05e4d658c508172e01e9c956dfe004aba"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:defee3949313c1f5b55e18be45089970cdb936eb2a0063f5020c4185db1b63c9"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26d2bdd5da097e624081c6b5d416d3ee73e5b13f1703bcdadbb1881f0caa1933"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18aa9d1626b61c0734b973ed7088f8a3d690d0b7f5384a5270cd04f4d9f26c86"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a3567c8228afa5ddcce950631c6b17397ed178003dc9ee7e567c4c4dcae9fa0"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e5c0507131c922defe3f04c527d6838932fcdfd69facebafd7d3574fa3395314"}, + {file = "jiter-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:540fcb224d7dc1bcf82f90f2ffb652df96f2851c031adca3c8741cb91877143b"}, + {file = "jiter-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e7b75436d4fa2032b2530ad989e4cb0ca74c655975e3ff49f91a1a3d7f4e1df2"}, + {file = "jiter-0.6.1-cp312-none-win32.whl", hash = "sha256:883d2ced7c21bf06874fdeecab15014c1c6d82216765ca6deef08e335fa719e0"}, + {file = "jiter-0.6.1-cp312-none-win_amd64.whl", hash = "sha256:91e63273563401aadc6c52cca64a7921c50b29372441adc104127b910e98a5b6"}, + {file = "jiter-0.6.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:852508a54fe3228432e56019da8b69208ea622a3069458252f725d634e955b31"}, + {file = "jiter-0.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f491cc69ff44e5a1e8bc6bf2b94c1f98d179e1aaf4a554493c171a5b2316b701"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc56c8f0b2a28ad4d8047f3ae62d25d0e9ae01b99940ec0283263a04724de1f3"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51b58f7a0d9e084a43b28b23da2b09fc5e8df6aa2b6a27de43f991293cab85fd"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f79ce15099154c90ef900d69c6b4c686b64dfe23b0114e0971f2fecd306ec6c"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:03a025b52009f47e53ea619175d17e4ded7c035c6fbd44935cb3ada11e1fd592"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c74a8d93718137c021d9295248a87c2f9fdc0dcafead12d2930bc459ad40f885"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40b03b75f903975f68199fc4ec73d546150919cb7e534f3b51e727c4d6ccca5a"}, + {file = "jiter-0.6.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:825651a3f04cf92a661d22cad61fc913400e33aa89b3e3ad9a6aa9dc8a1f5a71"}, + {file = "jiter-0.6.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:928bf25eb69ddb292ab8177fe69d3fbf76c7feab5fce1c09265a7dccf25d3991"}, + {file = "jiter-0.6.1-cp313-none-win32.whl", hash = "sha256:352cd24121e80d3d053fab1cc9806258cad27c53cad99b7a3cac57cf934b12e4"}, + {file = "jiter-0.6.1-cp313-none-win_amd64.whl", hash = "sha256:be7503dd6f4bf02c2a9bacb5cc9335bc59132e7eee9d3e931b13d76fd80d7fda"}, + {file = "jiter-0.6.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:31d8e00e1fb4c277df8ab6f31a671f509ebc791a80e5c61fdc6bc8696aaa297c"}, + {file = "jiter-0.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77c296d65003cd7ee5d7b0965f6acbe6cffaf9d1fa420ea751f60ef24e85fed5"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeeb0c0325ef96c12a48ea7e23e2e86fe4838e6e0a995f464cf4c79fa791ceeb"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a31c6fcbe7d6c25d6f1cc6bb1cba576251d32795d09c09961174fe461a1fb5bd"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59e2b37f3b9401fc9e619f4d4badcab2e8643a721838bcf695c2318a0475ae42"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bae5ae4853cb9644144e9d0755854ce5108d470d31541d83f70ca7ecdc2d1637"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9df588e9c830b72d8db1dd7d0175af6706b0904f682ea9b1ca8b46028e54d6e9"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15f8395e835cf561c85c1adee72d899abf2733d9df72e9798e6d667c9b5c1f30"}, + {file = "jiter-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a99d4e0b5fc3b05ea732d67eb2092fe894e95a90e6e413f2ea91387e228a307"}, + {file = "jiter-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a311df1fa6be0ccd64c12abcd85458383d96e542531bafbfc0a16ff6feda588f"}, + {file = "jiter-0.6.1-cp38-none-win32.whl", hash = "sha256:81116a6c272a11347b199f0e16b6bd63f4c9d9b52bc108991397dd80d3c78aba"}, + {file = "jiter-0.6.1-cp38-none-win_amd64.whl", hash = "sha256:13f9084e3e871a7c0b6e710db54444088b1dd9fbefa54d449b630d5e73bb95d0"}, + {file = "jiter-0.6.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:f1c53615fcfec3b11527c08d19cff6bc870da567ce4e57676c059a3102d3a082"}, + {file = "jiter-0.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f791b6a4da23238c17a81f44f5b55d08a420c5692c1fda84e301a4b036744eb1"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c97e90fec2da1d5f68ef121444c2c4fa72eabf3240829ad95cf6bbeca42a301"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cbc1a66b4e41511209e97a2866898733c0110b7245791ac604117b7fb3fedb7"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e85f9e12cd8418ab10e1fcf0e335ae5bb3da26c4d13a0fd9e6a17a674783b6"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08be33db6dcc374c9cc19d3633af5e47961a7b10d4c61710bd39e48d52a35824"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:677be9550004f5e010d673d3b2a2b815a8ea07a71484a57d3f85dde7f14cf132"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e8bd065be46c2eecc328e419d6557bbc37844c88bb07b7a8d2d6c91c7c4dedc9"}, + {file = "jiter-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bd95375ce3609ec079a97c5d165afdd25693302c071ca60c7ae1cf826eb32022"}, + {file = "jiter-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db459ed22d0208940d87f614e1f0ea5a946d29a3cfef71f7e1aab59b6c6b2afb"}, + {file = "jiter-0.6.1-cp39-none-win32.whl", hash = "sha256:d71c962f0971347bd552940ab96aa42ceefcd51b88c4ced8a27398182efa8d80"}, + {file = "jiter-0.6.1-cp39-none-win_amd64.whl", hash = "sha256:d465db62d2d10b489b7e7a33027c4ae3a64374425d757e963f86df5b5f2e7fc5"}, + {file = "jiter-0.6.1.tar.gz", hash = "sha256:e19cd21221fc139fb032e4112986656cb2739e9fe6d84c13956ab30ccc7d4449"}, +] + [[package]] name = "jmespath" version = "1.0.1" @@ -2764,13 +2819,13 @@ jsonpointer = ">=1.9" [[package]] name = "jsonpointer" -version = "2.4" +version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +python-versions = ">=3.7" files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, ] [[package]] @@ -2786,13 +2841,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.22.0" +version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, - {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, ] [package.dependencies] @@ -2808,21 +2863,24 @@ rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \" rfc3987 = {version = "*", optional = true, markers = "extra == \"format\""} rpds-py = ">=0.7.1" uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = [ + {version = ">=1.11", optional = true, markers = "extra == \"format\""}, + {version = ">=24.6.0", optional = true, markers = "extra == \"format-nongpl\""}, +] [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] [[package]] name = "jsonschema-specifications" -version = "2023.12.1" +version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, ] [package.dependencies] @@ -2830,23 +2888,22 @@ referencing = ">=0.31.0" [[package]] name = "jupyter" -version = "1.0.0" +version = "1.1.1" description = "Jupyter metapackage. Install all the Jupyter components in one go." optional = true python-versions = "*" files = [ - {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, - {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, - {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, + {file = "jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83"}, + {file = "jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a"}, ] [package.dependencies] ipykernel = "*" ipywidgets = "*" jupyter-console = "*" +jupyterlab = "*" nbconvert = "*" notebook = "*" -qtconsole = "*" [[package]] name = "jupyter-client" @@ -2958,13 +3015,13 @@ jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.14.1" +version = "2.14.2" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = true python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.14.1-py3-none-any.whl", hash = "sha256:16f7177c3a4ea8fe37784e2d31271981a812f0b2874af17339031dc3510cc2a5"}, - {file = "jupyter_server-2.14.1.tar.gz", hash = "sha256:12558d158ec7a0653bf96cc272bc7ad79e0127d503b982ed144399346694f726"}, + {file = "jupyter_server-2.14.2-py3-none-any.whl", hash = "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd"}, + {file = "jupyter_server-2.14.2.tar.gz", hash = "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b"}, ] [package.dependencies] @@ -3059,13 +3116,13 @@ files = [ [[package]] name = "jupyterlab-server" -version = "2.27.2" +version = "2.27.3" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = true python-versions = ">=3.8" files = [ - {file = "jupyterlab_server-2.27.2-py3-none-any.whl", hash = "sha256:54aa2d64fd86383b5438d9f0c032f043c4d8c0264b8af9f60bd061157466ea43"}, - {file = "jupyterlab_server-2.27.2.tar.gz", hash = "sha256:15cbb349dc45e954e09bacf81b9f9bcb10815ff660fb2034ecd7417db3a7ea27"}, + {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, + {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, ] [package.dependencies] @@ -3085,24 +3142,24 @@ test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-v [[package]] name = "jupyterlab-widgets" -version = "3.0.11" +version = "3.0.13" description = "Jupyter interactive widgets for JupyterLab" optional = true python-versions = ">=3.7" files = [ - {file = "jupyterlab_widgets-3.0.11-py3-none-any.whl", hash = "sha256:78287fd86d20744ace330a61625024cf5521e1c012a352ddc0a3cdc2348becd0"}, - {file = "jupyterlab_widgets-3.0.11.tar.gz", hash = "sha256:dd5ac679593c969af29c9bed054c24f26842baa51352114736756bc035deee27"}, + {file = "jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54"}, + {file = "jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed"}, ] [[package]] name = "jupytext" -version = "1.16.2" +version = "1.16.4" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" optional = false python-versions = ">=3.8" files = [ - {file = "jupytext-1.16.2-py3-none-any.whl", hash = "sha256:197a43fef31dca612b68b311e01b8abd54441c7e637810b16b6cb8f2ab66065e"}, - {file = "jupytext-1.16.2.tar.gz", hash = "sha256:8627dd9becbbebd79cc4a4ed4727d89d78e606b4b464eab72357b3b029023a14"}, + {file = "jupytext-1.16.4-py3-none-any.whl", hash = "sha256:76989d2690e65667ea6fb411d8056abe7cd0437c07bd774660b83d62acf9490a"}, + {file = "jupytext-1.16.4.tar.gz", hash = "sha256:28e33f46f2ce7a41fb9d677a4a2c95327285579b64ca104437c4b9eb1e4174e9"}, ] [package.dependencies] @@ -3114,24 +3171,24 @@ pyyaml = "*" tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] -dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (<0.4.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] +dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] docs = ["myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] test = ["pytest", "pytest-randomly", "pytest-xdist"] test-cov = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist"] -test-external = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (<0.4.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] +test-external = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] test-functional = ["pytest", "pytest-randomly", "pytest-xdist"] test-integration = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-randomly", "pytest-xdist"] test-ui = ["calysto-bash"] [[package]] name = "keyring" -version = "25.2.1" +version = "25.4.1" description = "Store and access your passwords safely." optional = false python-versions = ">=3.8" files = [ - {file = "keyring-25.2.1-py3-none-any.whl", hash = "sha256:2458681cdefc0dbc0b7eb6cf75d0b98e59f9ad9b2d4edd319d18f68bdca95e50"}, - {file = "keyring-25.2.1.tar.gz", hash = "sha256:daaffd42dbda25ddafb1ad5fec4024e5bbcfe424597ca1ca452b299861e49f1b"}, + {file = "keyring-25.4.1-py3-none-any.whl", hash = "sha256:5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf"}, + {file = "keyring-25.4.1.tar.gz", hash = "sha256:b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b"}, ] [package.dependencies] @@ -3144,168 +3201,199 @@ pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] completion = ["shtab (>=1.1.0)"] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["pyfakefs", "pytest (>=6,!=8.1.*)"] +type = ["pygobject-stubs", "pytest-mypy", "shtab", "types-pywin32"] [[package]] name = "kiwisolver" -version = "1.4.6" +version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" optional = true python-versions = ">=3.8" files = [ - {file = "kiwisolver-1.4.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9739f60317af3ebb15372a61907a71ba71e9cc3c21239d4e39051ecf51928d98"}, - {file = "kiwisolver-1.4.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7802ac87e8efd05f4ed6b82dfe4749cd4f38140c198a7d392ebbb3ab5fb38bd6"}, - {file = "kiwisolver-1.4.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0632248f5a06a2e4134637628de7300b923d242a30926a1bbf7cc4e487dc0bb8"}, - {file = "kiwisolver-1.4.6-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b747105ddb84ce77a41fbc9485df366519526d1f7f4a096ca02570bf082a70c3"}, - {file = "kiwisolver-1.4.6-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9f338d9724cc2b2ea49e8f3af3a6733f5191cf85801db5b137350dc021e16dad"}, - {file = "kiwisolver-1.4.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdeb0c875a8df911cf026f2ee7043d63d59768e58864835d5c5c27020f251fd2"}, - {file = "kiwisolver-1.4.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:182b3eed63f8f79623bba26f1ac75e6c94463c98b70828029db8fe2d230b7ba0"}, - {file = "kiwisolver-1.4.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0b17c30a50ce5345469f206708adb5946917d59c900e53af7108da2a0c4b56f"}, - {file = "kiwisolver-1.4.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cc09aff78d1eb3b4c63d31eba1db6da5b4d580cf65596562038b6c8ec5806a17"}, - {file = "kiwisolver-1.4.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:300443d53ed971a0dd35249f5012a3c3c95004da2e3f5877ed3cb784228d67bd"}, - {file = "kiwisolver-1.4.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7e3012902606eba35014f725dbd2aab3a28a276cb6872fb21bb27c0ee384a554"}, - {file = "kiwisolver-1.4.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:4cf699500d5d88a5424a4a26dfdcada6aa3a1917431e459c88c38dadd6a300d7"}, - {file = "kiwisolver-1.4.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:212a903a4f90aa6bdbd0709b28df4a337687839dd7cf7030bb288ef756f338e4"}, - {file = "kiwisolver-1.4.6-cp310-cp310-win32.whl", hash = "sha256:7de63234cf06d3a0d218d5c6e907f6ceed72a9d369a8c561d1a161ffafd2fa95"}, - {file = "kiwisolver-1.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:ad4410b6aca71bcfba185d92a3094114914b4ddd9d61d5b7b91047cb273a077b"}, - {file = "kiwisolver-1.4.6-cp310-cp310-win_arm64.whl", hash = "sha256:bc523ab49257fd7bbe00e23aff6924624a5da1ce924e4b3e39530049298779da"}, - {file = "kiwisolver-1.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45a5cb5abad1ad9c265eed7e058fefafeb7964565b93b397ba2f480faec8d674"}, - {file = "kiwisolver-1.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e52b2568c47fb4f54d17576954e02b1de156c85152f87283a99db9670fd18c0"}, - {file = "kiwisolver-1.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:00af95204100bc1d0f26e1ed52ec77d6e3da5c9b845c88d31875c164e4ba6c0c"}, - {file = "kiwisolver-1.4.6-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50ab1fedf86f3951a9e90a64edd15f598860ed60cd3664259756f097d527b5ae"}, - {file = "kiwisolver-1.4.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc985766bf20141ce64baecc39fb9fedbce094b2b8de1bb62676b79328988e4"}, - {file = "kiwisolver-1.4.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1942a155c737a7c3835a957897f0cc9ebc0085b7a75d934d86aecb1b27b8873"}, - {file = "kiwisolver-1.4.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f464403e391724f8e7dff188d3fb77a85bd1273b3fdba182e6671abcc44434f8"}, - {file = "kiwisolver-1.4.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce5efe545eea86f52ec5a1185e5052815ea86778e8268bad71fa46433f7c0bef"}, - {file = "kiwisolver-1.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cb30165f71b7b3378668346e220c81d590593a3a1ff76428a53780310df03f35"}, - {file = "kiwisolver-1.4.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5a987f740e1c9964e614acb87ba1f014b4be760a341effc8dc789913d1840e6"}, - {file = "kiwisolver-1.4.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f2ceaa6d0450623d108956647ef19a1a28c7e07880f1171c932477308d44d80b"}, - {file = "kiwisolver-1.4.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:788cbf99738f18ae8a27b9d4d7314502b4b917005cfdacd1d6a59038332ae24d"}, - {file = "kiwisolver-1.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2f6668678a6b9488a7f8a6320e1b1c6396d179a976472dbc08d1600d04119511"}, - {file = "kiwisolver-1.4.6-cp311-cp311-win32.whl", hash = "sha256:10a09a3e4213c2806bcfd2eb4edb756c557973d2cacf06873b18a247fce897da"}, - {file = "kiwisolver-1.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:683ffef2c51fdc54112dc610d06b59b88c21e23fb669b905da6d5bec80da1bde"}, - {file = "kiwisolver-1.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:3b852c7f0ed9a2fd339c228829bca0964233ed45de50aae3e87b72ca37d177f8"}, - {file = "kiwisolver-1.4.6-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:979df7e9334f6a3694ee9be8d42817e519ef6d155a16499714d082cf41296852"}, - {file = "kiwisolver-1.4.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50c9c6c42bb6ca231626d1182b9128e89c5ce3c64456f811ff0280deb42d7bfe"}, - {file = "kiwisolver-1.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ace86489e7951bd26329a589198d3875c3d48380f889c69d3eb254b506a80101"}, - {file = "kiwisolver-1.4.6-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f94771988da902b475f78e85cf63c5c94392773b4a6494234d87c1b363b2fbc5"}, - {file = "kiwisolver-1.4.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62379eee430b1c477bb0a0bf6858a57c7c0dad9cee8b3144a5cb5d366c66a54"}, - {file = "kiwisolver-1.4.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e99b97d69499a7414572c906fbc7ca312519f2e17999730129f6c4492786e953"}, - {file = "kiwisolver-1.4.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab93f58afe3a02922a343189404f24ed885564e6316649790240124b95ef1d6e"}, - {file = "kiwisolver-1.4.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34105f4460ba50fc18a16a8e77a5122f7affe075628763fda748ad0ec534c3ee"}, - {file = "kiwisolver-1.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0081f85f0222620563409d4804c6567a930a45dafbe9674c7913fde131653992"}, - {file = "kiwisolver-1.4.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:df2a4a7cc2e01991e039a792457751b601bdf30143ab5f23f9a1e58f20c875f4"}, - {file = "kiwisolver-1.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1f401784df70ea2870e4e10adade66b5b06cb2c151bc2a8a414a1d10554e9a81"}, - {file = "kiwisolver-1.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:b19761c8c613b6d04c44f1a4797a144b44136f17ec009ccfb025e17b5698140c"}, - {file = "kiwisolver-1.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ee7289430ded484cc2eff9d8ffcce58ed7fe2c26919321dbc0580322a49e0120"}, - {file = "kiwisolver-1.4.6-cp312-cp312-win32.whl", hash = "sha256:331b9d9f408e874ecf34bd79b79df8e099f0b1b351b8844609c1bfdc8d2d45b2"}, - {file = "kiwisolver-1.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:a9be95d086578b3ada61a4621c0e7ee5f456820bfdccc3329061fdeae1e31179"}, - {file = "kiwisolver-1.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:773f2d87825779ab69196dfcf63e9d91043273421c6128c8d4ed82bc6316068f"}, - {file = "kiwisolver-1.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:140f376c22b5148453acff768cff19c34ebbd593126617018732ea1d9ce65547"}, - {file = "kiwisolver-1.4.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:160b983a1bca62d2274c886ddffc3168e0d6a1ae54d54556229f5bd57a4295e4"}, - {file = "kiwisolver-1.4.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f51a061d280300d33d37ebcfd02d5b480004e5bb5092e80ccabcdec8b7b1be9c"}, - {file = "kiwisolver-1.4.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2e33395cca1a27102beed4baf4e97490fcbb2c245626bddb940eafcfe697bf4a"}, - {file = "kiwisolver-1.4.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7d04968b6015583968e62eca184c5104cbdc02666fd5cc7a4b535f9846968fd"}, - {file = "kiwisolver-1.4.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cfbcd3a4b6193dd89dd005fbc5db8115a9f204727446562992f9f7fed217b3a"}, - {file = "kiwisolver-1.4.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a69366fb349c2be904ac13063e3b6bcae76ed1c826fcbc646f43135b45abb68"}, - {file = "kiwisolver-1.4.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3420b5179fb732a899a0dfbfdcbc221712d850b5772b082415658466e887e55"}, - {file = "kiwisolver-1.4.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4ccbc596114d32bb5d2ff74eb1785ab1b2d5bc56e7e54662ef335b333f427548"}, - {file = "kiwisolver-1.4.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fa61478e1356df92566ca46fe4165d0a36b9e336ee7fe7e71b923267fc5283aa"}, - {file = "kiwisolver-1.4.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:204039c59e6160f1227c2a33153d0738c93c171dbcc5b632c653f7a7abd08dc9"}, - {file = "kiwisolver-1.4.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:827425185329b813b40bbc176e0757282c558d6efab3c9f681f629c737e08a6e"}, - {file = "kiwisolver-1.4.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:ccff4e5ec806db412aceec89b8e7a83a56ff93c5c615c725e7784d90c5a556c4"}, - {file = "kiwisolver-1.4.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0d048002e15b9583ddff6ef4a27bd7f94fff830473856e82f311071b5cca9ade"}, - {file = "kiwisolver-1.4.6-cp38-cp38-win32.whl", hash = "sha256:11b0fdacd87bfe02c4f293ac38b2caf736591253687dce4d489a780a4bf2c39e"}, - {file = "kiwisolver-1.4.6-cp38-cp38-win_amd64.whl", hash = "sha256:ab480d087f10270ff24b06247e41eff901a452b890bfd708d8b7eb58bb01b212"}, - {file = "kiwisolver-1.4.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ec27e296790903e2a3484a1d93a8324d0cd660394842e0cf2a3657060ad8edc"}, - {file = "kiwisolver-1.4.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9a59519a485ef60d17af17d93f70679a9e41372f3b777c27103b4ce13ece4e40"}, - {file = "kiwisolver-1.4.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d047def01426d15d5dde1fb9ba4e1d8ed7218069e73f00e0994d050913b2c3f4"}, - {file = "kiwisolver-1.4.6-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b9dbf4091b04e1037c9c75ca67e71a348d145c4fac7e1bb3de2e3fe6f13df150"}, - {file = "kiwisolver-1.4.6-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:872c1323f29f0822000e47acac9a0b6ed2af843a20b27c85fa0fdc906f98140f"}, - {file = "kiwisolver-1.4.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbfa70f983f8a2ea69a3f72c4f04aaa1a152a246c4933e9d5d9c30da95815a9b"}, - {file = "kiwisolver-1.4.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb55ba22ebebc537c2f13ffe3ad83ff1529be360ee36192bb61f330af3a785a5"}, - {file = "kiwisolver-1.4.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8188c27be2e590c519e747d885511204c3e01f2ec77006843a204af6d22ab9c"}, - {file = "kiwisolver-1.4.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:19fa65a9e422eeb3b1d50073eb54e2e8c83821632b735d9d6af0ce1fcf42adea"}, - {file = "kiwisolver-1.4.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:89748381d0251d829cffeec03a5c2710812dc133a085a4f52be0996c291e721a"}, - {file = "kiwisolver-1.4.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:78a708e8371675e73208fa61b0985031e911584ad377593226c5974eaf0c2e2e"}, - {file = "kiwisolver-1.4.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:159a2ed7a89b51fcb9766562626f7d9fc411ed5f8b365413bc5ea2d4a8b81a2c"}, - {file = "kiwisolver-1.4.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7d42dbf8229d4c09632e46c83aeaf1dce6125925088704421c57c483dc9db304"}, - {file = "kiwisolver-1.4.6-cp39-cp39-win32.whl", hash = "sha256:a05655320567b9c83b95c1b45339d01ce6373ff2e2d64f643fee2ba2432f035e"}, - {file = "kiwisolver-1.4.6-cp39-cp39-win_amd64.whl", hash = "sha256:67b72c9cbd78ec8666af40747b80bf309f160701084e7cf492a02464e470ee29"}, - {file = "kiwisolver-1.4.6-cp39-cp39-win_arm64.whl", hash = "sha256:ef452cf166271827939e907b23a1bda423329663a93a644d4a7be8f7bbb431ed"}, - {file = "kiwisolver-1.4.6-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c0d4811a031ff5194d9b45c15090d674cbf9890461a5028c4475f7b3202a5b1d"}, - {file = "kiwisolver-1.4.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3aa8e43fbc847c26e17e50befac4de2336e223093263aa5b66c9c2030697b911"}, - {file = "kiwisolver-1.4.6-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d9a5af0c3cad547b59a2605d1af95c79c69c6a3aaf908be9677094ca6ba6dfa"}, - {file = "kiwisolver-1.4.6-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43e9bc95d7e9e6f7975f2f481db40738796ea718bf55e22c32eb8e242ed418fc"}, - {file = "kiwisolver-1.4.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b474a369ebe8c2cd02df20997b94cd566edc708f38dce18e66385766dcef5f3c"}, - {file = "kiwisolver-1.4.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:33422cbf4ea20cd42945a7ad6b04bc50da9630a5b42854e139944ffde3ba926f"}, - {file = "kiwisolver-1.4.6-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e033139b0a5981e30c1518b97ae4b20b4172e82ed49f09180d02640bde0ae831"}, - {file = "kiwisolver-1.4.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:261ca5e3a0b3fd3f6bf794122e0f80c76f5b5bb8055508a9d8a8869b5e7e8bef"}, - {file = "kiwisolver-1.4.6-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acdb63f64219a374f7f9bb6c560a435545511364b24757819332f86da03894b9"}, - {file = "kiwisolver-1.4.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c14338ac087b9a8db1db1b7d74ff91c0a2b1c93f6f1ab4942af15f1938449acf"}, - {file = "kiwisolver-1.4.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a40af4800335cab9dfc3b8cb300384ef14e7740f21142c66d7b3f57228c4a290"}, - {file = "kiwisolver-1.4.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:dcb6a2bade6292f2b5b19225a4330af49f855edeed6e3c17240df905696a1494"}, - {file = "kiwisolver-1.4.6.tar.gz", hash = "sha256:3cda29d601445e6aa11f80d90a9b8c2ae501650c55d7ad29829bd44499c9e7e0"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, ] [[package]] name = "langchain-core" -version = "0.1.52" +version = "0.2.41" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.1.52-py3-none-any.whl", hash = "sha256:62566749c92e8a1181c255c788548dc16dbc319d896cd6b9c95dc17af9b2a6db"}, - {file = "langchain_core-0.1.52.tar.gz", hash = "sha256:084c3fc452f5a6966c28ab3ec5dbc8b8d26fc3f63378073928f4e29d90b6393f"}, + {file = "langchain_core-0.2.41-py3-none-any.whl", hash = "sha256:3278fda5ba9a05defae8bb19f1226032add6aab21917db7b3bc74e750e263e84"}, + {file = "langchain_core-0.2.41.tar.gz", hash = "sha256:bc12032c5a298d85be754ccb129bc13ea21ccb1d6e22f8d7ba18b8da64315bb5"}, ] [package.dependencies] jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.1.0,<0.2.0" -packaging = ">=23.2,<24.0" -pydantic = ">=1,<3" +langsmith = ">=0.1.112,<0.2.0" +packaging = ">=23.2,<25" +pydantic = [ + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] PyYAML = ">=5.3" -tenacity = ">=8.1.0,<9.0.0" - -[package.extras] -extended-testing = ["jinja2 (>=3,<4)"] +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" +typing-extensions = ">=4.7" [[package]] name = "langsmith" -version = "0.1.71" +version = "0.1.136" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.71-py3-none-any.whl", hash = "sha256:a9979de2780442eb24eced31314e49f5ece6f807a0d70740b2c6c39217226794"}, - {file = "langsmith-0.1.71.tar.gz", hash = "sha256:bdb1037a08acf7c19b3969c085df09c1eecb65baca8400b3b76ae871e2c8a97e"}, + {file = "langsmith-0.1.136-py3-none-any.whl", hash = "sha256:cad2215eb7a754ee259878e19c558f4f8d3795aa1b699f087d4500e640f80d0a"}, + {file = "langsmith-0.1.136.tar.gz", hash = "sha256:5c0de01a313db70dd9a85845c0f416a69b5b653b3e98ba413d7d41e8851315b1"}, ] [package.dependencies] +httpx = ">=0.23.0,<1" orjson = ">=3.9.14,<4.0.0" -pydantic = ">=1,<3" +pydantic = [ + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] requests = ">=2,<3" +requests-toolbelt = ">=1.0.0,<2.0.0" [[package]] name = "litellm" -version = "1.40.16" +version = "1.49.7" description = "Library to easily interface with LLM API providers" optional = false python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" files = [ - {file = "litellm-1.40.16-py3-none-any.whl", hash = "sha256:b78571a39a3b7819ca9cb96278f4b15b97557e2cd50e9aeee9210a7e744b8667"}, - {file = "litellm-1.40.16.tar.gz", hash = "sha256:b32cd15c7cf9084aa0f92eb7103323741d63cc8a14e28b739054b0cb6682c431"}, + {file = "litellm-1.49.7-py3-none-any.whl", hash = "sha256:30f0c5b1b0a1466ae29006f3d3b29dd8a3836387375cc2efbde9a5d76bc92673"}, + {file = "litellm-1.49.7.tar.gz", hash = "sha256:9442b5c0922580ce3d536030247800c0112c64c0f123aad1a4a87872e51f0e09"}, ] [package.dependencies] aiohttp = "*" click = "*" -ijson = "*" importlib-metadata = ">=6.8.0" jinja2 = ">=3.1.2,<4.0.0" -openai = ">=1.27.0" +jsonschema = ">=4.22.0,<5.0.0" +openai = ">=1.51.0" pydantic = ">=2.0.0,<3.0.0" python-dotenv = ">=0.2.0" requests = ">=2.31.0,<3.0.0" @@ -3314,7 +3402,7 @@ tokenizers = "*" [package.extras] extra-proxy = ["azure-identity (>=1.15.0,<2.0.0)", "azure-keyvault-secrets (>=4.8.0,<5.0.0)", "google-cloud-kms (>=2.21.3,<3.0.0)", "prisma (==0.11.0)", "resend (>=0.8.0,<0.9.0)"] -proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "cryptography (>=42.0.5,<43.0.0)", "fastapi (>=0.111.0,<0.112.0)", "fastapi-sso (>=0.10.0,<0.11.0)", "gunicorn (>=22.0.0,<23.0.0)", "orjson (>=3.9.7,<4.0.0)", "python-multipart (>=0.0.9,<0.0.10)", "pyyaml (>=6.0.1,<7.0.0)", "rq", "uvicorn (>=0.22.0,<0.23.0)"] +proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "cryptography (>=42.0.5,<43.0.0)", "fastapi (>=0.111.0,<0.112.0)", "fastapi-sso (>=0.10.0,<0.11.0)", "gunicorn (>=22.0.0,<23.0.0)", "orjson (>=3.9.7,<4.0.0)", "pynacl (>=1.5.0,<2.0.0)", "python-multipart (>=0.0.9,<0.0.10)", "pyyaml (>=6.0.1,<7.0.0)", "rq", "uvicorn (>=0.22.0,<0.23.0)"] [[package]] name = "lxml" @@ -3489,13 +3577,13 @@ gcp = ["cloud-sql-python-connector[pg8000] (>=1.0.0)", "pg8000", "sqlalchemy"] [[package]] name = "markdown" -version = "3.6" +version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, - {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, ] [package.dependencies] @@ -3531,71 +3619,72 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] @@ -3678,13 +3767,13 @@ traitlets = "*" [[package]] name = "mdit-py-plugins" -version = "0.4.1" +version = "0.4.2" description = "Collection of plugins for markdown-it-py" optional = false python-versions = ">=3.8" files = [ - {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, - {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, + {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, + {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, ] [package.dependencies] @@ -3730,13 +3819,13 @@ files = [ [[package]] name = "mkdocs" -version = "1.6.0" +version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs-1.6.0-py3-none-any.whl", hash = "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7"}, - {file = "mkdocs-1.6.0.tar.gz", hash = "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512"}, + {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, + {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, ] [package.dependencies] @@ -3761,13 +3850,13 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp [[package]] name = "mkdocs-autorefs" -version = "1.0.1" +version = "1.2.0" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_autorefs-1.0.1-py3-none-any.whl", hash = "sha256:aacdfae1ab197780fb7a2dac92ad8a3d8f7ca8049a9cbe56a4218cd52e8da570"}, - {file = "mkdocs_autorefs-1.0.1.tar.gz", hash = "sha256:f684edf847eced40b570b57846b15f0bf57fb93ac2c510450775dcf16accb971"}, + {file = "mkdocs_autorefs-1.2.0-py3-none-any.whl", hash = "sha256:d588754ae89bd0ced0c70c06f58566a4ee43471eeeee5202427da7de9ef85a2f"}, + {file = "mkdocs_autorefs-1.2.0.tar.gz", hash = "sha256:a86b93abff653521bda71cf3fc5596342b7a23982093915cb74273f67522190f"}, ] [package.dependencies] @@ -3805,12 +3894,13 @@ files = [ [[package]] name = "mkdocs-jupyter" -version = "0.24.7" +version = "0.25.1" description = "Use Jupyter in mkdocs websites" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "mkdocs_jupyter-0.24.7-py3-none-any.whl", hash = "sha256:893d04bea1e007479a46e4e72852cd4d280c4d358ce4a0445250f3f80c639723"}, + {file = "mkdocs_jupyter-0.25.1-py3-none-any.whl", hash = "sha256:3f679a857609885d322880e72533ef5255561bbfdb13cfee2a1e92ef4d4ad8d8"}, + {file = "mkdocs_jupyter-0.25.1.tar.gz", hash = "sha256:0e9272ff4947e0ec683c92423a4bfb42a26477c103ab1a6ab8277e2dcc8f7afe"}, ] [package.dependencies] @@ -3823,13 +3913,13 @@ pygments = ">2.12.0" [[package]] name = "mkdocs-material" -version = "9.5.25" +version = "9.5.41" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.25-py3-none-any.whl", hash = "sha256:68fdab047a0b9bfbefe79ce267e8a7daaf5128bcf7867065fcd201ee335fece1"}, - {file = "mkdocs_material-9.5.25.tar.gz", hash = "sha256:d0662561efb725b712207e0ee01f035ca15633f29a64628e24f01ec99d7078f4"}, + {file = "mkdocs_material-9.5.41-py3-none-any.whl", hash = "sha256:990bc138c33342b5b73e7545915ebc0136e501bfbd8e365735144f5120891d83"}, + {file = "mkdocs_material-9.5.41.tar.gz", hash = "sha256:30fa5d459b4b8130848ecd8e1c908878345d9d8268f7ddbc31eebe88d462d97b"}, ] [package.dependencies] @@ -3903,24 +3993,6 @@ files = [ griffe = ">=0.35" mkdocstrings = ">=0.20" -[[package]] -name = "mkl" -version = "2021.4.0" -description = "Intel® oneAPI Math Kernel Library" -optional = true -python-versions = "*" -files = [ - {file = "mkl-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:67460f5cd7e30e405b54d70d1ed3ca78118370b65f7327d495e9c8847705e2fb"}, - {file = "mkl-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:636d07d90e68ccc9630c654d47ce9fdeb036bb46e2b193b3a9ac8cfea683cce5"}, - {file = "mkl-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:398dbf2b0d12acaf54117a5210e8f191827f373d362d796091d161f610c1ebfb"}, - {file = "mkl-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8"}, - {file = "mkl-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:ceef3cafce4c009dd25f65d7ad0d833a0fbadc3d8903991ec92351fe5de1e718"}, -] - -[package.dependencies] -intel-openmp = "==2021.*" -tbb = "==2021.*" - [[package]] name = "mknotebooks" version = "0.8.0" @@ -3940,13 +4012,13 @@ nbconvert = ">=6.0.0" [[package]] name = "mlflow" -version = "2.16.0" +version = "2.17.0" description = "MLflow is an open source platform for the complete machine learning lifecycle" optional = true python-versions = ">=3.8" files = [ - {file = "mlflow-2.16.0-py3-none-any.whl", hash = "sha256:9f27ef6ae7a82d7ecd67b6b4a4d50637a5e8160639115570fbc689758f9c0b54"}, - {file = "mlflow-2.16.0.tar.gz", hash = "sha256:82ea1a2e800f404f1586783b7636091c0a5754cf9ff45afeadf3a5e467f5168f"}, + {file = "mlflow-2.17.0-py3-none-any.whl", hash = "sha256:64fbc0dfcb7322ed4cbccadc2f533bdd2944001b983ea8c10db45c7c59b46b7c"}, + {file = "mlflow-2.17.0.tar.gz", hash = "sha256:5bb2089b833da48e4a92a9b4cb1cb5fa509a571eb3c603be39f5238b4721e076"}, ] [package.dependencies] @@ -3961,7 +4033,7 @@ Jinja2 = [ ] markdown = ">=3.3,<4" matplotlib = "<4" -mlflow-skinny = "2.16.0" +mlflow-skinny = "2.17.0" numpy = "<3" pandas = "<3" pyarrow = ">=4.0.0,<18" @@ -3973,23 +4045,24 @@ waitress = {version = "<4", markers = "platform_system == \"Windows\""} [package.extras] aliyun-oss = ["aliyunstoreplugin"] databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "botocore", "google-cloud-storage (>=1.30.0)"] -extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "mlserver (>=1.2.0,!=1.3.1,<1.4.0)", "mlserver-mlflow (>=1.2.0,!=1.3.1,<1.4.0)", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] +extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] gateway = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "pydantic (>=1.0,<3)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<1)"] genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "pydantic (>=1.0,<3)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<1)"] jfrog = ["mlflow-jfrog-plugin"] -langchain = ["langchain (>=0.1.0,<=0.2.15)"] +langchain = ["langchain (>=0.1.0,<=0.3.1)"] +mlserver = ["mlserver (>=1.2.0,!=1.3.1)", "mlserver-mlflow (>=1.2.0,!=1.3.1)"] sqlserver = ["mlflow-dbstore"] xethub = ["mlflow-xethub"] [[package]] name = "mlflow-skinny" -version = "2.16.0" +version = "2.17.0" description = "MLflow is an open source platform for the complete machine learning lifecycle" optional = true python-versions = ">=3.8" files = [ - {file = "mlflow_skinny-2.16.0-py3-none-any.whl", hash = "sha256:c55541f50efd0f6637377b10e8a654847a3fcd815b8680a95f02e0ca6bd7700c"}, - {file = "mlflow_skinny-2.16.0.tar.gz", hash = "sha256:9b823173063743783b4e7b6c52bdadcc7d9dab48eb883ac454c0d56609df6b2d"}, + {file = "mlflow_skinny-2.17.0-py3-none-any.whl", hash = "sha256:9eff7160f7459e09c01cc5bc2a68fdba7b64adbce069ef6d1013569830569048"}, + {file = "mlflow_skinny-2.17.0.tar.gz", hash = "sha256:bbb770368e68ffe783a76fa38854618c1411b44bda21eb8b770ca4cc28801299"}, ] [package.dependencies] @@ -4010,23 +4083,24 @@ sqlparse = ">=0.4.0,<1" [package.extras] aliyun-oss = ["aliyunstoreplugin"] databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "botocore", "google-cloud-storage (>=1.30.0)"] -extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "mlserver (>=1.2.0,!=1.3.1,<1.4.0)", "mlserver-mlflow (>=1.2.0,!=1.3.1,<1.4.0)", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] +extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] gateway = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "pydantic (>=1.0,<3)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<1)"] genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "pydantic (>=1.0,<3)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<1)"] jfrog = ["mlflow-jfrog-plugin"] -langchain = ["langchain (>=0.1.0,<=0.2.15)"] +langchain = ["langchain (>=0.1.0,<=0.3.1)"] +mlserver = ["mlserver (>=1.2.0,!=1.3.1)", "mlserver-mlflow (>=1.2.0,!=1.3.1)"] sqlserver = ["mlflow-dbstore"] xethub = ["mlflow-xethub"] [[package]] name = "more-itertools" -version = "10.2.0" +version = "10.5.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.8" files = [ - {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, - {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, + {file = "more-itertools-10.5.0.tar.gz", hash = "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6"}, + {file = "more_itertools-10.5.0-py3-none-any.whl", hash = "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef"}, ] [[package]] @@ -4048,102 +4122,107 @@ tests = ["pytest (>=4.6)"] [[package]] name = "multidict" -version = "6.0.5" +version = "6.1.0" description = "multidict implementation" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, - {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, - {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, - {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, - {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, - {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, - {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, - {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, - {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, - {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, - {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, - {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, - {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, - {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, - {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, - {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, -] + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} [[package]] name = "mypy-extensions" @@ -4294,45 +4373,45 @@ files = [ [[package]] name = "networkx" -version = "3.1" +version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, - {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, ] [package.extras] -default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] -developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] -doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] -test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "nh3" -version = "0.2.17" +version = "0.2.18" description = "Python bindings to the ammonia HTML sanitization library." optional = false python-versions = "*" files = [ - {file = "nh3-0.2.17-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:551672fd71d06cd828e282abdb810d1be24e1abb7ae2543a8fa36a71c1006fe9"}, - {file = "nh3-0.2.17-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c551eb2a3876e8ff2ac63dff1585236ed5dfec5ffd82216a7a174f7c5082a78a"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:66f17d78826096291bd264f260213d2b3905e3c7fae6dfc5337d49429f1dc9f3"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0316c25b76289cf23be6b66c77d3608a4fdf537b35426280032f432f14291b9a"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:22c26e20acbb253a5bdd33d432a326d18508a910e4dcf9a3316179860d53345a"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:85cdbcca8ef10733bd31f931956f7fbb85145a4d11ab9e6742bbf44d88b7e351"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40015514022af31975c0b3bca4014634fa13cb5dc4dbcbc00570acc781316dcc"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba73a2f8d3a1b966e9cdba7b211779ad8a2561d2dba9674b8a19ed817923f65f"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c21bac1a7245cbd88c0b0e4a420221b7bfa838a2814ee5bb924e9c2f10a1120b"}, - {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d7a25fd8c86657f5d9d576268e3b3767c5cd4f42867c9383618be8517f0f022a"}, - {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c790769152308421283679a142dbdb3d1c46c79c823008ecea8e8141db1a2062"}, - {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b4427ef0d2dfdec10b641ed0bdaf17957eb625b2ec0ea9329b3d28806c153d71"}, - {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a3f55fabe29164ba6026b5ad5c3151c314d136fd67415a17660b4aaddacf1b10"}, - {file = "nh3-0.2.17-cp37-abi3-win32.whl", hash = "sha256:1a814dd7bba1cb0aba5bcb9bebcc88fd801b63e21e2450ae6c52d3b3336bc911"}, - {file = "nh3-0.2.17-cp37-abi3-win_amd64.whl", hash = "sha256:1aa52a7def528297f256de0844e8dd680ee279e79583c76d6fa73a978186ddfb"}, - {file = "nh3-0.2.17.tar.gz", hash = "sha256:40d0741a19c3d645e54efba71cb0d8c475b59135c1e3c580f879ad5514cbf028"}, + {file = "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86"}, + {file = "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f"}, + {file = "nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe"}, + {file = "nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a"}, + {file = "nh3-0.2.18-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50"}, + {file = "nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204"}, + {file = "nh3-0.2.18-cp37-abi3-win32.whl", hash = "sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be"}, + {file = "nh3-0.2.18-cp37-abi3-win_amd64.whl", hash = "sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844"}, + {file = "nh3-0.2.18.tar.gz", hash = "sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4"}, ] [[package]] @@ -4488,56 +4567,61 @@ testing = ["matplotlib", "pytest", "pytest-cov"] [[package]] name = "nvidia-cublas-cu12" -version = "12.1.3.1" +version = "12.4.5.8" description = "CUBLAS native runtime libraries" optional = true python-versions = ">=3" files = [ - {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, - {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, + {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3"}, + {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b"}, + {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-win_amd64.whl", hash = "sha256:5a796786da89203a0657eda402bcdcec6180254a8ac22d72213abc42069522dc"}, ] [[package]] name = "nvidia-cuda-cupti-cu12" -version = "12.1.105" +version = "12.4.127" description = "CUDA profiling tools runtime libs." optional = true python-versions = ">=3" files = [ - {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, - {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, + {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a"}, + {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb"}, + {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:5688d203301ab051449a2b1cb6690fbe90d2b372f411521c86018b950f3d7922"}, ] [[package]] name = "nvidia-cuda-nvrtc-cu12" -version = "12.1.105" +version = "12.4.127" description = "NVRTC native runtime libraries" optional = true python-versions = ">=3" files = [ - {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, - {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, + {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198"}, + {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338"}, + {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:a961b2f1d5f17b14867c619ceb99ef6fcec12e46612711bcec78eb05068a60ec"}, ] [[package]] name = "nvidia-cuda-runtime-cu12" -version = "12.1.105" +version = "12.4.127" description = "CUDA Runtime native Libraries" optional = true python-versions = ">=3" files = [ - {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, - {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, + {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3"}, + {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5"}, + {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:09c2e35f48359752dfa822c09918211844a3d93c100a715d79b59591130c5e1e"}, ] [[package]] name = "nvidia-cudnn-cu12" -version = "8.9.2.26" +version = "9.1.0.70" description = "cuDNN runtime libraries" optional = true python-versions = ">=3" files = [ - {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, + {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, + {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, ] [package.dependencies] @@ -4545,35 +4629,41 @@ nvidia-cublas-cu12 = "*" [[package]] name = "nvidia-cufft-cu12" -version = "11.0.2.54" +version = "11.2.1.3" description = "CUFFT native runtime libraries" optional = true python-versions = ">=3" files = [ - {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, - {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, + {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399"}, + {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9"}, + {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-win_amd64.whl", hash = "sha256:d802f4954291101186078ccbe22fc285a902136f974d369540fd4a5333d1440b"}, ] +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + [[package]] name = "nvidia-curand-cu12" -version = "10.3.2.106" +version = "10.3.5.147" description = "CURAND native runtime libraries" optional = true python-versions = ">=3" files = [ - {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, - {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, + {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9"}, + {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b"}, + {file = "nvidia_curand_cu12-10.3.5.147-py3-none-win_amd64.whl", hash = "sha256:f307cc191f96efe9e8f05a87096abc20d08845a841889ef78cb06924437f6771"}, ] [[package]] name = "nvidia-cusolver-cu12" -version = "11.4.5.107" +version = "11.6.1.9" description = "CUDA solver native runtime libraries" optional = true python-versions = ">=3" files = [ - {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, - {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, + {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e"}, + {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260"}, + {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-win_amd64.whl", hash = "sha256:e77314c9d7b694fcebc84f58989f3aa4fb4cb442f12ca1a9bde50f5e8f6d1b9c"}, ] [package.dependencies] @@ -4583,13 +4673,14 @@ nvidia-nvjitlink-cu12 = "*" [[package]] name = "nvidia-cusparse-cu12" -version = "12.1.0.106" +version = "12.3.1.170" description = "CUSPARSE native runtime libraries" optional = true python-versions = ">=3" files = [ - {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, - {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, + {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3"}, + {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1"}, + {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-win_amd64.whl", hash = "sha256:9bc90fb087bc7b4c15641521f31c0371e9a612fc2ba12c338d3ae032e6b6797f"}, ] [package.dependencies] @@ -4597,99 +4688,100 @@ nvidia-nvjitlink-cu12 = "*" [[package]] name = "nvidia-nccl-cu12" -version = "2.20.5" +version = "2.21.5" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = true python-versions = ">=3" files = [ - {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01"}, - {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56"}, + {file = "nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0"}, ] [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.5.40" +version = "12.4.127" description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_aarch64.whl", hash = "sha256:004186d5ea6a57758fd6d57052a123c73a4815adf365eb8dd6a85c9eaa7535ff"}, - {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d9714f27c1d0f0895cd8915c07a87a1d0029a0aa36acaf9156952ec2a8a12189"}, - {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-win_amd64.whl", hash = "sha256:c3401dc8543b52d3a8158007a0c1ab4e9c768fcbd24153a48c86972102197ddd"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, ] [[package]] name = "nvidia-nvtx-cu12" -version = "12.1.105" +version = "12.4.127" description = "NVIDIA Tools Extension" optional = true python-versions = ">=3" files = [ - {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, - {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, + {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3"}, + {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a"}, + {file = "nvidia_nvtx_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:641dccaaa1139f3ffb0d3164b4b84f9d253397e38246a4f2f36728b48566d485"}, ] [[package]] name = "openai" -version = "1.31.0" +version = "1.52.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.31.0-py3-none-any.whl", hash = "sha256:82044ee3122113f2a468a1f308a8882324d09556ba5348687c535d3655ee331c"}, - {file = "openai-1.31.0.tar.gz", hash = "sha256:54ae0625b005d6a3b895db2b8438dae1059cffff0cd262a26e9015c13a29ab06"}, + {file = "openai-1.52.0-py3-none-any.whl", hash = "sha256:0c249f20920183b0a2ca4f7dba7b0452df3ecd0fa7985eb1d91ad884bc3ced9c"}, + {file = "openai-1.52.0.tar.gz", hash = "sha256:95c65a5f77559641ab8f3e4c3a050804f7b51d278870e2ec1f7444080bfe565a"}, ] [package.dependencies] anyio = ">=3.5.0,<5" distro = ">=1.7.0,<2" httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" pydantic = ">=1.9.0,<3" sniffio = "*" tqdm = ">4" -typing-extensions = ">=4.7,<5" +typing-extensions = ">=4.11,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "opentelemetry-api" -version = "1.24.0" +version = "1.27.0" description = "OpenTelemetry Python API" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_api-1.24.0-py3-none-any.whl", hash = "sha256:0f2c363d98d10d1ce93330015ca7fd3a65f60be64e05e30f557c61de52c80ca2"}, - {file = "opentelemetry_api-1.24.0.tar.gz", hash = "sha256:42719f10ce7b5a9a73b10a4baf620574fb8ad495a9cbe5c18d76b75d8689c67e"}, + {file = "opentelemetry_api-1.27.0-py3-none-any.whl", hash = "sha256:953d5871815e7c30c81b56d910c707588000fff7a3ca1c73e6531911d53065e7"}, + {file = "opentelemetry_api-1.27.0.tar.gz", hash = "sha256:ed673583eaa5f81b5ce5e86ef7cdaf622f88ef65f0b9aab40b843dcae5bef342"}, ] [package.dependencies] deprecated = ">=1.2.6" -importlib-metadata = ">=6.0,<=7.0" +importlib-metadata = ">=6.0,<=8.4.0" [[package]] name = "opentelemetry-exporter-otlp-proto-common" -version = "1.24.0" +version = "1.27.0" description = "OpenTelemetry Protobuf encoding" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_exporter_otlp_proto_common-1.24.0-py3-none-any.whl", hash = "sha256:e51f2c9735054d598ad2df5d3eca830fecfb5b0bda0a2fa742c9c7718e12f641"}, - {file = "opentelemetry_exporter_otlp_proto_common-1.24.0.tar.gz", hash = "sha256:5d31fa1ff976cacc38be1ec4e3279a3f88435c75b38b1f7a099a1faffc302461"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.27.0-py3-none-any.whl", hash = "sha256:675db7fffcb60946f3a5c43e17d1168a3307a94a930ecf8d2ea1f286f3d4f79a"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.27.0.tar.gz", hash = "sha256:159d27cf49f359e3798c4c3eb8da6ef4020e292571bd8c5604a2a573231dd5c8"}, ] [package.dependencies] -opentelemetry-proto = "1.24.0" +opentelemetry-proto = "1.27.0" [[package]] name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.24.0" +version = "1.27.0" description = "OpenTelemetry Collector Protobuf over gRPC Exporter" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_exporter_otlp_proto_grpc-1.24.0-py3-none-any.whl", hash = "sha256:f40d62aa30a0a43cc1657428e59fcf82ad5f7ea8fff75de0f9d9cb6f739e0a3b"}, - {file = "opentelemetry_exporter_otlp_proto_grpc-1.24.0.tar.gz", hash = "sha256:217c6e30634f2c9797999ea9da29f7300479a94a610139b9df17433f915e7baa"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.27.0-py3-none-any.whl", hash = "sha256:56b5bbd5d61aab05e300d9d62a6b3c134827bbd28d0b12f2649c2da368006c9e"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.27.0.tar.gz", hash = "sha256:af6f72f76bcf425dfb5ad11c1a6d6eca2863b91e63575f89bb7b4b55099d968f"}, ] [package.dependencies] @@ -4697,42 +4789,39 @@ deprecated = ">=1.2.6" googleapis-common-protos = ">=1.52,<2.0" grpcio = ">=1.0.0,<2.0.0" opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.24.0" -opentelemetry-proto = "1.24.0" -opentelemetry-sdk = ">=1.24.0,<1.25.0" - -[package.extras] -test = ["pytest-grpc"] +opentelemetry-exporter-otlp-proto-common = "1.27.0" +opentelemetry-proto = "1.27.0" +opentelemetry-sdk = ">=1.27.0,<1.28.0" [[package]] name = "opentelemetry-exporter-otlp-proto-http" -version = "1.24.0" +version = "1.27.0" description = "OpenTelemetry Collector Protobuf over HTTP Exporter" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_exporter_otlp_proto_http-1.24.0-py3-none-any.whl", hash = "sha256:25af10e46fdf4cd3833175e42f4879a1255fc01655fe14c876183a2903949836"}, - {file = "opentelemetry_exporter_otlp_proto_http-1.24.0.tar.gz", hash = "sha256:704c066cc96f5131881b75c0eac286cd73fc735c490b054838b4513254bd7850"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.27.0-py3-none-any.whl", hash = "sha256:688027575c9da42e179a69fe17e2d1eba9b14d81de8d13553a21d3114f3b4d75"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.27.0.tar.gz", hash = "sha256:2103479092d8eb18f61f3fbff084f67cc7f2d4a7d37e75304b8b56c1d09ebef5"}, ] [package.dependencies] deprecated = ">=1.2.6" googleapis-common-protos = ">=1.52,<2.0" opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.24.0" -opentelemetry-proto = "1.24.0" -opentelemetry-sdk = ">=1.24.0,<1.25.0" +opentelemetry-exporter-otlp-proto-common = "1.27.0" +opentelemetry-proto = "1.27.0" +opentelemetry-sdk = ">=1.27.0,<1.28.0" requests = ">=2.7,<3.0" [[package]] name = "opentelemetry-instrumentation" -version = "0.45b0" +version = "0.48b0" description = "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_instrumentation-0.45b0-py3-none-any.whl", hash = "sha256:06c02e2c952c1b076e8eaedf1b82f715e2937ba7eeacab55913dd434fbcec258"}, - {file = "opentelemetry_instrumentation-0.45b0.tar.gz", hash = "sha256:6c47120a7970bbeb458e6a73686ee9ba84b106329a79e4a4a66761f933709c7e"}, + {file = "opentelemetry_instrumentation-0.48b0-py3-none-any.whl", hash = "sha256:a69750dc4ba6a5c3eb67986a337185a25b739966d80479befe37b546fc870b44"}, + {file = "opentelemetry_instrumentation-0.48b0.tar.gz", hash = "sha256:94929685d906380743a71c3970f76b5f07476eea1834abd5dd9d17abfe23cc35"}, ] [package.dependencies] @@ -4741,54 +4830,56 @@ setuptools = ">=16.0" wrapt = ">=1.0.0,<2.0.0" [[package]] -name = "opentelemetry-instrumentation-flask" -version = "0.45b0" -description = "Flask instrumentation for OpenTelemetry" +name = "opentelemetry-instrumentation-asgi" +version = "0.48b0" +description = "ASGI instrumentation for OpenTelemetry" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_instrumentation_flask-0.45b0-py3-none-any.whl", hash = "sha256:4a07d1bca110dff0e2ce51a2930df497e90982e3a36e0362272fa5080db7f851"}, - {file = "opentelemetry_instrumentation_flask-0.45b0.tar.gz", hash = "sha256:70875ad03da6e4e07aada6795c65d6b919024a741f9295aa19a022f7f7afc900"}, + {file = "opentelemetry_instrumentation_asgi-0.48b0-py3-none-any.whl", hash = "sha256:ddb1b5fc800ae66e85a4e2eca4d9ecd66367a8c7b556169d9e7b57e10676e44d"}, + {file = "opentelemetry_instrumentation_asgi-0.48b0.tar.gz", hash = "sha256:04c32174b23c7fa72ddfe192dad874954968a6a924608079af9952964ecdf785"}, ] [package.dependencies] -importlib-metadata = ">=4.0" +asgiref = ">=3.0,<4.0" opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.45b0" -opentelemetry-instrumentation-wsgi = "0.45b0" -opentelemetry-semantic-conventions = "0.45b0" -opentelemetry-util-http = "0.45b0" -packaging = ">=21.0" +opentelemetry-instrumentation = "0.48b0" +opentelemetry-semantic-conventions = "0.48b0" +opentelemetry-util-http = "0.48b0" [package.extras] -instruments = ["flask (>=1.0)"] +instruments = ["asgiref (>=3.0,<4.0)"] [[package]] -name = "opentelemetry-instrumentation-wsgi" -version = "0.45b0" -description = "WSGI Middleware for OpenTelemetry" +name = "opentelemetry-instrumentation-fastapi" +version = "0.48b0" +description = "OpenTelemetry FastAPI Instrumentation" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_instrumentation_wsgi-0.45b0-py3-none-any.whl", hash = "sha256:7a6f9c71b25f5c5e112827540008882f6a9088447cb65745e7f2083749516663"}, - {file = "opentelemetry_instrumentation_wsgi-0.45b0.tar.gz", hash = "sha256:f53a2a38e6582406e207d404e4c1b859b83bec11a68ad6c7366642d01c873ad0"}, + {file = "opentelemetry_instrumentation_fastapi-0.48b0-py3-none-any.whl", hash = "sha256:afeb820a59e139d3e5d96619600f11ce0187658b8ae9e3480857dd790bc024f2"}, + {file = "opentelemetry_instrumentation_fastapi-0.48b0.tar.gz", hash = "sha256:21a72563ea412c0b535815aeed75fc580240f1f02ebc72381cfab672648637a2"}, ] [package.dependencies] opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.45b0" -opentelemetry-semantic-conventions = "0.45b0" -opentelemetry-util-http = "0.45b0" +opentelemetry-instrumentation = "0.48b0" +opentelemetry-instrumentation-asgi = "0.48b0" +opentelemetry-semantic-conventions = "0.48b0" +opentelemetry-util-http = "0.48b0" + +[package.extras] +instruments = ["fastapi (>=0.58,<1.0)"] [[package]] name = "opentelemetry-proto" -version = "1.24.0" +version = "1.27.0" description = "OpenTelemetry Python Proto" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_proto-1.24.0-py3-none-any.whl", hash = "sha256:bcb80e1e78a003040db71ccf83f2ad2019273d1e0828089d183b18a1476527ce"}, - {file = "opentelemetry_proto-1.24.0.tar.gz", hash = "sha256:ff551b8ad63c6cabb1845ce217a6709358dfaba0f75ea1fa21a61ceddc78cab8"}, + {file = "opentelemetry_proto-1.27.0-py3-none-any.whl", hash = "sha256:b133873de5581a50063e1e4b29cdcf0c5e253a8c2d8dc1229add20a4c3830ace"}, + {file = "opentelemetry_proto-1.27.0.tar.gz", hash = "sha256:33c9345d91dafd8a74fc3d7576c5a38f18b7fdf8d02983ac67485386132aedd6"}, ] [package.dependencies] @@ -4796,95 +4887,110 @@ protobuf = ">=3.19,<5.0" [[package]] name = "opentelemetry-sdk" -version = "1.24.0" +version = "1.27.0" description = "OpenTelemetry Python SDK" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_sdk-1.24.0-py3-none-any.whl", hash = "sha256:fa731e24efe832e98bcd90902085b359dcfef7d9c9c00eb5b9a18587dae3eb59"}, - {file = "opentelemetry_sdk-1.24.0.tar.gz", hash = "sha256:75bc0563affffa827700e0f4f4a68e1e257db0df13372344aebc6f8a64cde2e5"}, + {file = "opentelemetry_sdk-1.27.0-py3-none-any.whl", hash = "sha256:365f5e32f920faf0fd9e14fdfd92c086e317eaa5f860edba9cdc17a380d9197d"}, + {file = "opentelemetry_sdk-1.27.0.tar.gz", hash = "sha256:d525017dea0ccce9ba4e0245100ec46ecdc043f2d7b8315d56b19aff0904fa6f"}, ] [package.dependencies] -opentelemetry-api = "1.24.0" -opentelemetry-semantic-conventions = "0.45b0" +opentelemetry-api = "1.27.0" +opentelemetry-semantic-conventions = "0.48b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.45b0" +version = "0.48b0" description = "OpenTelemetry Semantic Conventions" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_semantic_conventions-0.45b0-py3-none-any.whl", hash = "sha256:a4a6fb9a7bacd9167c082aa4681009e9acdbfa28ffb2387af50c2fef3d30c864"}, - {file = "opentelemetry_semantic_conventions-0.45b0.tar.gz", hash = "sha256:7c84215a44ac846bc4b8e32d5e78935c5c43482e491812a0bb8aaf87e4d92118"}, + {file = "opentelemetry_semantic_conventions-0.48b0-py3-none-any.whl", hash = "sha256:a0de9f45c413a8669788a38569c7e0a11ce6ce97861a628cca785deecdc32a1f"}, + {file = "opentelemetry_semantic_conventions-0.48b0.tar.gz", hash = "sha256:12d74983783b6878162208be57c9effcb89dc88691c64992d70bb89dc00daa1a"}, ] +[package.dependencies] +deprecated = ">=1.2.6" +opentelemetry-api = "1.27.0" + [[package]] name = "opentelemetry-util-http" -version = "0.45b0" +version = "0.48b0" description = "Web util for OpenTelemetry" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_util_http-0.45b0-py3-none-any.whl", hash = "sha256:6628868b501b3004e1860f976f410eeb3d3499e009719d818000f24ce17b6e33"}, - {file = "opentelemetry_util_http-0.45b0.tar.gz", hash = "sha256:4ce08b6a7d52dd7c96b7705b5b4f06fdb6aa3eac1233b3b0bfef8a0cab9a92cd"}, + {file = "opentelemetry_util_http-0.48b0-py3-none-any.whl", hash = "sha256:76f598af93aab50328d2a69c786beaedc8b6a7770f7a818cc307eb353debfffb"}, + {file = "opentelemetry_util_http-0.48b0.tar.gz", hash = "sha256:60312015153580cc20f322e5cdc3d3ecad80a71743235bdb77716e742814623c"}, ] [[package]] name = "orjson" -version = "3.10.3" +version = "3.10.7" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"}, - {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"}, - {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"}, - {file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"}, - {file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"}, - {file = "orjson-3.10.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"}, - {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"}, - {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"}, - {file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"}, - {file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"}, - {file = "orjson-3.10.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"}, - {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"}, - {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"}, - {file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"}, - {file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"}, - {file = "orjson-3.10.3-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"}, - {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"}, - {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"}, - {file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"}, - {file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"}, - {file = "orjson-3.10.3-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"}, - {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"}, - {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"}, - {file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"}, - {file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"}, - {file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"}, + {file = "orjson-3.10.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:74f4544f5a6405b90da8ea724d15ac9c36da4d72a738c64685003337401f5c12"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34a566f22c28222b08875b18b0dfbf8a947e69df21a9ed5c51a6bf91cfb944ac"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf6ba8ebc8ef5792e2337fb0419f8009729335bb400ece005606336b7fd7bab7"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac7cf6222b29fbda9e3a472b41e6a5538b48f2c8f99261eecd60aafbdb60690c"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de817e2f5fc75a9e7dd350c4b0f54617b280e26d1631811a43e7e968fa71e3e9"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:348bdd16b32556cf8d7257b17cf2bdb7ab7976af4af41ebe79f9796c218f7e91"}, + {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:479fd0844ddc3ca77e0fd99644c7fe2de8e8be1efcd57705b5c92e5186e8a250"}, + {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fdf5197a21dd660cf19dfd2a3ce79574588f8f5e2dbf21bda9ee2d2b46924d84"}, + {file = "orjson-3.10.7-cp310-none-win32.whl", hash = "sha256:d374d36726746c81a49f3ff8daa2898dccab6596864ebe43d50733275c629175"}, + {file = "orjson-3.10.7-cp310-none-win_amd64.whl", hash = "sha256:cb61938aec8b0ffb6eef484d480188a1777e67b05d58e41b435c74b9d84e0b9c"}, + {file = "orjson-3.10.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7db8539039698ddfb9a524b4dd19508256107568cdad24f3682d5773e60504a2"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:480f455222cb7a1dea35c57a67578848537d2602b46c464472c995297117fa09"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8a9c9b168b3a19e37fe2778c0003359f07822c90fdff8f98d9d2a91b3144d8e0"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8de062de550f63185e4c1c54151bdddfc5625e37daf0aa1e75d2a1293e3b7d9a"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b0dd04483499d1de9c8f6203f8975caf17a6000b9c0c54630cef02e44ee624e"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b58d3795dafa334fc8fd46f7c5dc013e6ad06fd5b9a4cc98cb1456e7d3558bd6"}, + {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33cfb96c24034a878d83d1a9415799a73dc77480e6c40417e5dda0710d559ee6"}, + {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e724cebe1fadc2b23c6f7415bad5ee6239e00a69f30ee423f319c6af70e2a5c0"}, + {file = "orjson-3.10.7-cp311-none-win32.whl", hash = "sha256:82763b46053727a7168d29c772ed5c870fdae2f61aa8a25994c7984a19b1021f"}, + {file = "orjson-3.10.7-cp311-none-win_amd64.whl", hash = "sha256:eb8d384a24778abf29afb8e41d68fdd9a156cf6e5390c04cc07bbc24b89e98b5"}, + {file = "orjson-3.10.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44a96f2d4c3af51bfac6bc4ef7b182aa33f2f054fd7f34cc0ee9a320d051d41f"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ac14cd57df0572453543f8f2575e2d01ae9e790c21f57627803f5e79b0d3c3"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bdbb61dcc365dd9be94e8f7df91975edc9364d6a78c8f7adb69c1cdff318ec93"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b48b3db6bb6e0a08fa8c83b47bc169623f801e5cc4f24442ab2b6617da3b5313"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23820a1563a1d386414fef15c249040042b8e5d07b40ab3fe3efbfbbcbcb8864"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c6a008e91d10a2564edbb6ee5069a9e66df3fbe11c9a005cb411f441fd2c09"}, + {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d352ee8ac1926d6193f602cbe36b1643bbd1bbcb25e3c1a657a4390f3000c9a5"}, + {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2d9f990623f15c0ae7ac608103c33dfe1486d2ed974ac3f40b693bad1a22a7b"}, + {file = "orjson-3.10.7-cp312-none-win32.whl", hash = "sha256:7c4c17f8157bd520cdb7195f75ddbd31671997cbe10aee559c2d613592e7d7eb"}, + {file = "orjson-3.10.7-cp312-none-win_amd64.whl", hash = "sha256:1d9c0e733e02ada3ed6098a10a8ee0052dd55774de3d9110d29868d24b17faa1"}, + {file = "orjson-3.10.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:77d325ed866876c0fa6492598ec01fe30e803272a6e8b10e992288b009cbe149"}, + {file = "orjson-3.10.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea2c232deedcb605e853ae1db2cc94f7390ac776743b699b50b071b02bea6fe"}, + {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3dcfbede6737fdbef3ce9c37af3fb6142e8e1ebc10336daa05872bfb1d87839c"}, + {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11748c135f281203f4ee695b7f80bb1358a82a63905f9f0b794769483ea854ad"}, + {file = "orjson-3.10.7-cp313-none-win32.whl", hash = "sha256:a7e19150d215c7a13f39eb787d84db274298d3f83d85463e61d277bbd7f401d2"}, + {file = "orjson-3.10.7-cp313-none-win_amd64.whl", hash = "sha256:eef44224729e9525d5261cc8d28d6b11cafc90e6bd0be2157bde69a52ec83024"}, + {file = "orjson-3.10.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6ea2b2258eff652c82652d5e0f02bd5e0463a6a52abb78e49ac288827aaa1469"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430ee4d85841e1483d487e7b81401785a5dfd69db5de01314538f31f8fbf7ee1"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b6146e439af4c2472c56f8540d799a67a81226e11992008cb47e1267a9b3225"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:084e537806b458911137f76097e53ce7bf5806dda33ddf6aaa66a028f8d43a23"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829cf2195838e3f93b70fd3b4292156fc5e097aac3739859ac0dcc722b27ac0"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1193b2416cbad1a769f868b1749535d5da47626ac29445803dae7cc64b3f5c98"}, + {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4e6c3da13e5a57e4b3dca2de059f243ebec705857522f188f0180ae88badd354"}, + {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c31008598424dfbe52ce8c5b47e0752dca918a4fdc4a2a32004efd9fab41d866"}, + {file = "orjson-3.10.7-cp38-none-win32.whl", hash = "sha256:7122a99831f9e7fe977dc45784d3b2edc821c172d545e6420c375e5a935f5a1c"}, + {file = "orjson-3.10.7-cp38-none-win_amd64.whl", hash = "sha256:a763bc0e58504cc803739e7df040685816145a6f3c8a589787084b54ebc9f16e"}, + {file = "orjson-3.10.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e76be12658a6fa376fcd331b1ea4e58f5a06fd0220653450f0d415b8fd0fbe20"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed350d6978d28b92939bfeb1a0570c523f6170efc3f0a0ef1f1df287cd4f4960"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:144888c76f8520e39bfa121b31fd637e18d4cc2f115727865fdf9fa325b10412"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09b2d92fd95ad2402188cf51573acde57eb269eddabaa60f69ea0d733e789fe9"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b24a579123fa884f3a3caadaed7b75eb5715ee2b17ab5c66ac97d29b18fe57f"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591bcfe7512353bd609875ab38050efe3d55e18934e2f18950c108334b4ff"}, + {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f4db56635b58cd1a200b0a23744ff44206ee6aa428185e2b6c4a65b3197abdcd"}, + {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0fa5886854673222618638c6df7718ea7fe2f3f2384c452c9ccedc70b4a510a5"}, + {file = "orjson-3.10.7-cp39-none-win32.whl", hash = "sha256:8272527d08450ab16eb405f47e0f4ef0e5ff5981c3d82afe0efd25dcbef2bcd2"}, + {file = "orjson-3.10.7-cp39-none-win_amd64.whl", hash = "sha256:974683d4618c0c7dbf4f69c95a979734bf183d0658611760017f6e70a145af58"}, + {file = "orjson-3.10.7.tar.gz", hash = "sha256:75ef0640403f945f3a1f9f6400686560dbfb0fb5b16589ad62cd477043c4eee3"}, ] [[package]] @@ -4900,61 +5006,79 @@ files = [ [[package]] name = "packaging" -version = "23.2" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] name = "paginate" -version = "0.5.6" +version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" files = [ - {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, + {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, + {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, ] +[package.extras] +dev = ["pytest", "tox"] +lint = ["black"] + [[package]] name = "pandas" -version = "2.2.2" +version = "2.2.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = true python-versions = ">=3.9" files = [ - {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, - {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, - {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, - {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, - {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, - {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, ] [package.dependencies] @@ -5043,97 +5167,97 @@ files = [ [package.dependencies] ptyprocess = ">=0.5" -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - [[package]] name = "pillow" -version = "10.3.0" +version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, - {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, - {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, - {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, - {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, - {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, - {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, - {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, - {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, - {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, - {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, - {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, - {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, - {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, - {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, - {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, - {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -5142,24 +5266,24 @@ xmp = ["defusedxml"] [[package]] name = "pip" -version = "24.0" +version = "24.2" description = "The PyPA recommended tool for installing Python packages." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pip-24.0-py3-none-any.whl", hash = "sha256:ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc"}, - {file = "pip-24.0.tar.gz", hash = "sha256:ea9bd1a847e8c5774a5777bb398c19e80bcd4e2aa16a4b301b718fe6f593aba2"}, + {file = "pip-24.2-py3-none-any.whl", hash = "sha256:2cd581cf58ab7fcfca4ce8efa6dcacd0de5bf8d0a3eb9ec927e07405f4d9e2a2"}, + {file = "pip-24.2.tar.gz", hash = "sha256:5b5e490b5e9cb275c879595064adce9ebd31b854e3e803740b72f9ccf34a45b8"}, ] [[package]] name = "pkginfo" -version = "1.11.0" +version = "1.11.2" description = "Query metadata from sdists / bdists / installed packages." optional = false python-versions = ">=3.8" files = [ - {file = "pkginfo-1.11.0-py3-none-any.whl", hash = "sha256:6d4998d1cd42c297af72cc0eab5f5bab1d356fb8a55b828fa914173f8bc1ba05"}, - {file = "pkginfo-1.11.0.tar.gz", hash = "sha256:dba885aa82e31e80d615119874384923f4e011c2a39b0c4b7104359e36cb7087"}, + {file = "pkginfo-1.11.2-py3-none-any.whl", hash = "sha256:9ec518eefccd159de7ed45386a6bb4c6ca5fa2cb3bd9b71154fae44f6f1b36a3"}, + {file = "pkginfo-1.11.2.tar.gz", hash = "sha256:c6bc916b8298d159e31f2c216e35ee5b86da7da18874f879798d0a1983537c86"}, ] [package.extras] @@ -5167,19 +5291,19 @@ testing = ["pytest", "pytest-cov", "wheel"] [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" @@ -5198,13 +5322,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "3.5.0" +version = "4.0.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"}, - {file = "pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"}, + {file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"}, + {file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"}, ] [package.dependencies] @@ -5216,13 +5340,13 @@ virtualenv = ">=20.10.0" [[package]] name = "prometheus-client" -version = "0.20.0" +version = "0.21.0" description = "Python client for the Prometheus monitoring system." optional = true python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, - {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, + {file = "prometheus_client-0.21.0-py3-none-any.whl", hash = "sha256:4fa6b4dd0ac16d58bb587c04b1caae65b8c5043e85f778f42f5f632f6af2e166"}, + {file = "prometheus_client-0.21.0.tar.gz", hash = "sha256:96c83c606b71ff2b0a433c98889d275f51ffec6c5e267de37c7a2b5c9aa9233e"}, ] [package.extras] @@ -5230,145 +5354,249 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.46" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.46-py3-none-any.whl", hash = "sha256:45abe60a8300f3c618b23c16c4bb98c6fc80af8ce8b17c7ae92db48db3ee63c1"}, - {file = "prompt_toolkit-3.0.46.tar.gz", hash = "sha256:869c50d682152336e23c4db7f74667639b5047494202ffe7670817053fd57795"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] wcwidth = "*" +[[package]] +name = "propcache" +version = "0.2.0" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.8" +files = [ + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, + {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, + {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, + {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, + {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, + {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, + {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, + {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, + {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, + {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, + {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, + {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, + {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, + {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, + {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, +] + [[package]] name = "protobuf" -version = "4.25.3" +version = "4.25.5" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, - {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, - {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, - {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, - {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, - {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, - {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, - {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, - {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, + {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, + {file = "protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea"}, + {file = "protobuf-4.25.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331"}, + {file = "protobuf-4.25.5-cp38-cp38-win32.whl", hash = "sha256:98d8d8aa50de6a2747efd9cceba361c9034050ecce3e09136f90de37ddba66e1"}, + {file = "protobuf-4.25.5-cp38-cp38-win_amd64.whl", hash = "sha256:b0234dd5a03049e4ddd94b93400b67803c823cfc405689688f59b34e0742381a"}, + {file = "protobuf-4.25.5-cp39-cp39-win32.whl", hash = "sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f"}, + {file = "protobuf-4.25.5-cp39-cp39-win_amd64.whl", hash = "sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45"}, + {file = "protobuf-4.25.5-py3-none-any.whl", hash = "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41"}, + {file = "protobuf-4.25.5.tar.gz", hash = "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584"}, ] [[package]] name = "psutil" -version = "5.9.8" +version = "6.1.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, - {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, - {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, - {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, - {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, - {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, - {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, - {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, - {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, - {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, ] [package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] [[package]] name = "psycopg2-binary" -version = "2.9.9" +version = "2.9.10" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, + {file = "psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0ea8e3d0ae83564f2fc554955d327fa081d065c8ca5cc6d2abb643e2c9c1200f"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:3e9c76f0ac6f92ecfc79516a8034a544926430f7b080ec5a0537bca389ee0906"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad26b467a405c798aaa1458ba09d7e2b6e5f96b1ce0ac15d82fd9f95dc38a92"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:270934a475a0e4b6925b5f804e3809dd5f90f8613621d062848dd82f9cd62007"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48b338f08d93e7be4ab2b5f1dbe69dc5e9ef07170fe1f86514422076d9c010d0"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4152f8f76d2023aac16285576a9ecd2b11a9895373a1f10fd9db54b3ff06b4"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32581b3020c72d7a421009ee1c6bf4a131ef5f0a968fab2e2de0c9d2bb4577f1"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2ce3e21dc3437b1d960521eca599d57408a695a0d3c26797ea0f72e834c7ffe5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e984839e75e0b60cfe75e351db53d6db750b00de45644c5d1f7ee5d1f34a1ce5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c4745a90b78e51d9ba06e2088a2fe0c693ae19cc8cb051ccda44e8df8a6eb53"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win32.whl", hash = "sha256:e5720a5d25e3b99cd0dc5c8a440570469ff82659bb09431c1439b92caf184d3b"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:3c18f74eb4386bf35e92ab2354a12c17e5eb4d9798e4c0ad3a00783eae7cd9f1"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:056470c3dc57904bbf63d6f534988bafc4e970ffd50f6271fc4ee7daad9498a5"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aa0e31fa4bb82578f3a6c74a73c273367727de397a7a0f07bd83cbea696baa"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8de718c0e1c4b982a54b41779667242bc630b2197948405b7bd8ce16bcecac92"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5c370b1e4975df846b0277b4deba86419ca77dbc25047f535b0bb03d1a544d44"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ffe8ed017e4ed70f68b7b371d84b7d4a790368db9203dfc2d222febd3a9c8863"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8aecc5e80c63f7459a1a2ab2c64df952051df196294d9f739933a9f6687e86b3"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:7a813c8bdbaaaab1f078014b9b0b13f5de757e2b5d9be6403639b298a04d218b"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00924255d7fc916ef66e4bf22f354a940c67179ad3fd7067d7a0a9c84d2fbfc"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7559bce4b505762d737172556a4e6ea8a9998ecac1e39b5233465093e8cee697"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8b58f0a96e7a1e341fc894f62c1177a7c83febebb5ff9123b579418fdc8a481"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b269105e59ac96aba877c1707c600ae55711d9dcd3fc4b5012e4af68e30c648"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:79625966e176dc97ddabc142351e0409e28acf4660b88d1cf6adb876d20c490d"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8aabf1c1a04584c168984ac678a668094d831f152859d06e055288fa515e4d30"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:19721ac03892001ee8fdd11507e6a2e01f4e37014def96379411ca99d78aeb2c"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7f5d859928e635fa3ce3477704acee0f667b3a3d3e4bb109f2b18d4005f38287"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win32.whl", hash = "sha256:3216ccf953b3f267691c90c6fe742e45d890d8272326b4a8b20850a03d05b7b8"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5"}, ] [[package]] @@ -5384,13 +5612,13 @@ files = [ [[package]] name = "pure-eval" -version = "0.2.2" +version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, ] [package.extras] @@ -5449,24 +5677,24 @@ test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] [[package]] name = "pyasn1" -version = "0.6.0" +version = "0.6.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = true python-versions = ">=3.8" files = [ - {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, - {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, ] [[package]] name = "pyasn1-modules" -version = "0.4.0" +version = "0.4.1" description = "A collection of ASN.1-based protocols modules" optional = true python-versions = ">=3.8" files = [ - {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, - {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, + {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, + {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, ] [package.dependencies] @@ -5485,109 +5713,123 @@ files = [ [[package]] name = "pydantic" -version = "2.7.3" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.3-py3-none-any.whl", hash = "sha256:ea91b002777bf643bb20dd717c028ec43216b24a6001a280f83877fd2655d0b4"}, - {file = "pydantic-2.7.3.tar.gz", hash = "sha256:c46c76a40bb1296728d7a8b99aa73dd70a48c3510111ff290034f860c99c419e"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.18.4" -typing-extensions = ">=4.6.1" +annotated-types = ">=0.6.0" +pydantic-core = "2.23.4" +typing-extensions = [ + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, +] [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.18.4" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, - {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, - {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, - {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, - {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, - {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, - {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, - {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, - {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, - {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, - {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, - {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, - {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, - {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -5653,30 +5895,30 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.8.0" +version = "2.9.0" description = "JSON Web Token implementation in Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, + {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, + {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, ] [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pymdown-extensions" -version = "10.8.1" +version = "10.11.2" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.8.1-py3-none-any.whl", hash = "sha256:f938326115884f48c6059c67377c46cf631c733ef3629b6eed1349989d1b30cb"}, - {file = "pymdown_extensions-10.8.1.tar.gz", hash = "sha256:3ab1db5c9e21728dabf75192d71471f8e50f216627e9a1fa9535ecb0231b9940"}, + {file = "pymdown_extensions-10.11.2-py3-none-any.whl", hash = "sha256:41cdde0a77290e480cf53892f5c5e50921a7ee3e5cd60ba91bf19837b33badcf"}, + {file = "pymdown_extensions-10.11.2.tar.gz", hash = "sha256:bc8847ecc9e784a098efd35e20cba772bc5a1b529dfcef9dc1972db9021a1049"}, ] [package.dependencies] @@ -5688,13 +5930,13 @@ extra = ["pygments (>=2.12)"] [[package]] name = "pyparsing" -version = "3.1.4" +version = "3.2.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = true -python-versions = ">=3.6.8" +python-versions = ">=3.9" files = [ - {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, - {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, ] [package.extras] @@ -5724,15 +5966,18 @@ files = [ [[package]] name = "pyreadline3" -version = "3.4.1" +version = "3.5.4" description = "A python implementation of GNU readline." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, - {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, + {file = "pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6"}, + {file = "pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7"}, ] +[package.extras] +dev = ["build", "flake8", "mypy", "pytest", "twine"] + [[package]] name = "pyright" version = "1.1.334" @@ -5867,122 +6112,128 @@ files = [ [[package]] name = "pytz" -version = "2024.1" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = true python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] name = "pywin32" -version = "306" +version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, ] [[package]] name = "pywin32-ctypes" -version = "0.2.2" +version = "0.2.3" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" optional = false python-versions = ">=3.6" files = [ - {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, - {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, + {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, + {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, ] [[package]] name = "pywinpty" -version = "2.0.13" +version = "2.0.14" description = "Pseudo terminal support for Windows from Python." optional = true python-versions = ">=3.8" files = [ - {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, - {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, - {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, - {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, - {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, - {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, + {file = "pywinpty-2.0.14-cp310-none-win_amd64.whl", hash = "sha256:0b149c2918c7974f575ba79f5a4aad58bd859a52fa9eb1296cc22aa412aa411f"}, + {file = "pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7"}, + {file = "pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737"}, + {file = "pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819"}, + {file = "pywinpty-2.0.14-cp39-none-win_amd64.whl", hash = "sha256:5725fd56f73c0531ec218663bd8c8ff5acc43c78962fab28564871b5fce053fd"}, + {file = "pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e"}, ] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -6001,159 +6252,138 @@ pyyaml = "*" [[package]] name = "pyzmq" -version = "26.0.3" +version = "26.2.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.7" files = [ - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, - {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, - {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, - {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, - {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, - {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, - {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, - {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, ] [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} -[[package]] -name = "qtconsole" -version = "5.5.2" -description = "Jupyter Qt console" -optional = true -python-versions = ">=3.8" -files = [ - {file = "qtconsole-5.5.2-py3-none-any.whl", hash = "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b"}, - {file = "qtconsole-5.5.2.tar.gz", hash = "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989"}, -] - -[package.dependencies] -ipykernel = ">=4.1" -jupyter-client = ">=4.1" -jupyter-core = "*" -packaging = "*" -pygments = "*" -pyzmq = ">=17.1" -qtpy = ">=2.4.0" -traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2" - -[package.extras] -doc = ["Sphinx (>=1.3)"] -test = ["flaky", "pytest", "pytest-qt"] - -[[package]] -name = "qtpy" -version = "2.4.1" -description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." -optional = true -python-versions = ">=3.7" -files = [ - {file = "QtPy-2.4.1-py3-none-any.whl", hash = "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b"}, - {file = "QtPy-2.4.1.tar.gz", hash = "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987"}, -] - -[package.dependencies] -packaging = "*" - -[package.extras] -test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] - [[package]] name = "readme-renderer" -version = "43.0" +version = "44.0" description = "readme_renderer is a library for rendering readme descriptions for Warehouse" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "readme_renderer-43.0-py3-none-any.whl", hash = "sha256:19db308d86ecd60e5affa3b2a98f017af384678c63c88e5d4556a380e674f3f9"}, - {file = "readme_renderer-43.0.tar.gz", hash = "sha256:1818dd28140813509eeed8d62687f7cd4f7bad90d4db586001c5dc09d4fde311"}, + {file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"}, + {file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"}, ] [package.dependencies] -docutils = ">=0.13.1" +docutils = ">=0.21.2" nh3 = ">=0.2.14" Pygments = ">=2.5.1" @@ -6162,21 +6392,21 @@ md = ["cmarkgfm (>=0.8.0)"] [[package]] name = "redis" -version = "5.0.4" +version = "5.1.1" description = "Python client for Redis database and key-value store" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "redis-5.0.4-py3-none-any.whl", hash = "sha256:7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91"}, - {file = "redis-5.0.4.tar.gz", hash = "sha256:ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61"}, + {file = "redis-5.1.1-py3-none-any.whl", hash = "sha256:f8ea06b7482a668c6475ae202ed8d9bcaa409f6e87fb77ed1043d912afd62e24"}, + {file = "redis-5.1.1.tar.gz", hash = "sha256:f6c997521fedbae53387307c5d0bf784d9acc28d9f1d058abeac566ec4dbed72"}, ] [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] -hiredis = ["hiredis (>=1.0.0)"] -ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] +hiredis = ["hiredis (>=3.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"] [[package]] name = "referencing" @@ -6382,128 +6612,133 @@ files = [ [[package]] name = "rich" -version = "13.7.1" +version = "13.9.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" files = [ - {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, - {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, + {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"}, + {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"}, ] [package.dependencies] markdown-it-py = ">=2.2.0" pygments = ">=2.13.0,<3.0.0" +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""} [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.18.1" +version = "0.20.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, - {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, - {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, - {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, - {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, - {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, - {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, - {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, - {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, - {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, - {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, - {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, - {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, + {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, + {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, + {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, + {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, + {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, + {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, + {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, + {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, + {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, + {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, + {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, + {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, + {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, ] [[package]] @@ -6533,39 +6768,40 @@ files = [ [[package]] name = "ruff" -version = "0.4.7" +version = "0.7.0" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e089371c67892a73b6bb1525608e89a2aca1b77b5440acf7a71dda5dac958f9e"}, - {file = "ruff-0.4.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:10f973d521d910e5f9c72ab27e409e839089f955be8a4c8826601a6323a89753"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59c3d110970001dfa494bcd95478e62286c751126dfb15c3c46e7915fc49694f"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa9773c6c00f4958f73b317bc0fd125295110c3776089f6ef318f4b775f0abe4"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07fc80bbb61e42b3b23b10fda6a2a0f5a067f810180a3760c5ef1b456c21b9db"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:fa4dafe3fe66d90e2e2b63fa1591dd6e3f090ca2128daa0be33db894e6c18648"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7c0083febdec17571455903b184a10026603a1de078428ba155e7ce9358c5f6"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad1b20e66a44057c326168437d680a2166c177c939346b19c0d6b08a62a37589"}, - {file = "ruff-0.4.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbf5d818553add7511c38b05532d94a407f499d1a76ebb0cad0374e32bc67202"}, - {file = "ruff-0.4.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:50e9651578b629baec3d1513b2534de0ac7ed7753e1382272b8d609997e27e83"}, - {file = "ruff-0.4.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8874a9df7766cb956b218a0a239e0a5d23d9e843e4da1e113ae1d27ee420877a"}, - {file = "ruff-0.4.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b9de9a6e49f7d529decd09381c0860c3f82fa0b0ea00ea78409b785d2308a567"}, - {file = "ruff-0.4.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:13a1768b0691619822ae6d446132dbdfd568b700ecd3652b20d4e8bc1e498f78"}, - {file = "ruff-0.4.7-py3-none-win32.whl", hash = "sha256:769e5a51df61e07e887b81e6f039e7ed3573316ab7dd9f635c5afaa310e4030e"}, - {file = "ruff-0.4.7-py3-none-win_amd64.whl", hash = "sha256:9e3ab684ad403a9ed1226894c32c3ab9c2e0718440f6f50c7c5829932bc9e054"}, - {file = "ruff-0.4.7-py3-none-win_arm64.whl", hash = "sha256:10f2204b9a613988e3484194c2c9e96a22079206b22b787605c255f130db5ed7"}, - {file = "ruff-0.4.7.tar.gz", hash = "sha256:2331d2b051dc77a289a653fcc6a42cce357087c5975738157cd966590b18b5e1"}, + {file = "ruff-0.7.0-py3-none-linux_armv6l.whl", hash = "sha256:0cdf20c2b6ff98e37df47b2b0bd3a34aaa155f59a11182c1303cce79be715628"}, + {file = "ruff-0.7.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:496494d350c7fdeb36ca4ef1c9f21d80d182423718782222c29b3e72b3512737"}, + {file = "ruff-0.7.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:214b88498684e20b6b2b8852c01d50f0651f3cc6118dfa113b4def9f14faaf06"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630fce3fefe9844e91ea5bbf7ceadab4f9981f42b704fae011bb8efcaf5d84be"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:211d877674e9373d4bb0f1c80f97a0201c61bcd1e9d045b6e9726adc42c156aa"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194d6c46c98c73949a106425ed40a576f52291c12bc21399eb8f13a0f7073495"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:82c2579b82b9973a110fab281860403b397c08c403de92de19568f32f7178598"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9af971fe85dcd5eaed8f585ddbc6bdbe8c217fb8fcf510ea6bca5bdfff56040e"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b641c7f16939b7d24b7bfc0be4102c56562a18281f84f635604e8a6989948914"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d71672336e46b34e0c90a790afeac8a31954fd42872c1f6adaea1dff76fd44f9"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ab7d98c7eed355166f367597e513a6c82408df4181a937628dbec79abb2a1fe4"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1eb54986f770f49edb14f71d33312d79e00e629a57387382200b1ef12d6a4ef9"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:dc452ba6f2bb9cf8726a84aa877061a2462afe9ae0ea1d411c53d226661c601d"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4b406c2dce5be9bad59f2de26139a86017a517e6bcd2688da515481c05a2cb11"}, + {file = "ruff-0.7.0-py3-none-win32.whl", hash = "sha256:f6c968509f767776f524a8430426539587d5ec5c662f6addb6aa25bc2e8195ec"}, + {file = "ruff-0.7.0-py3-none-win_amd64.whl", hash = "sha256:ff4aabfbaaba880e85d394603b9e75d32b0693152e16fa659a3064a85df7fce2"}, + {file = "ruff-0.7.0-py3-none-win_arm64.whl", hash = "sha256:10842f69c245e78d6adec7e1db0a7d9ddc2fff0621d730e61657b64fa36f207e"}, + {file = "ruff-0.7.0.tar.gz", hash = "sha256:47a86360cf62d9cd53ebfb0b5eb0e882193fc191c6d717e8bef4462bc3b9ea2b"}, ] [[package]] name = "s3transfer" -version = "0.10.2" +version = "0.10.3" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" files = [ - {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"}, - {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"}, + {file = "s3transfer-0.10.3-py3-none-any.whl", hash = "sha256:263ed587a5803c6c708d3ce44dc4dfedaab4c1a32e8329bab818933d79ddcf5d"}, + {file = "s3transfer-0.10.3.tar.gz", hash = "sha256:4f50ed74ab84d474ce614475e0b8d5047ff080810aac5d01ea25231cfc944b0c"}, ] [package.dependencies] @@ -6576,111 +6812,121 @@ crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] [[package]] name = "safetensors" -version = "0.4.3" +version = "0.4.5" description = "" optional = true python-versions = ">=3.7" files = [ - {file = "safetensors-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dcf5705cab159ce0130cd56057f5f3425023c407e170bca60b4868048bae64fd"}, - {file = "safetensors-0.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bb4f8c5d0358a31e9a08daeebb68f5e161cdd4018855426d3f0c23bb51087055"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a5319ef409e7f88686a46607cbc3c428271069d8b770076feaf913664a07ac"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb9c65bd82f9ef3ce4970dc19ee86be5f6f93d032159acf35e663c6bea02b237"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edb5698a7bc282089f64c96c477846950358a46ede85a1c040e0230344fdde10"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efcc860be094b8d19ac61b452ec635c7acb9afa77beb218b1d7784c6d41fe8ad"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d88b33980222085dd6001ae2cad87c6068e0991d4f5ccf44975d216db3b57376"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5fc6775529fb9f0ce2266edd3e5d3f10aab068e49f765e11f6f2a63b5367021d"}, - {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9c6ad011c1b4e3acff058d6b090f1da8e55a332fbf84695cf3100c649cc452d1"}, - {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c496c5401c1b9c46d41a7688e8ff5b0310a3b9bae31ce0f0ae870e1ea2b8caf"}, - {file = "safetensors-0.4.3-cp310-none-win32.whl", hash = "sha256:38e2a8666178224a51cca61d3cb4c88704f696eac8f72a49a598a93bbd8a4af9"}, - {file = "safetensors-0.4.3-cp310-none-win_amd64.whl", hash = "sha256:393e6e391467d1b2b829c77e47d726f3b9b93630e6a045b1d1fca67dc78bf632"}, - {file = "safetensors-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:22f3b5d65e440cec0de8edaa672efa888030802e11c09b3d6203bff60ebff05a"}, - {file = "safetensors-0.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c4fa560ebd4522adddb71dcd25d09bf211b5634003f015a4b815b7647d62ebe"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9afd5358719f1b2cf425fad638fc3c887997d6782da317096877e5b15b2ce93"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8c5093206ef4b198600ae484230402af6713dab1bd5b8e231905d754022bec7"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0b2104df1579d6ba9052c0ae0e3137c9698b2d85b0645507e6fd1813b70931a"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cf18888606dad030455d18f6c381720e57fc6a4170ee1966adb7ebc98d4d6a3"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bf4f9d6323d9f86eef5567eabd88f070691cf031d4c0df27a40d3b4aaee755b"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:585c9ae13a205807b63bef8a37994f30c917ff800ab8a1ca9c9b5d73024f97ee"}, - {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faefeb3b81bdfb4e5a55b9bbdf3d8d8753f65506e1d67d03f5c851a6c87150e9"}, - {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:befdf0167ad626f22f6aac6163477fcefa342224a22f11fdd05abb3995c1783c"}, - {file = "safetensors-0.4.3-cp311-none-win32.whl", hash = "sha256:a7cef55929dcbef24af3eb40bedec35d82c3c2fa46338bb13ecf3c5720af8a61"}, - {file = "safetensors-0.4.3-cp311-none-win_amd64.whl", hash = "sha256:840b7ac0eff5633e1d053cc9db12fdf56b566e9403b4950b2dc85393d9b88d67"}, - {file = "safetensors-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:22d21760dc6ebae42e9c058d75aa9907d9f35e38f896e3c69ba0e7b213033856"}, - {file = "safetensors-0.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d22c1a10dff3f64d0d68abb8298a3fd88ccff79f408a3e15b3e7f637ef5c980"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1648568667f820b8c48317c7006221dc40aced1869908c187f493838a1362bc"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:446e9fe52c051aeab12aac63d1017e0f68a02a92a027b901c4f8e931b24e5397"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fef5d70683643618244a4f5221053567ca3e77c2531e42ad48ae05fae909f542"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a1f4430cc0c9d6afa01214a4b3919d0a029637df8e09675ceef1ca3f0dfa0df"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d603846a8585b9432a0fd415db1d4c57c0f860eb4aea21f92559ff9902bae4d"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a844cdb5d7cbc22f5f16c7e2a0271170750763c4db08381b7f696dbd2c78a361"}, - {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:88887f69f7a00cf02b954cdc3034ffb383b2303bc0ab481d4716e2da51ddc10e"}, - {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ee463219d9ec6c2be1d331ab13a8e0cd50d2f32240a81d498266d77d07b7e71e"}, - {file = "safetensors-0.4.3-cp312-none-win32.whl", hash = "sha256:d0dd4a1db09db2dba0f94d15addc7e7cd3a7b0d393aa4c7518c39ae7374623c3"}, - {file = "safetensors-0.4.3-cp312-none-win_amd64.whl", hash = "sha256:d14d30c25897b2bf19b6fb5ff7e26cc40006ad53fd4a88244fdf26517d852dd7"}, - {file = "safetensors-0.4.3-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d1456f814655b224d4bf6e7915c51ce74e389b413be791203092b7ff78c936dd"}, - {file = "safetensors-0.4.3-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:455d538aa1aae4a8b279344a08136d3f16334247907b18a5c3c7fa88ef0d3c46"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf476bca34e1340ee3294ef13e2c625833f83d096cfdf69a5342475602004f95"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02ef3a24face643456020536591fbd3c717c5abaa2737ec428ccbbc86dffa7a4"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7de32d0d34b6623bb56ca278f90db081f85fb9c5d327e3c18fd23ac64f465768"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a0deb16a1d3ea90c244ceb42d2c6c276059616be21a19ac7101aa97da448faf"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c59d51f182c729f47e841510b70b967b0752039f79f1de23bcdd86462a9b09ee"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f598b713cc1a4eb31d3b3203557ac308acf21c8f41104cdd74bf640c6e538e3"}, - {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5757e4688f20df083e233b47de43845d1adb7e17b6cf7da5f8444416fc53828d"}, - {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fe746d03ed8d193674a26105e4f0fe6c726f5bb602ffc695b409eaf02f04763d"}, - {file = "safetensors-0.4.3-cp37-none-win32.whl", hash = "sha256:0d5ffc6a80f715c30af253e0e288ad1cd97a3d0086c9c87995e5093ebc075e50"}, - {file = "safetensors-0.4.3-cp37-none-win_amd64.whl", hash = "sha256:a11c374eb63a9c16c5ed146457241182f310902bd2a9c18255781bb832b6748b"}, - {file = "safetensors-0.4.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1e31be7945f66be23f4ec1682bb47faa3df34cb89fc68527de6554d3c4258a4"}, - {file = "safetensors-0.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:03a4447c784917c9bf01d8f2ac5080bc15c41692202cd5f406afba16629e84d6"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d244bcafeb1bc06d47cfee71727e775bca88a8efda77a13e7306aae3813fa7e4"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53c4879b9c6bd7cd25d114ee0ef95420e2812e676314300624594940a8d6a91f"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74707624b81f1b7f2b93f5619d4a9f00934d5948005a03f2c1845ffbfff42212"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d52c958dc210265157573f81d34adf54e255bc2b59ded6218500c9b15a750eb"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f9568f380f513a60139971169c4a358b8731509cc19112369902eddb33faa4d"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d9cd8e1560dfc514b6d7859247dc6a86ad2f83151a62c577428d5102d872721"}, - {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:89f9f17b0dacb913ed87d57afbc8aad85ea42c1085bd5de2f20d83d13e9fc4b2"}, - {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1139eb436fd201c133d03c81209d39ac57e129f5e74e34bb9ab60f8d9b726270"}, - {file = "safetensors-0.4.3-cp38-none-win32.whl", hash = "sha256:d9c289f140a9ae4853fc2236a2ffc9a9f2d5eae0cb673167e0f1b8c18c0961ac"}, - {file = "safetensors-0.4.3-cp38-none-win_amd64.whl", hash = "sha256:622afd28968ef3e9786562d352659a37de4481a4070f4ebac883f98c5836563e"}, - {file = "safetensors-0.4.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8651c7299cbd8b4161a36cd6a322fa07d39cd23535b144d02f1c1972d0c62f3c"}, - {file = "safetensors-0.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e375d975159ac534c7161269de24ddcd490df2157b55c1a6eeace6cbb56903f0"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084fc436e317f83f7071fc6a62ca1c513b2103db325cd09952914b50f51cf78f"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41a727a7f5e6ad9f1db6951adee21bbdadc632363d79dc434876369a17de6ad6"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7dbbde64b6c534548696808a0e01276d28ea5773bc9a2dfb97a88cd3dffe3df"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbae3b4b9d997971431c346edbfe6e41e98424a097860ee872721e176040a893"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01e4b22e3284cd866edeabe4f4d896229495da457229408d2e1e4810c5187121"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dd37306546b58d3043eb044c8103a02792cc024b51d1dd16bd3dd1f334cb3ed"}, - {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8815b5e1dac85fc534a97fd339e12404db557878c090f90442247e87c8aeaea"}, - {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e011cc162503c19f4b1fd63dfcddf73739c7a243a17dac09b78e57a00983ab35"}, - {file = "safetensors-0.4.3-cp39-none-win32.whl", hash = "sha256:01feb3089e5932d7e662eda77c3ecc389f97c0883c4a12b5cfdc32b589a811c3"}, - {file = "safetensors-0.4.3-cp39-none-win_amd64.whl", hash = "sha256:3f9cdca09052f585e62328c1c2923c70f46814715c795be65f0b93f57ec98a02"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1b89381517891a7bb7d1405d828b2bf5d75528299f8231e9346b8eba092227f9"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cd6fff9e56df398abc5866b19a32124815b656613c1c5ec0f9350906fd798aac"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:840caf38d86aa7014fe37ade5d0d84e23dcfbc798b8078015831996ecbc206a3"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9650713b2cfa9537a2baf7dd9fee458b24a0aaaa6cafcea8bdd5fb2b8efdc34"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e4119532cd10dba04b423e0f86aecb96cfa5a602238c0aa012f70c3a40c44b50"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e066e8861eef6387b7c772344d1fe1f9a72800e04ee9a54239d460c400c72aab"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:90964917f5b0fa0fa07e9a051fbef100250c04d150b7026ccbf87a34a54012e0"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c41e1893d1206aa7054029681778d9a58b3529d4c807002c156d58426c225173"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae7613a119a71a497d012ccc83775c308b9c1dab454806291427f84397d852fd"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9bac020faba7f5dc481e881b14b6425265feabb5bfc552551d21189c0eddc3"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:420a98f593ff9930f5822560d14c395ccbc57342ddff3b463bc0b3d6b1951550"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f5e6883af9a68c0028f70a4c19d5a6ab6238a379be36ad300a22318316c00cb0"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:cdd0a3b5da66e7f377474599814dbf5cbf135ff059cc73694de129b58a5e8a2c"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9bfb92f82574d9e58401d79c70c716985dc049b635fef6eecbb024c79b2c46ad"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3615a96dd2dcc30eb66d82bc76cda2565f4f7bfa89fcb0e31ba3cea8a1a9ecbb"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:868ad1b6fc41209ab6bd12f63923e8baeb1a086814cb2e81a65ed3d497e0cf8f"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffba80aa49bd09195145a7fd233a7781173b422eeb995096f2b30591639517"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0acbe31340ab150423347e5b9cc595867d814244ac14218932a5cf1dd38eb39"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19bbdf95de2cf64f25cd614c5236c8b06eb2cfa47cbf64311f4b5d80224623a3"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b852e47eb08475c2c1bd8131207b405793bfc20d6f45aff893d3baaad449ed14"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d07cbca5b99babb692d76d8151bec46f461f8ad8daafbfd96b2fca40cadae65"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1ab6527a20586d94291c96e00a668fa03f86189b8a9defa2cdd34a1a01acc7d5"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02318f01e332cc23ffb4f6716e05a492c5f18b1d13e343c49265149396284a44"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec4b52ce9a396260eb9731eb6aea41a7320de22ed73a1042c2230af0212758ce"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:018b691383026a2436a22b648873ed11444a364324e7088b99cd2503dd828400"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:309b10dbcab63269ecbf0e2ca10ce59223bb756ca5d431ce9c9eeabd446569da"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b277482120df46e27a58082df06a15aebda4481e30a1c21eefd0921ae7e03f65"}, - {file = "safetensors-0.4.3.tar.gz", hash = "sha256:2f85fc50c4e07a21e95c24e07460fe6f7e2859d0ce88092838352b798ce711c2"}, + {file = "safetensors-0.4.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a63eaccd22243c67e4f2b1c3e258b257effc4acd78f3b9d397edc8cf8f1298a7"}, + {file = "safetensors-0.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:23fc9b4ec7b602915cbb4ec1a7c1ad96d2743c322f20ab709e2c35d1b66dad27"}, + {file = "safetensors-0.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6885016f34bef80ea1085b7e99b3c1f92cb1be78a49839203060f67b40aee761"}, + {file = "safetensors-0.4.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:133620f443450429322f238fda74d512c4008621227fccf2f8cf4a76206fea7c"}, + {file = "safetensors-0.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4fb3e0609ec12d2a77e882f07cced530b8262027f64b75d399f1504ffec0ba56"}, + {file = "safetensors-0.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0f1dd769f064adc33831f5e97ad07babbd728427f98e3e1db6902e369122737"}, + {file = "safetensors-0.4.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6d156bdb26732feada84f9388a9f135528c1ef5b05fae153da365ad4319c4c5"}, + {file = "safetensors-0.4.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e347d77e2c77eb7624400ccd09bed69d35c0332f417ce8c048d404a096c593b"}, + {file = "safetensors-0.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9f556eea3aec1d3d955403159fe2123ddd68e880f83954ee9b4a3f2e15e716b6"}, + {file = "safetensors-0.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9483f42be3b6bc8ff77dd67302de8ae411c4db39f7224dec66b0eb95822e4163"}, + {file = "safetensors-0.4.5-cp310-none-win32.whl", hash = "sha256:7389129c03fadd1ccc37fd1ebbc773f2b031483b04700923c3511d2a939252cc"}, + {file = "safetensors-0.4.5-cp310-none-win_amd64.whl", hash = "sha256:e98ef5524f8b6620c8cdef97220c0b6a5c1cef69852fcd2f174bb96c2bb316b1"}, + {file = "safetensors-0.4.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:21f848d7aebd5954f92538552d6d75f7c1b4500f51664078b5b49720d180e47c"}, + {file = "safetensors-0.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb07000b19d41e35eecef9a454f31a8b4718a185293f0d0b1c4b61d6e4487971"}, + {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09dedf7c2fda934ee68143202acff6e9e8eb0ddeeb4cfc24182bef999efa9f42"}, + {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:59b77e4b7a708988d84f26de3ebead61ef1659c73dcbc9946c18f3b1786d2688"}, + {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d3bc83e14d67adc2e9387e511097f254bd1b43c3020440e708858c684cbac68"}, + {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39371fc551c1072976073ab258c3119395294cf49cdc1f8476794627de3130df"}, + {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6c19feda32b931cae0acd42748a670bdf56bee6476a046af20181ad3fee4090"}, + {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a659467495de201e2f282063808a41170448c78bada1e62707b07a27b05e6943"}, + {file = "safetensors-0.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bad5e4b2476949bcd638a89f71b6916fa9a5cae5c1ae7eede337aca2100435c0"}, + {file = "safetensors-0.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a3a315a6d0054bc6889a17f5668a73f94f7fe55121ff59e0a199e3519c08565f"}, + {file = "safetensors-0.4.5-cp311-none-win32.whl", hash = "sha256:a01e232e6d3d5cf8b1667bc3b657a77bdab73f0743c26c1d3c5dd7ce86bd3a92"}, + {file = "safetensors-0.4.5-cp311-none-win_amd64.whl", hash = "sha256:cbd39cae1ad3e3ef6f63a6f07296b080c951f24cec60188378e43d3713000c04"}, + {file = "safetensors-0.4.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:473300314e026bd1043cef391bb16a8689453363381561b8a3e443870937cc1e"}, + {file = "safetensors-0.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:801183a0f76dc647f51a2d9141ad341f9665602a7899a693207a82fb102cc53e"}, + {file = "safetensors-0.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1524b54246e422ad6fb6aea1ac71edeeb77666efa67230e1faf6999df9b2e27f"}, + {file = "safetensors-0.4.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b3139098e3e8b2ad7afbca96d30ad29157b50c90861084e69fcb80dec7430461"}, + {file = "safetensors-0.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65573dc35be9059770808e276b017256fa30058802c29e1038eb1c00028502ea"}, + {file = "safetensors-0.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd33da8e9407559f8779c82a0448e2133737f922d71f884da27184549416bfed"}, + {file = "safetensors-0.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3685ce7ed036f916316b567152482b7e959dc754fcc4a8342333d222e05f407c"}, + {file = "safetensors-0.4.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dde2bf390d25f67908278d6f5d59e46211ef98e44108727084d4637ee70ab4f1"}, + {file = "safetensors-0.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7469d70d3de970b1698d47c11ebbf296a308702cbaae7fcb993944751cf985f4"}, + {file = "safetensors-0.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a6ba28118636a130ccbb968bc33d4684c48678695dba2590169d5ab03a45646"}, + {file = "safetensors-0.4.5-cp312-none-win32.whl", hash = "sha256:c859c7ed90b0047f58ee27751c8e56951452ed36a67afee1b0a87847d065eec6"}, + {file = "safetensors-0.4.5-cp312-none-win_amd64.whl", hash = "sha256:b5a8810ad6a6f933fff6c276eae92c1da217b39b4d8b1bc1c0b8af2d270dc532"}, + {file = "safetensors-0.4.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:25e5f8e2e92a74f05b4ca55686234c32aac19927903792b30ee6d7bd5653d54e"}, + {file = "safetensors-0.4.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:81efb124b58af39fcd684254c645e35692fea81c51627259cdf6d67ff4458916"}, + {file = "safetensors-0.4.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:585f1703a518b437f5103aa9cf70e9bd437cb78eea9c51024329e4fb8a3e3679"}, + {file = "safetensors-0.4.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b99fbf72e3faf0b2f5f16e5e3458b93b7d0a83984fe8d5364c60aa169f2da89"}, + {file = "safetensors-0.4.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b17b299ca9966ca983ecda1c0791a3f07f9ca6ab5ded8ef3d283fff45f6bcd5f"}, + {file = "safetensors-0.4.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76ded72f69209c9780fdb23ea89e56d35c54ae6abcdec67ccb22af8e696e449a"}, + {file = "safetensors-0.4.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2783956926303dcfeb1de91a4d1204cd4089ab441e622e7caee0642281109db3"}, + {file = "safetensors-0.4.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d94581aab8c6b204def4d7320f07534d6ee34cd4855688004a4354e63b639a35"}, + {file = "safetensors-0.4.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:67e1e7cb8678bb1b37ac48ec0df04faf689e2f4e9e81e566b5c63d9f23748523"}, + {file = "safetensors-0.4.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:dbd280b07e6054ea68b0cb4b16ad9703e7d63cd6890f577cb98acc5354780142"}, + {file = "safetensors-0.4.5-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:77d9b228da8374c7262046a36c1f656ba32a93df6cc51cd4453af932011e77f1"}, + {file = "safetensors-0.4.5-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:500cac01d50b301ab7bb192353317035011c5ceeef0fca652f9f43c000bb7f8d"}, + {file = "safetensors-0.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75331c0c746f03158ded32465b7d0b0e24c5a22121743662a2393439c43a45cf"}, + {file = "safetensors-0.4.5-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670e95fe34e0d591d0529e5e59fd9d3d72bc77b1444fcaa14dccda4f36b5a38b"}, + {file = "safetensors-0.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:098923e2574ff237c517d6e840acada8e5b311cb1fa226019105ed82e9c3b62f"}, + {file = "safetensors-0.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13ca0902d2648775089fa6a0c8fc9e6390c5f8ee576517d33f9261656f851e3f"}, + {file = "safetensors-0.4.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f0032bedc869c56f8d26259fe39cd21c5199cd57f2228d817a0e23e8370af25"}, + {file = "safetensors-0.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4b15f51b4f8f2a512341d9ce3475cacc19c5fdfc5db1f0e19449e75f95c7dc8"}, + {file = "safetensors-0.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f6594d130d0ad933d885c6a7b75c5183cb0e8450f799b80a39eae2b8508955eb"}, + {file = "safetensors-0.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:60c828a27e852ded2c85fc0f87bf1ec20e464c5cd4d56ff0e0711855cc2e17f8"}, + {file = "safetensors-0.4.5-cp37-none-win32.whl", hash = "sha256:6d3de65718b86c3eeaa8b73a9c3d123f9307a96bbd7be9698e21e76a56443af5"}, + {file = "safetensors-0.4.5-cp37-none-win_amd64.whl", hash = "sha256:5a2d68a523a4cefd791156a4174189a4114cf0bf9c50ceb89f261600f3b2b81a"}, + {file = "safetensors-0.4.5-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:e7a97058f96340850da0601a3309f3d29d6191b0702b2da201e54c6e3e44ccf0"}, + {file = "safetensors-0.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:63bfd425e25f5c733f572e2246e08a1c38bd6f2e027d3f7c87e2e43f228d1345"}, + {file = "safetensors-0.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3664ac565d0e809b0b929dae7ccd74e4d3273cd0c6d1220c6430035befb678e"}, + {file = "safetensors-0.4.5-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:313514b0b9b73ff4ddfb4edd71860696dbe3c1c9dc4d5cc13dbd74da283d2cbf"}, + {file = "safetensors-0.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31fa33ee326f750a2f2134a6174773c281d9a266ccd000bd4686d8021f1f3dac"}, + {file = "safetensors-0.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09566792588d77b68abe53754c9f1308fadd35c9f87be939e22c623eaacbed6b"}, + {file = "safetensors-0.4.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309aaec9b66cbf07ad3a2e5cb8a03205663324fea024ba391594423d0f00d9fe"}, + {file = "safetensors-0.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:53946c5813b8f9e26103c5efff4a931cc45d874f45229edd68557ffb35ffb9f8"}, + {file = "safetensors-0.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:868f9df9e99ad1e7f38c52194063a982bc88fedc7d05096f4f8160403aaf4bd6"}, + {file = "safetensors-0.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9cc9449bd0b0bc538bd5e268221f0c5590bc5c14c1934a6ae359d44410dc68c4"}, + {file = "safetensors-0.4.5-cp38-none-win32.whl", hash = "sha256:83c4f13a9e687335c3928f615cd63a37e3f8ef072a3f2a0599fa09f863fb06a2"}, + {file = "safetensors-0.4.5-cp38-none-win_amd64.whl", hash = "sha256:b98d40a2ffa560653f6274e15b27b3544e8e3713a44627ce268f419f35c49478"}, + {file = "safetensors-0.4.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cf727bb1281d66699bef5683b04d98c894a2803442c490a8d45cd365abfbdeb2"}, + {file = "safetensors-0.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96f1d038c827cdc552d97e71f522e1049fef0542be575421f7684756a748e457"}, + {file = "safetensors-0.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:139fbee92570ecea774e6344fee908907db79646d00b12c535f66bc78bd5ea2c"}, + {file = "safetensors-0.4.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c36302c1c69eebb383775a89645a32b9d266878fab619819ce660309d6176c9b"}, + {file = "safetensors-0.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d641f5b8149ea98deb5ffcf604d764aad1de38a8285f86771ce1abf8e74c4891"}, + {file = "safetensors-0.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b4db6a61d968de73722b858038c616a1bebd4a86abe2688e46ca0cc2d17558f2"}, + {file = "safetensors-0.4.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b75a616e02f21b6f1d5785b20cecbab5e2bd3f6358a90e8925b813d557666ec1"}, + {file = "safetensors-0.4.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:788ee7d04cc0e0e7f944c52ff05f52a4415b312f5efd2ee66389fb7685ee030c"}, + {file = "safetensors-0.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:87bc42bd04fd9ca31396d3ca0433db0be1411b6b53ac5a32b7845a85d01ffc2e"}, + {file = "safetensors-0.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4037676c86365a721a8c9510323a51861d703b399b78a6b4486a54a65a975fca"}, + {file = "safetensors-0.4.5-cp39-none-win32.whl", hash = "sha256:1500418454529d0ed5c1564bda376c4ddff43f30fce9517d9bee7bcce5a8ef50"}, + {file = "safetensors-0.4.5-cp39-none-win_amd64.whl", hash = "sha256:9d1a94b9d793ed8fe35ab6d5cea28d540a46559bafc6aae98f30ee0867000cab"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fdadf66b5a22ceb645d5435a0be7a0292ce59648ca1d46b352f13cff3ea80410"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d42ffd4c2259f31832cb17ff866c111684c87bd930892a1ba53fed28370c918c"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd8a1f6d2063a92cd04145c7fd9e31a1c7d85fbec20113a14b487563fdbc0597"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:951d2fcf1817f4fb0ef0b48f6696688a4e852a95922a042b3f96aaa67eedc920"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ac85d9a8c1af0e3132371d9f2d134695a06a96993c2e2f0bbe25debb9e3f67a"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e3cec4a29eb7fe8da0b1c7988bc3828183080439dd559f720414450de076fcab"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:21742b391b859e67b26c0b2ac37f52c9c0944a879a25ad2f9f9f3cd61e7fda8f"}, + {file = "safetensors-0.4.5-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c7db3006a4915151ce1913652e907cdede299b974641a83fbc092102ac41b644"}, + {file = "safetensors-0.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f68bf99ea970960a237f416ea394e266e0361895753df06e3e06e6ea7907d98b"}, + {file = "safetensors-0.4.5-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8158938cf3324172df024da511839d373c40fbfaa83e9abf467174b2910d7b4c"}, + {file = "safetensors-0.4.5-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:540ce6c4bf6b58cb0fd93fa5f143bc0ee341c93bb4f9287ccd92cf898cc1b0dd"}, + {file = "safetensors-0.4.5-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bfeaa1a699c6b9ed514bd15e6a91e74738b71125a9292159e3d6b7f0a53d2cde"}, + {file = "safetensors-0.4.5-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:01c8f00da537af711979e1b42a69a8ec9e1d7112f208e0e9b8a35d2c381085ef"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a0dd565f83b30f2ca79b5d35748d0d99dd4b3454f80e03dfb41f0038e3bdf180"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:023b6e5facda76989f4cba95a861b7e656b87e225f61811065d5c501f78cdb3f"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9633b663393d5796f0b60249549371e392b75a0b955c07e9c6f8708a87fc841f"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78dd8adfb48716233c45f676d6e48534d34b4bceb50162c13d1f0bdf6f78590a"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e8deb16c4321d61ae72533b8451ec4a9af8656d1c61ff81aa49f966406e4b68"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:52452fa5999dc50c4decaf0c53aa28371f7f1e0fe5c2dd9129059fbe1e1599c7"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d5f23198821e227cfc52d50fa989813513db381255c6d100927b012f0cfec63d"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f4beb84b6073b1247a773141a6331117e35d07134b3bb0383003f39971d414bb"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:68814d599d25ed2fdd045ed54d370d1d03cf35e02dce56de44c651f828fb9b7b"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0b6453c54c57c1781292c46593f8a37254b8b99004c68d6c3ce229688931a22"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adaa9c6dead67e2dd90d634f89131e43162012479d86e25618e821a03d1eb1dc"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73e7d408e9012cd17511b382b43547850969c7979efc2bc353f317abaf23c84c"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:775409ce0fcc58b10773fdb4221ed1eb007de10fe7adbdf8f5e8a56096b6f0bc"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:834001bed193e4440c4a3950a31059523ee5090605c907c66808664c932b549c"}, + {file = "safetensors-0.4.5.tar.gz", hash = "sha256:d73de19682deabb02524b3d5d1f8b3aaba94c72f1bbfc7911b9b9d5d391c0310"}, ] [package.extras] @@ -6698,32 +6944,37 @@ torch = ["safetensors[numpy]", "torch (>=1.10)"] [[package]] name = "scikit-learn" -version = "1.5.1" +version = "1.5.2" description = "A set of python modules for machine learning and data mining" optional = true python-versions = ">=3.9" files = [ - {file = "scikit_learn-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:781586c414f8cc58e71da4f3d7af311e0505a683e112f2f62919e3019abd3745"}, - {file = "scikit_learn-1.5.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5b213bc29cc30a89a3130393b0e39c847a15d769d6e59539cd86b75d276b1a7"}, - {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ff4ba34c2abff5ec59c803ed1d97d61b036f659a17f55be102679e88f926fac"}, - {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:161808750c267b77b4a9603cf9c93579c7a74ba8486b1336034c2f1579546d21"}, - {file = "scikit_learn-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:10e49170691514a94bb2e03787aa921b82dbc507a4ea1f20fd95557862c98dc1"}, - {file = "scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2"}, - {file = "scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe"}, - {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4"}, - {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf"}, - {file = "scikit_learn-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b"}, - {file = "scikit_learn-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5944ce1faada31c55fb2ba20a5346b88e36811aab504ccafb9f0339e9f780395"}, - {file = "scikit_learn-1.5.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0828673c5b520e879f2af6a9e99eee0eefea69a2188be1ca68a6121b809055c1"}, - {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508907e5f81390e16d754e8815f7497e52139162fd69c4fdbd2dfa5d6cc88915"}, - {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97625f217c5c0c5d0505fa2af28ae424bd37949bb2f16ace3ff5f2f81fb4498b"}, - {file = "scikit_learn-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:da3f404e9e284d2b0a157e1b56b6566a34eb2798205cba35a211df3296ab7a74"}, - {file = "scikit_learn-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88e0672c7ac21eb149d409c74cc29f1d611d5158175846e7a9c2427bd12b3956"}, - {file = "scikit_learn-1.5.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b073a27797a283187a4ef4ee149959defc350b46cbf63a84d8514fe16b69855"}, - {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b59e3e62d2be870e5c74af4e793293753565c7383ae82943b83383fdcf5cc5c1"}, - {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd8d3a19d4bd6dc5a7d4f358c8c3a60934dc058f363c34c0ac1e9e12a31421d"}, - {file = "scikit_learn-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f57428de0c900a98389c4a433d4a3cf89de979b3aa24d1c1d251802aa15e44d"}, - {file = "scikit_learn-1.5.1.tar.gz", hash = "sha256:0ea5d40c0e3951df445721927448755d3fe1d80833b0b7308ebff5d2a45e6414"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c412ccc2ad9bf3755915e3908e677b367ebc8d010acbb3f182814524f2e5540"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a686885a4b3818d9e62904d91b57fa757fc2bed3e465c8b177be652f4dd37c8"}, + {file = "scikit_learn-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:c15b1ca23d7c5f33cc2cb0a0d6aaacf893792271cddff0edbd6a40e8319bc113"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1"}, + {file = "scikit_learn-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, + {file = "scikit_learn-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9a702e2de732bbb20d3bad29ebd77fc05a6b427dc49964300340e4c9328b3f5"}, + {file = "scikit_learn-1.5.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:b0768ad641981f5d3a198430a1d31c3e044ed2e8a6f22166b4d546a5116d7908"}, + {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178ddd0a5cb0044464fc1bfc4cca5b1833bfc7bb022d70b05db8530da4bb3dd3"}, + {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7284ade780084d94505632241bf78c44ab3b6f1e8ccab3d2af58e0e950f9c12"}, + {file = "scikit_learn-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:b7b0f9a0b1040830d38c39b91b3a44e1b643f4b36e36567b80b7c6bd2202a27f"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca64b3089a6d9b9363cd3546f8978229dcbb737aceb2c12144ee3f70f95684b7"}, + {file = "scikit_learn-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:3bed4909ba187aca80580fe2ef370d9180dcf18e621a27c4cf2ef10d279a7efe"}, + {file = "scikit_learn-1.5.2.tar.gz", hash = "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d"}, ] [package.dependencies] @@ -6735,11 +6986,11 @@ threadpoolctl = ">=3.1.0" [package.extras] benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] maintenance = ["conda-lock (==2.5.6)"] -tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -6827,18 +7078,23 @@ win32 = ["pywin32"] [[package]] name = "setuptools" -version = "70.0.0" +version = "75.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, - {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, + {file = "setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8"}, + {file = "setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] [[package]] name = "shellingham" @@ -6897,93 +7153,97 @@ files = [ [[package]] name = "soupsieve" -version = "2.5" +version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] [[package]] name = "sphinx" -version = "7.1.2" +version = "7.4.7" description = "Python documentation generator" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinx-7.1.2-py3-none-any.whl", hash = "sha256:d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe"}, - {file = "sphinx-7.1.2.tar.gz", hash = "sha256:780f4d32f1d7d1126576e0e5ecc19dc32ab76cd24e950228dcf7b1f6d3d9e22f"}, + {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"}, + {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"}, ] [package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=2.9" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.18.1,<0.21" +alabaster = ">=0.7.14,<0.8.0" +babel = ">=2.13" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +docutils = ">=0.20,<0.22" imagesize = ">=1.3" -importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} -Jinja2 = ">=3.0" -packaging = ">=21.0" -Pygments = ">=2.13" -requests = ">=2.25.0" -snowballstemmer = ">=2.0" +importlib-metadata = {version = ">=6.0", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.1" +packaging = ">=23.0" +Pygments = ">=2.17" +requests = ">=2.30.0" +snowballstemmer = ">=2.2" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" +sphinxcontrib-serializinghtml = ">=1.1.9" +tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] -test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] +lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.4" +version = "2.0.0" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, - {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, + {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, + {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +version = "2.0.0" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = true -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, + {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, + {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.1" +version = "2.1.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, - {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, + {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, + {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] [[package]] @@ -7002,94 +7262,104 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +version = "2.0.0" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = true -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, + {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, + {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["defusedxml (>=0.7.1)", "pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +version = "2.0.0" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = true -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, + {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, + {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sqlalchemy" -version = "2.0.30" +version = "2.0.36" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, - {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, - {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, -] - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:be9812b766cad94a25bc63bec11f88c4ad3629a0cec1cd5d4ba48dc23860486b"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aae840ebbd6cdd41af1c14590e5741665e5272d2fee999306673a1bb1fdb4d"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4557e1f11c5f653ebfdd924f3f9d5ebfc718283b0b9beebaa5dd6b77ec290971"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07b441f7d03b9a66299ce7ccf3ef2900abc81c0db434f42a5694a37bd73870f2"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:28120ef39c92c2dd60f2721af9328479516844c6b550b077ca450c7d7dc68575"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-win32.whl", hash = "sha256:b81ee3d84803fd42d0b154cb6892ae57ea6b7c55d8359a02379965706c7efe6c"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-win_amd64.whl", hash = "sha256:f942a799516184c855e1a32fbc7b29d7e571b52612647866d4ec1c3242578fcb"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3d6718667da04294d7df1670d70eeddd414f313738d20a6f1d1f379e3139a545"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:72c28b84b174ce8af8504ca28ae9347d317f9dba3999e5981a3cd441f3712e24"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b11d0cfdd2b095e7b0686cf5fabeb9c67fae5b06d265d8180715b8cfa86522e3"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e32092c47011d113dc01ab3e1d3ce9f006a47223b18422c5c0d150af13a00687"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6a440293d802d3011028e14e4226da1434b373cbaf4a4bbb63f845761a708346"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c54a1e53a0c308a8e8a7dffb59097bff7facda27c70c286f005327f21b2bd6b1"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-win32.whl", hash = "sha256:1e0d612a17581b6616ff03c8e3d5eff7452f34655c901f75d62bd86449d9750e"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-win_amd64.whl", hash = "sha256:8958b10490125124463095bbdadda5aa22ec799f91958e410438ad6c97a7b793"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc022184d3e5cacc9579e41805a681187650e170eb2fd70e28b86192a479dcaa"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b817d41d692bf286abc181f8af476c4fbef3fd05e798777492618378448ee689"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e46a888b54be23d03a89be510f24a7652fe6ff660787b96cd0e57a4ebcb46d"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ae3005ed83f5967f961fd091f2f8c5329161f69ce8480aa8168b2d7fe37f06"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3dbb986bad3ed5ceaf090200eba750b5245150bd97d3e67343a3cfed06feecf7"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-win32.whl", hash = "sha256:9fe53b404f24789b5ea9003fc25b9a3988feddebd7e7b369c8fac27ad6f52f28"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-win_amd64.whl", hash = "sha256:af148a33ff0349f53512a049c6406923e4e02bf2f26c5fb285f143faf4f0e46a"}, + {file = "SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e"}, + {file = "sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} typing-extensions = ">=4.6.0" [package.extras] @@ -7098,7 +7368,7 @@ aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] @@ -7190,41 +7460,49 @@ pure-eval = "*" tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] -name = "sympy" -version = "1.12.1" -description = "Computer algebra system (CAS) in Python" -optional = true +name = "starlette" +version = "0.40.0" +description = "The little ASGI library that shines." +optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.12.1-py3-none-any.whl", hash = "sha256:9b2cbc7f1a640289430e13d2a56f02f867a1da0190f2f99d8968c2f74da0e515"}, - {file = "sympy-1.12.1.tar.gz", hash = "sha256:2877b03f998cd8c08f07cd0de5b767119cd3ef40d09f41c30d722f6686b0fb88"}, + {file = "starlette-0.40.0-py3-none-any.whl", hash = "sha256:c494a22fae73805376ea6bf88439783ecfba9aac88a43911b48c653437e784c4"}, + {file = "starlette-0.40.0.tar.gz", hash = "sha256:1a3139688fb298ce5e2d661d37046a66ad996ce94be4d4983be019a23a04ea35"}, ] [package.dependencies] -mpmath = ">=1.1.0,<1.4.0" +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] [[package]] -name = "tbb" -version = "2021.12.0" -description = "Intel® oneAPI Threading Building Blocks (oneTBB)" +name = "sympy" +version = "1.13.1" +description = "Computer algebra system (CAS) in Python" optional = true -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "tbb-2021.12.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:f2cc9a7f8ababaa506cbff796ce97c3bf91062ba521e15054394f773375d81d8"}, - {file = "tbb-2021.12.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:a925e9a7c77d3a46ae31c34b0bb7f801c4118e857d137b68f68a8e458fcf2bd7"}, - {file = "tbb-2021.12.0-py3-none-win32.whl", hash = "sha256:b1725b30c174048edc8be70bd43bb95473f396ce895d91151a474d0fa9f450a8"}, - {file = "tbb-2021.12.0-py3-none-win_amd64.whl", hash = "sha256:fc2772d850229f2f3df85f1109c4844c495a2db7433d38200959ee9265b34789"}, + {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, + {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, ] +[package.dependencies] +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] + [[package]] name = "tenacity" -version = "8.3.0" +version = "8.5.0" description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" files = [ - {file = "tenacity-8.3.0-py3-none-any.whl", hash = "sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185"}, - {file = "tenacity-8.3.0.tar.gz", hash = "sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2"}, + {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, + {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, ] [package.extras] @@ -7233,13 +7511,13 @@ test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "termcolor" -version = "2.4.0" +version = "2.5.0" description = "ANSI color formatting for output in terminal" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, - {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, + {file = "termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8"}, + {file = "termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"}, ] [package.extras] @@ -7279,47 +7557,42 @@ files = [ [[package]] name = "tiktoken" -version = "0.7.0" +version = "0.8.0" description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, - {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, - {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, - {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, - {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, - {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, - {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, - {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, - {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, - {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, - {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, - {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, - {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, - {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, - {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, - {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, - {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, - {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, - {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, - {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, - {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, - {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, - {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, - {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, - {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, - {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, - {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, - {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, - {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, - {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, - {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, - {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, - {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, - {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, - {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, - {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, + {file = "tiktoken-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b07e33283463089c81ef1467180e3e00ab00d46c2c4bbcef0acab5f771d6695e"}, + {file = "tiktoken-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9269348cb650726f44dd3bbb3f9110ac19a8dcc8f54949ad3ef652ca22a38e21"}, + {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e13f37bc4ef2d012731e93e0fef21dc3b7aea5bb9009618de9a4026844e560"}, + {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f13d13c981511331eac0d01a59b5df7c0d4060a8be1e378672822213da51e0a2"}, + {file = "tiktoken-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6b2ddbc79a22621ce8b1166afa9f9a888a664a579350dc7c09346a3b5de837d9"}, + {file = "tiktoken-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005"}, + {file = "tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1"}, + {file = "tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a"}, + {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5637e425ce1fc49cf716d88df3092048359a4b3bbb7da762840426e937ada06d"}, + {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47"}, + {file = "tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419"}, + {file = "tiktoken-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99"}, + {file = "tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586"}, + {file = "tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b"}, + {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab"}, + {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04"}, + {file = "tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc"}, + {file = "tiktoken-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db"}, + {file = "tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24"}, + {file = "tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a"}, + {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5"}, + {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953"}, + {file = "tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7"}, + {file = "tiktoken-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69"}, + {file = "tiktoken-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e17807445f0cf1f25771c9d86496bd8b5c376f7419912519699f3cc4dc5c12e"}, + {file = "tiktoken-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:886f80bd339578bbdba6ed6d0567a0d5c6cfe198d9e587ba6c447654c65b8edc"}, + {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6adc8323016d7758d6de7313527f755b0fc6c72985b7d9291be5d96d73ecd1e1"}, + {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b591fb2b30d6a72121a80be24ec7a0e9eb51c5500ddc7e4c2496516dd5e3816b"}, + {file = "tiktoken-0.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:845287b9798e476b4d762c3ebda5102be87ca26e5d2c9854002825d60cdb815d"}, + {file = "tiktoken-0.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:1473cfe584252dc3fa62adceb5b1c763c1874e04511b197da4e6de51d6ce5a02"}, + {file = "tiktoken-0.8.0.tar.gz", hash = "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2"}, ] [package.dependencies] @@ -7349,247 +7622,235 @@ test = ["pytest", "ruff"] [[package]] name = "tokenize-rt" -version = "5.2.0" +version = "6.0.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." optional = true python-versions = ">=3.8" files = [ - {file = "tokenize_rt-5.2.0-py2.py3-none-any.whl", hash = "sha256:b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289"}, - {file = "tokenize_rt-5.2.0.tar.gz", hash = "sha256:9fe80f8a5c1edad2d3ede0f37481cc0cc1538a2f442c9c2f9e4feacd2792d054"}, + {file = "tokenize_rt-6.0.0-py2.py3-none-any.whl", hash = "sha256:d4ff7ded2873512938b4f8cbb98c9b07118f01d30ac585a30d7a88353ca36d22"}, + {file = "tokenize_rt-6.0.0.tar.gz", hash = "sha256:b9711bdfc51210211137499b5e355d3de5ec88a85d2025c520cbb921b5194367"}, ] [[package]] name = "tokenizers" -version = "0.15.2" +version = "0.20.1" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "tokenizers-0.15.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:52f6130c9cbf70544287575a985bf44ae1bda2da7e8c24e97716080593638012"}, - {file = "tokenizers-0.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:054c1cc9c6d68f7ffa4e810b3d5131e0ba511b6e4be34157aa08ee54c2f8d9ee"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9b9b070fdad06e347563b88c278995735292ded1132f8657084989a4c84a6d5"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea621a7eef4b70e1f7a4e84dd989ae3f0eeb50fc8690254eacc08acb623e82f1"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf7fd9a5141634fa3aa8d6b7be362e6ae1b4cda60da81388fa533e0b552c98fd"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44f2a832cd0825295f7179eaf173381dc45230f9227ec4b44378322d900447c9"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b9ec69247a23747669ec4b0ca10f8e3dfb3545d550258129bd62291aabe8605"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b6a4c78da863ff26dbd5ad9a8ecc33d8a8d97b535172601cf00aee9d7ce9ce"}, - {file = "tokenizers-0.15.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5ab2a4d21dcf76af60e05af8063138849eb1d6553a0d059f6534357bce8ba364"}, - {file = "tokenizers-0.15.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a47acfac7e511f6bbfcf2d3fb8c26979c780a91e06fb5b9a43831b2c0153d024"}, - {file = "tokenizers-0.15.2-cp310-none-win32.whl", hash = "sha256:064ff87bb6acdbd693666de9a4b692add41308a2c0ec0770d6385737117215f2"}, - {file = "tokenizers-0.15.2-cp310-none-win_amd64.whl", hash = "sha256:3b919afe4df7eb6ac7cafd2bd14fb507d3f408db7a68c43117f579c984a73843"}, - {file = "tokenizers-0.15.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:89cd1cb93e4b12ff39bb2d626ad77e35209de9309a71e4d3d4672667b4b256e7"}, - {file = "tokenizers-0.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cfed5c64e5be23d7ee0f0e98081a25c2a46b0b77ce99a4f0605b1ec43dd481fa"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a907d76dcfda37023ba203ab4ceeb21bc5683436ebefbd895a0841fd52f6f6f2"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20ea60479de6fc7b8ae756b4b097572372d7e4032e2521c1bbf3d90c90a99ff0"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:48e2b9335be2bc0171df9281385c2ed06a15f5cf121c44094338306ab7b33f2c"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:112a1dd436d2cc06e6ffdc0b06d55ac019a35a63afd26475205cb4b1bf0bfbff"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4620cca5c2817177ee8706f860364cc3a8845bc1e291aaf661fb899e5d1c45b0"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccd73a82751c523b3fc31ff8194702e4af4db21dc20e55b30ecc2079c5d43cb7"}, - {file = "tokenizers-0.15.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:107089f135b4ae7817affe6264f8c7a5c5b4fd9a90f9439ed495f54fcea56fb4"}, - {file = "tokenizers-0.15.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0ff110ecc57b7aa4a594396525a3451ad70988e517237fe91c540997c4e50e29"}, - {file = "tokenizers-0.15.2-cp311-none-win32.whl", hash = "sha256:6d76f00f5c32da36c61f41c58346a4fa7f0a61be02f4301fd30ad59834977cc3"}, - {file = "tokenizers-0.15.2-cp311-none-win_amd64.whl", hash = "sha256:cc90102ed17271cf0a1262babe5939e0134b3890345d11a19c3145184b706055"}, - {file = "tokenizers-0.15.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f86593c18d2e6248e72fb91c77d413a815153b8ea4e31f7cd443bdf28e467670"}, - {file = "tokenizers-0.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0774bccc6608eca23eb9d620196687c8b2360624619623cf4ba9dc9bd53e8b51"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d0222c5b7c9b26c0b4822a82f6a7011de0a9d3060e1da176f66274b70f846b98"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3835738be1de66624fff2f4f6f6684775da4e9c00bde053be7564cbf3545cc66"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0143e7d9dcd811855c1ce1ab9bf5d96d29bf5e528fd6c7824d0465741e8c10fd"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db35825f6d54215f6b6009a7ff3eedee0848c99a6271c870d2826fbbedf31a38"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f5e64b0389a2be47091d8cc53c87859783b837ea1a06edd9d8e04004df55a5c"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e0480c452217edd35eca56fafe2029fb4d368b7c0475f8dfa3c5c9c400a7456"}, - {file = "tokenizers-0.15.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a33ab881c8fe70474980577e033d0bc9a27b7ab8272896e500708b212995d834"}, - {file = "tokenizers-0.15.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a308a607ca9de2c64c1b9ba79ec9a403969715a1b8ba5f998a676826f1a7039d"}, - {file = "tokenizers-0.15.2-cp312-none-win32.whl", hash = "sha256:b8fcfa81bcb9447df582c5bc96a031e6df4da2a774b8080d4f02c0c16b42be0b"}, - {file = "tokenizers-0.15.2-cp312-none-win_amd64.whl", hash = "sha256:38d7ab43c6825abfc0b661d95f39c7f8af2449364f01d331f3b51c94dcff7221"}, - {file = "tokenizers-0.15.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:38bfb0204ff3246ca4d5e726e8cc8403bfc931090151e6eede54d0e0cf162ef0"}, - {file = "tokenizers-0.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c861d35e8286a53e06e9e28d030b5a05bcbf5ac9d7229e561e53c352a85b1fc"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:936bf3842db5b2048eaa53dade907b1160f318e7c90c74bfab86f1e47720bdd6"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:620beacc3373277700d0e27718aa8b25f7b383eb8001fba94ee00aeea1459d89"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2735ecbbf37e52db4ea970e539fd2d450d213517b77745114f92867f3fc246eb"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:473c83c5e2359bb81b0b6fde870b41b2764fcdd36d997485e07e72cc3a62264a"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968fa1fb3c27398b28a4eca1cbd1e19355c4d3a6007f7398d48826bbe3a0f728"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:865c60ae6eaebdde7da66191ee9b7db52e542ed8ee9d2c653b6d190a9351b980"}, - {file = "tokenizers-0.15.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7c0d8b52664ab2d4a8d6686eb5effc68b78608a9008f086a122a7b2996befbab"}, - {file = "tokenizers-0.15.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f33dfbdec3784093a9aebb3680d1f91336c56d86cc70ddf88708251da1fe9064"}, - {file = "tokenizers-0.15.2-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d44ba80988ff9424e33e0a49445072ac7029d8c0e1601ad25a0ca5f41ed0c1d6"}, - {file = "tokenizers-0.15.2-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:dce74266919b892f82b1b86025a613956ea0ea62a4843d4c4237be2c5498ed3a"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0ef06b9707baeb98b316577acb04f4852239d856b93e9ec3a299622f6084e4be"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c73e2e74bbb07910da0d37c326869f34113137b23eadad3fc00856e6b3d9930c"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eeb12daf02a59e29f578a865f55d87cd103ce62bd8a3a5874f8fdeaa82e336b"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ba9f6895af58487ca4f54e8a664a322f16c26bbb442effd01087eba391a719e"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccec77aa7150e38eec6878a493bf8c263ff1fa8a62404e16c6203c64c1f16a26"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f40604f5042ff210ba82743dda2b6aa3e55aa12df4e9f2378ee01a17e2855e"}, - {file = "tokenizers-0.15.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5645938a42d78c4885086767c70923abad047163d809c16da75d6b290cb30bbe"}, - {file = "tokenizers-0.15.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:05a77cbfebe28a61ab5c3891f9939cc24798b63fa236d84e5f29f3a85a200c00"}, - {file = "tokenizers-0.15.2-cp37-none-win32.whl", hash = "sha256:361abdc068e8afe9c5b818769a48624687fb6aaed49636ee39bec4e95e1a215b"}, - {file = "tokenizers-0.15.2-cp37-none-win_amd64.whl", hash = "sha256:7ef789f83eb0f9baeb4d09a86cd639c0a5518528f9992f38b28e819df397eb06"}, - {file = "tokenizers-0.15.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4fe1f74a902bee74a3b25aff180fbfbf4f8b444ab37c4d496af7afd13a784ed2"}, - {file = "tokenizers-0.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c4b89038a684f40a6b15d6b09f49650ac64d951ad0f2a3ea9169687bbf2a8ba"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d05a1b06f986d41aed5f2de464c003004b2df8aaf66f2b7628254bcbfb72a438"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508711a108684111ec8af89d3a9e9e08755247eda27d0ba5e3c50e9da1600f6d"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:daa348f02d15160cb35439098ac96e3a53bacf35885072611cd9e5be7d333daa"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:494fdbe5932d3416de2a85fc2470b797e6f3226c12845cadf054dd906afd0442"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2d60f5246f4da9373f75ff18d64c69cbf60c3bca597290cea01059c336d2470"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93268e788825f52de4c7bdcb6ebc1fcd4a5442c02e730faa9b6b08f23ead0e24"}, - {file = "tokenizers-0.15.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6fc7083ab404019fc9acafe78662c192673c1e696bd598d16dc005bd663a5cf9"}, - {file = "tokenizers-0.15.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e39b41e5531d6b2122a77532dbea60e171ef87a3820b5a3888daa847df4153"}, - {file = "tokenizers-0.15.2-cp38-none-win32.whl", hash = "sha256:06cd0487b1cbfabefb2cc52fbd6b1f8d4c37799bd6c6e1641281adaa6b2504a7"}, - {file = "tokenizers-0.15.2-cp38-none-win_amd64.whl", hash = "sha256:5179c271aa5de9c71712e31cb5a79e436ecd0d7532a408fa42a8dbfa4bc23fd9"}, - {file = "tokenizers-0.15.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82f8652a74cc107052328b87ea8b34291c0f55b96d8fb261b3880216a9f9e48e"}, - {file = "tokenizers-0.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02458bee6f5f3139f1ebbb6d042b283af712c0981f5bc50edf771d6b762d5e4f"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c9a09cd26cca2e1c349f91aa665309ddb48d71636370749414fbf67bc83c5343"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:158be8ea8554e5ed69acc1ce3fbb23a06060bd4bbb09029431ad6b9a466a7121"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ddba9a2b0c8c81633eca0bb2e1aa5b3a15362b1277f1ae64176d0f6eba78ab1"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ef5dd1d39797044642dbe53eb2bc56435308432e9c7907728da74c69ee2adca"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:454c203164e07a860dbeb3b1f4a733be52b0edbb4dd2e5bd75023ffa8b49403a"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cf6b7f1d4dc59af960e6ffdc4faffe6460bbfa8dce27a58bf75755ffdb2526d"}, - {file = "tokenizers-0.15.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2ef09bbc16519f6c25d0c7fc0c6a33a6f62923e263c9d7cca4e58b8c61572afb"}, - {file = "tokenizers-0.15.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c9a2ebdd2ad4ec7a68e7615086e633857c85e2f18025bd05d2a4399e6c5f7169"}, - {file = "tokenizers-0.15.2-cp39-none-win32.whl", hash = "sha256:918fbb0eab96fe08e72a8c2b5461e9cce95585d82a58688e7f01c2bd546c79d0"}, - {file = "tokenizers-0.15.2-cp39-none-win_amd64.whl", hash = "sha256:524e60da0135e106b254bd71f0659be9f89d83f006ea9093ce4d1fab498c6d0d"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6a9b648a58281c4672212fab04e60648fde574877d0139cd4b4f93fe28ca8944"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7c7d18b733be6bbca8a55084027f7be428c947ddf871c500ee603e375013ffba"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:13ca3611de8d9ddfbc4dc39ef54ab1d2d4aaa114ac8727dfdc6a6ec4be017378"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:237d1bf3361cf2e6463e6c140628e6406766e8b27274f5fcc62c747ae3c6f094"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67a0fe1e49e60c664915e9fb6b0cb19bac082ab1f309188230e4b2920230edb3"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4e022fe65e99230b8fd89ebdfea138c24421f91c1a4f4781a8f5016fd5cdfb4d"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d857be2df69763362ac699f8b251a8cd3fac9d21893de129bc788f8baaef2693"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:708bb3e4283177236309e698da5fcd0879ce8fd37457d7c266d16b550bcbbd18"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:64c35e09e9899b72a76e762f9854e8750213f67567787d45f37ce06daf57ca78"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1257f4394be0d3b00de8c9e840ca5601d0a4a8438361ce9c2b05c7d25f6057b"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02272fe48280e0293a04245ca5d919b2c94a48b408b55e858feae9618138aeda"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dc3ad9ebc76eabe8b1d7c04d38be884b8f9d60c0cdc09b0aa4e3bcf746de0388"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:32e16bdeffa7c4f46bf2152172ca511808b952701d13e7c18833c0b73cb5c23f"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fb16ba563d59003028b678d2361a27f7e4ae0ab29c7a80690efa20d829c81fdb"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:2277c36d2d6cdb7876c274547921a42425b6810d38354327dd65a8009acf870c"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cf75d32e8d250781940d07f7eece253f2fe9ecdb1dc7ba6e3833fa17b82fcbc"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1b3b31884dc8e9b21508bb76da80ebf7308fdb947a17affce815665d5c4d028"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10122d8d8e30afb43bb1fe21a3619f62c3e2574bff2699cf8af8b0b6c5dc4a3"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d88b96ff0fe8e91f6ef01ba50b0d71db5017fa4e3b1d99681cec89a85faf7bf7"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:37aaec5a52e959892870a7c47cef80c53797c0db9149d458460f4f31e2fb250e"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e2ea752f2b0fe96eb6e2f3adbbf4d72aaa1272079b0dfa1145507bd6a5d537e6"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4b19a808d8799fda23504a5cd31d2f58e6f52f140380082b352f877017d6342b"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:64c86e5e068ac8b19204419ed8ca90f9d25db20578f5881e337d203b314f4104"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de19c4dc503c612847edf833c82e9f73cd79926a384af9d801dcf93f110cea4e"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea09acd2fe3324174063d61ad620dec3bcf042b495515f27f638270a7d466e8b"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cf27fd43472e07b57cf420eee1e814549203d56de00b5af8659cb99885472f1f"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7ca22bd897537a0080521445d91a58886c8c04084a6a19e6c78c586e0cfa92a5"}, - {file = "tokenizers-0.15.2.tar.gz", hash = "sha256:e6e9c6e019dd5484be5beafc775ae6c925f4c69a3487040ed09b45e13df2cb91"}, -] - -[package.dependencies] -huggingface_hub = ">=0.16.4,<1.0" + {file = "tokenizers-0.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:439261da7c0a5c88bda97acb284d49fbdaf67e9d3b623c0bfd107512d22787a9"}, + {file = "tokenizers-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03dae629d99068b1ea5416d50de0fea13008f04129cc79af77a2a6392792d93c"}, + {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b61f561f329ffe4b28367798b89d60c4abf3f815d37413b6352bc6412a359867"}, + {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec870fce1ee5248a10be69f7a8408a234d6f2109f8ea827b4f7ecdbf08c9fd15"}, + {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d388d1ea8b7447da784e32e3b86a75cce55887e3b22b31c19d0b186b1c677800"}, + {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:299c85c1d21135bc01542237979bf25c32efa0d66595dd0069ae259b97fb2dbe"}, + {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e96f6c14c9752bb82145636b614d5a78e9cde95edfbe0a85dad0dd5ddd6ec95c"}, + {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc9e95ad49c932b80abfbfeaf63b155761e695ad9f8a58c52a47d962d76e310f"}, + {file = "tokenizers-0.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f22dee205329a636148c325921c73cf3e412e87d31f4d9c3153b302a0200057b"}, + {file = "tokenizers-0.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2ffd9a8895575ac636d44500c66dffaef133823b6b25067604fa73bbc5ec09d"}, + {file = "tokenizers-0.20.1-cp310-none-win32.whl", hash = "sha256:2847843c53f445e0f19ea842a4e48b89dd0db4e62ba6e1e47a2749d6ec11f50d"}, + {file = "tokenizers-0.20.1-cp310-none-win_amd64.whl", hash = "sha256:f9aa93eacd865f2798b9e62f7ce4533cfff4f5fbd50c02926a78e81c74e432cd"}, + {file = "tokenizers-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4a717dcb08f2dabbf27ae4b6b20cbbb2ad7ed78ce05a829fae100ff4b3c7ff15"}, + {file = "tokenizers-0.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f84dad1ff1863c648d80628b1b55353d16303431283e4efbb6ab1af56a75832"}, + {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:929c8f3afa16a5130a81ab5079c589226273ec618949cce79b46d96e59a84f61"}, + {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d10766473954397e2d370f215ebed1cc46dcf6fd3906a2a116aa1d6219bfedc3"}, + {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9300fac73ddc7e4b0330acbdda4efaabf74929a4a61e119a32a181f534a11b47"}, + {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ecaf7b0e39caeb1aa6dd6e0975c405716c82c1312b55ac4f716ef563a906969"}, + {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5170be9ec942f3d1d317817ced8d749b3e1202670865e4fd465e35d8c259de83"}, + {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f1ae08fa9aea5891cbd69df29913e11d3841798e0bfb1ff78b78e4e7ea0a4"}, + {file = "tokenizers-0.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ee86d4095d3542d73579e953c2e5e07d9321af2ffea6ecc097d16d538a2dea16"}, + {file = "tokenizers-0.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:86dcd08da163912e17b27bbaba5efdc71b4fbffb841530fdb74c5707f3c49216"}, + {file = "tokenizers-0.20.1-cp311-none-win32.whl", hash = "sha256:9af2dc4ee97d037bc6b05fa4429ddc87532c706316c5e11ce2f0596dfcfa77af"}, + {file = "tokenizers-0.20.1-cp311-none-win_amd64.whl", hash = "sha256:899152a78b095559c287b4c6d0099469573bb2055347bb8154db106651296f39"}, + {file = "tokenizers-0.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:407ab666b38e02228fa785e81f7cf79ef929f104bcccf68a64525a54a93ceac9"}, + {file = "tokenizers-0.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f13a2d16032ebc8bd812eb8099b035ac65887d8f0c207261472803b9633cf3e"}, + {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e98eee4dca22849fbb56a80acaa899eec5b72055d79637dd6aa15d5e4b8628c9"}, + {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47c1bcdd61e61136087459cb9e0b069ff23b5568b008265e5cbc927eae3387ce"}, + {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128c1110e950534426e2274837fc06b118ab5f2fa61c3436e60e0aada0ccfd67"}, + {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2e2d47a819d2954f2c1cd0ad51bb58ffac6f53a872d5d82d65d79bf76b9896d"}, + {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bdd67a0e3503a9a7cf8bc5a4a49cdde5fa5bada09a51e4c7e1c73900297539bd"}, + {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b93d2e26d04da337ac407acec8b5d081d8d135e3e5066a88edd5bdb5aff89"}, + {file = "tokenizers-0.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0c6a796ddcd9a19ad13cf146997cd5895a421fe6aec8fd970d69f9117bddb45c"}, + {file = "tokenizers-0.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3ea919687aa7001a8ff1ba36ac64f165c4e89035f57998fa6cedcfd877be619d"}, + {file = "tokenizers-0.20.1-cp312-none-win32.whl", hash = "sha256:6d3ac5c1f48358ffe20086bf065e843c0d0a9fce0d7f0f45d5f2f9fba3609ca5"}, + {file = "tokenizers-0.20.1-cp312-none-win_amd64.whl", hash = "sha256:b0874481aea54a178f2bccc45aa2d0c99cd3f79143a0948af6a9a21dcc49173b"}, + {file = "tokenizers-0.20.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:96af92e833bd44760fb17f23f402e07a66339c1dcbe17d79a9b55bb0cc4f038e"}, + {file = "tokenizers-0.20.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:65f34e5b731a262dfa562820818533c38ce32a45864437f3d9c82f26c139ca7f"}, + {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17f98fccb5c12ab1ce1f471731a9cd86df5d4bd2cf2880c5a66b229802d96145"}, + {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8c0fc3542cf9370bf92c932eb71bdeb33d2d4aeeb4126d9fd567b60bd04cb30"}, + {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b39356df4575d37f9b187bb623aab5abb7b62c8cb702867a1768002f814800c"}, + {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfdad27b0e50544f6b838895a373db6114b85112ba5c0cefadffa78d6daae563"}, + {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:094663dd0e85ee2e573126918747bdb40044a848fde388efb5b09d57bc74c680"}, + {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14e4cf033a2aa207d7ac790e91adca598b679999710a632c4a494aab0fc3a1b2"}, + {file = "tokenizers-0.20.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9310951c92c9fb91660de0c19a923c432f110dbfad1a2d429fbc44fa956bf64f"}, + {file = "tokenizers-0.20.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:05e41e302c315bd2ed86c02e917bf03a6cf7d2f652c9cee1a0eb0d0f1ca0d32c"}, + {file = "tokenizers-0.20.1-cp37-none-win32.whl", hash = "sha256:212231ab7dfcdc879baf4892ca87c726259fa7c887e1688e3f3cead384d8c305"}, + {file = "tokenizers-0.20.1-cp37-none-win_amd64.whl", hash = "sha256:896195eb9dfdc85c8c052e29947169c1fcbe75a254c4b5792cdbd451587bce85"}, + {file = "tokenizers-0.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:741fb22788482d09d68e73ece1495cfc6d9b29a06c37b3df90564a9cfa688e6d"}, + {file = "tokenizers-0.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10be14ebd8082086a342d969e17fc2d6edc856c59dbdbddd25f158fa40eaf043"}, + {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:514cf279b22fa1ae0bc08e143458c74ad3b56cd078b319464959685a35c53d5e"}, + {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a647c5b7cb896d6430cf3e01b4e9a2d77f719c84cefcef825d404830c2071da2"}, + {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cdf379219e1e1dd432091058dab325a2e6235ebb23e0aec8d0508567c90cd01"}, + {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ba72260449e16c4c2f6f3252823b059fbf2d31b32617e582003f2b18b415c39"}, + {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:910b96ed87316e4277b23c7bcaf667ce849c7cc379a453fa179e7e09290eeb25"}, + {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53975a6694428a0586534cc1354b2408d4e010a3103117f617cbb550299797c"}, + {file = "tokenizers-0.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:07c4b7be58da142b0730cc4e5fd66bb7bf6f57f4986ddda73833cd39efef8a01"}, + {file = "tokenizers-0.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b605c540753e62199bf15cf69c333e934077ef2350262af2ccada46026f83d1c"}, + {file = "tokenizers-0.20.1-cp38-none-win32.whl", hash = "sha256:88b3bc76ab4db1ab95ead623d49c95205411e26302cf9f74203e762ac7e85685"}, + {file = "tokenizers-0.20.1-cp38-none-win_amd64.whl", hash = "sha256:d412a74cf5b3f68a90c615611a5aa4478bb303d1c65961d22db45001df68afcb"}, + {file = "tokenizers-0.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a25dcb2f41a0a6aac31999e6c96a75e9152fa0127af8ece46c2f784f23b8197a"}, + {file = "tokenizers-0.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a12c3cebb8c92e9c35a23ab10d3852aee522f385c28d0b4fe48c0b7527d59762"}, + {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02e18da58cf115b7c40de973609c35bde95856012ba42a41ee919c77935af251"}, + {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f326a1ac51ae909b9760e34671c26cd0dfe15662f447302a9d5bb2d872bab8ab"}, + {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b4872647ea6f25224e2833b044b0b19084e39400e8ead3cfe751238b0802140"}, + {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce6238a3311bb8e4c15b12600927d35c267b92a52c881ef5717a900ca14793f7"}, + {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57b7a8880b208866508b06ce365dc631e7a2472a3faa24daa430d046fb56c885"}, + {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a908c69c2897a68f412aa05ba38bfa87a02980df70f5a72fa8490479308b1f2d"}, + {file = "tokenizers-0.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:da1001aa46f4490099c82e2facc4fbc06a6a32bf7de3918ba798010954b775e0"}, + {file = "tokenizers-0.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:42c097390e2f0ed0a5c5d569e6669dd4e9fff7b31c6a5ce6e9c66a61687197de"}, + {file = "tokenizers-0.20.1-cp39-none-win32.whl", hash = "sha256:3d4d218573a3d8b121a1f8c801029d70444ffb6d8f129d4cca1c7b672ee4a24c"}, + {file = "tokenizers-0.20.1-cp39-none-win_amd64.whl", hash = "sha256:37d1e6f616c84fceefa7c6484a01df05caf1e207669121c66213cb5b2911d653"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48689da7a395df41114f516208d6550e3e905e1239cc5ad386686d9358e9cef0"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:712f90ea33f9bd2586b4a90d697c26d56d0a22fd3c91104c5858c4b5b6489a79"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:359eceb6a620c965988fc559cebc0a98db26713758ec4df43fb76d41486a8ed5"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d3caf244ce89d24c87545aafc3448be15870096e796c703a0d68547187192e1"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03b03cf8b9a32254b1bf8a305fb95c6daf1baae0c1f93b27f2b08c9759f41dee"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:218e5a3561561ea0f0ef1559c6d95b825308dbec23fb55b70b92589e7ff2e1e8"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f40df5e0294a95131cc5f0e0eb91fe86d88837abfbee46b9b3610b09860195a7"}, + {file = "tokenizers-0.20.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:08aaa0d72bb65058e8c4b0455f61b840b156c557e2aca57627056624c3a93976"}, + {file = "tokenizers-0.20.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:998700177b45f70afeb206ad22c08d9e5f3a80639dae1032bf41e8cbc4dada4b"}, + {file = "tokenizers-0.20.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62f7fbd3c2c38b179556d879edae442b45f68312019c3a6013e56c3947a4e648"}, + {file = "tokenizers-0.20.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31e87fca4f6bbf5cc67481b562147fe932f73d5602734de7dd18a8f2eee9c6dd"}, + {file = "tokenizers-0.20.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:956f21d359ae29dd51ca5726d2c9a44ffafa041c623f5aa33749da87cfa809b9"}, + {file = "tokenizers-0.20.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1fbbaf17a393c78d8aedb6a334097c91cb4119a9ced4764ab8cfdc8d254dc9f9"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ebe63e31f9c1a970c53866d814e35ec2ec26fda03097c486f82f3891cee60830"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:81970b80b8ac126910295f8aab2d7ef962009ea39e0d86d304769493f69aaa1e"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130e35e76f9337ed6c31be386e75d4925ea807055acf18ca1a9b0eec03d8fe23"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd28a8614f5c82a54ab2463554e84ad79526c5184cf4573bbac2efbbbcead457"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9041ee665d0fa7f5c4ccf0f81f5e6b7087f797f85b143c094126fc2611fec9d0"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:62eb9daea2a2c06bcd8113a5824af8ef8ee7405d3a71123ba4d52c79bb3d9f1a"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f861889707b54a9ab1204030b65fd6c22bdd4a95205deec7994dc22a8baa2ea4"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:89d5c337d74ea6e5e7dc8af124cf177be843bbb9ca6e58c01f75ea103c12c8a9"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0b7f515c83397e73292accdbbbedc62264e070bae9682f06061e2ddce67cacaf"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0305fc1ec6b1e5052d30d9c1d5c807081a7bd0cae46a33d03117082e91908c"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc611e6ac0fa00a41de19c3bf6391a05ea201d2d22b757d63f5491ec0e67faa"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5ffe0d7f7bfcfa3b2585776ecf11da2e01c317027c8573c78ebcb8985279e23"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e7edb8ec12c100d5458d15b1e47c0eb30ad606a05641f19af7563bc3d1608c14"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:de291633fb9303555793cc544d4a86e858da529b7d0b752bcaf721ae1d74b2c9"}, + {file = "tokenizers-0.20.1.tar.gz", hash = "sha256:84edcc7cdeeee45ceedb65d518fffb77aec69311c9c8e30f77ad84da3025f002"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" [package.extras] dev = ["tokenizers[testing]"] -docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] -testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] name = "tomli-w" -version = "1.0.0" +version = "1.1.0" description = "A lil' TOML writer" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "tomli_w-1.0.0-py3-none-any.whl", hash = "sha256:9f2a07e8be30a0729e533ec968016807069991ae2fd921a78d42f429ae5f4463"}, - {file = "tomli_w-1.0.0.tar.gz", hash = "sha256:f463434305e0336248cac9c2dc8076b707d8a12d019dd349f5c1e382dd1ae1b9"}, + {file = "tomli_w-1.1.0-py3-none-any.whl", hash = "sha256:1403179c78193e3184bfaade390ddbd071cba48a32a2e62ba11aae47490c63f7"}, + {file = "tomli_w-1.1.0.tar.gz", hash = "sha256:49e847a3a304d516a169a601184932ef0f6b61623fe680f836a2aa7128ed0d33"}, ] [[package]] name = "torch" -version = "2.3.0" +version = "2.5.0" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = true python-versions = ">=3.8.0" files = [ - {file = "torch-2.3.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:d8ea5a465dbfd8501f33c937d1f693176c9aef9d1c1b0ca1d44ed7b0a18c52ac"}, - {file = "torch-2.3.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09c81c5859a5b819956c6925a405ef1cdda393c9d8a01ce3851453f699d3358c"}, - {file = "torch-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:1bf023aa20902586f614f7682fedfa463e773e26c58820b74158a72470259459"}, - {file = "torch-2.3.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:758ef938de87a2653bba74b91f703458c15569f1562bf4b6c63c62d9c5a0c1f5"}, - {file = "torch-2.3.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:493d54ee2f9df100b5ce1d18c96dbb8d14908721f76351e908c9d2622773a788"}, - {file = "torch-2.3.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:bce43af735c3da16cc14c7de2be7ad038e2fbf75654c2e274e575c6c05772ace"}, - {file = "torch-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:729804e97b7cf19ae9ab4181f91f5e612af07956f35c8b2c8e9d9f3596a8e877"}, - {file = "torch-2.3.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:d24e328226d8e2af7cf80fcb1d2f1d108e0de32777fab4aaa2b37b9765d8be73"}, - {file = "torch-2.3.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:b0de2bdc0486ea7b14fc47ff805172df44e421a7318b7c4d92ef589a75d27410"}, - {file = "torch-2.3.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a306c87a3eead1ed47457822c01dfbd459fe2920f2d38cbdf90de18f23f72542"}, - {file = "torch-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:f9b98bf1a3c8af2d4c41f0bf1433920900896c446d1ddc128290ff146d1eb4bd"}, - {file = "torch-2.3.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:dca986214267b34065a79000cee54232e62b41dff1ec2cab9abc3fc8b3dee0ad"}, - {file = "torch-2.3.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:20572f426965dd8a04e92a473d7e445fa579e09943cc0354f3e6fef6130ce061"}, - {file = "torch-2.3.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e65ba85ae292909cde0dde6369826d51165a3fc8823dc1854cd9432d7f79b932"}, - {file = "torch-2.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:5515503a193781fd1b3f5c474e89c9dfa2faaa782b2795cc4a7ab7e67de923f6"}, - {file = "torch-2.3.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:6ae9f64b09516baa4ef890af0672dc981c20b1f0d829ce115d4420a247e88fba"}, - {file = "torch-2.3.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cd0dc498b961ab19cb3f8dbf0c6c50e244f2f37dbfa05754ab44ea057c944ef9"}, - {file = "torch-2.3.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e05f836559251e4096f3786ee99f4a8cbe67bc7fbedba8ad5e799681e47c5e80"}, - {file = "torch-2.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:4fb27b35dbb32303c2927da86e27b54a92209ddfb7234afb1949ea2b3effffea"}, - {file = "torch-2.3.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:760f8bedff506ce9e6e103498f9b1e9e15809e008368594c3a66bf74a8a51380"}, + {file = "torch-2.5.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:7f179373a047b947dec448243f4e6598a1c960fa3bb978a9a7eecd529fbc363f"}, + {file = "torch-2.5.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:15fbc95e38d330e5b0ef1593b7bc0a19f30e5bdad76895a5cffa1a6a044235e9"}, + {file = "torch-2.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:f499212f1cffea5d587e5f06144630ed9aa9c399bba12ec8905798d833bd1404"}, + {file = "torch-2.5.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:c54db1fade17287aabbeed685d8e8ab3a56fea9dd8d46e71ced2da367f09a49f"}, + {file = "torch-2.5.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:499a68a756d3b30d10f7e0f6214dc3767b130b797265db3b1c02e9094e2a07be"}, + {file = "torch-2.5.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:9f3df8138a1126a851440b7d5a4869bfb7c9cc43563d64fd9d96d0465b581024"}, + {file = "torch-2.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b81da3bdb58c9de29d0e1361e52f12fcf10a89673f17a11a5c6c7da1cb1a8376"}, + {file = "torch-2.5.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:ba135923295d564355326dc409b6b7f5bd6edc80f764cdaef1fb0a1b23ff2f9c"}, + {file = "torch-2.5.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:2dd40c885a05ef7fe29356cca81be1435a893096ceb984441d6e2c27aff8c6f4"}, + {file = "torch-2.5.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:bc52d603d87fe1da24439c0d5fdbbb14e0ae4874451d53f0120ffb1f6c192727"}, + {file = "torch-2.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea718746469246cc63b3353afd75698a288344adb55e29b7f814a5d3c0a7c78d"}, + {file = "torch-2.5.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:6de1fd253e27e7f01f05cd7c37929ae521ca23ca4620cfc7c485299941679112"}, + {file = "torch-2.5.0-cp313-cp313-manylinux1_x86_64.whl", hash = "sha256:83dcf518685db20912b71fc49cbddcc8849438cdb0e9dcc919b02a849e2cd9e8"}, + {file = "torch-2.5.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:65e0a60894435608334d68c8811e55fd8f73e5bf8ee6f9ccedb0064486a7b418"}, + {file = "torch-2.5.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:38c21ff1bd39f076d72ab06e3c88c2ea6874f2e6f235c9450816b6c8e7627094"}, + {file = "torch-2.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:ce4baeba9804da5a346e210b3b70826f5811330c343e4fe1582200359ee77fe5"}, + {file = "torch-2.5.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:03e53f577a96e4d41aca472da8faa40e55df89d2273664af390ce1f570e885bd"}, ] [package.dependencies] filelock = "*" fsspec = "*" jinja2 = "*" -mkl = {version = ">=2021.1.1,<=2021.4.0", markers = "platform_system == \"Windows\""} networkx = "*" -nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nccl-cu12 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -sympy = "*" -triton = {version = "2.3.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +nvidia-cublas-cu12 = {version = "12.4.5.8", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "9.1.0.70", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.2.1.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.5.147", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.6.1.9", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.3.1.170", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.21.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvjitlink-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +setuptools = {version = "*", markers = "python_version >= \"3.12\""} +sympy = {version = "1.13.1", markers = "python_version >= \"3.9\""} +triton = {version = "3.1.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.13\""} typing-extensions = ">=4.8.0" [package.extras] opt-einsum = ["opt-einsum (>=3.3)"] -optree = ["optree (>=0.9.1)"] +optree = ["optree (>=0.12.0)"] [[package]] name = "tornado" -version = "6.4" +version = "6.4.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false -python-versions = ">= 3.8" +python-versions = ">=3.8" files = [ - {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, - {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, - {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, - {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, - {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, ] [[package]] name = "tqdm" -version = "4.66.4" +version = "4.66.5" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, - {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] [package.dependencies] @@ -7618,41 +7879,40 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "transformers" -version = "4.38.0" +version = "4.45.2" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.38.0-py3-none-any.whl", hash = "sha256:a6d7ae9afcfcc0773d8b9ef20940344bd1cae54fe49175ddea61c7c8d11fb52a"}, - {file = "transformers-4.38.0.tar.gz", hash = "sha256:aa98177980467cb0c73f34b19d70d0577ec021c7c00706fbaca46ac358fd083c"}, + {file = "transformers-4.45.2-py3-none-any.whl", hash = "sha256:c551b33660cfc815bae1f9f097ecfd1e65be623f13c6ee0dda372bd881460210"}, + {file = "transformers-4.45.2.tar.gz", hash = "sha256:72bc390f6b203892561f05f86bbfaa0e234aab8e927a83e62b9d92ea7e3ae101"}, ] [package.dependencies] filelock = "*" -huggingface-hub = ">=0.19.3,<1.0" +huggingface-hub = ">=0.23.2,<1.0" numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" requests = "*" safetensors = ">=0.4.1" -tokenizers = ">=0.14,<0.19" +tokenizers = ">=0.20,<0.21" tqdm = ">=4.27" [package.extras] -accelerate = ["accelerate (>=0.21.0)"] -agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch", "torchaudio", "torchvision"] +accelerate = ["accelerate (>=0.26.0)"] +agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.20,<0.21)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +benchmark = ["optimum-benchmark (>=0.3.0)"] codecarbon = ["codecarbon (==1.2.0)"] -deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.14,<0.19)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -docs = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch", "torchaudio", "torchvision"] -docs-specific = ["hf-doc-builder"] -flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] +deepspeed = ["accelerate (>=0.26.0)", "deepspeed (>=0.9.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.26.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.20,<0.21)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.20,<0.21)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "libcst", "librosa", "nltk (<=3.8.1)", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.20,<0.21)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] @@ -7662,41 +7922,42 @@ natten = ["natten (>=0.14.6,<0.15.0)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] optuna = ["optuna"] -quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "libcst", "rich", "ruff (==0.5.1)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +ruff = ["ruff (==0.5.1)"] sagemaker = ["sagemaker (>=2.31.0)"] sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "tensorboard", "timeout-decorator"] -tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] -tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] -timm = ["timm"] -tokenizers = ["tokenizers (>=0.14,<0.19)"] -torch = ["accelerate (>=0.21.0)", "torch"] +tiktoken = ["blobfile", "tiktoken"] +timm = ["timm (<=0.9.16)"] +tokenizers = ["tokenizers (>=0.20,<0.21)"] +torch = ["accelerate (>=0.26.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.14,<0.19)", "torch", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.20,<0.21)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] [[package]] name = "triton" -version = "2.3.0" +version = "3.1.0" description = "A language and compiler for custom Deep Learning operations" optional = true python-versions = "*" files = [ - {file = "triton-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ce4b8ff70c48e47274c66f269cce8861cf1dc347ceeb7a67414ca151b1822d8"}, - {file = "triton-2.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c3d9607f85103afdb279938fc1dd2a66e4f5999a58eb48a346bd42738f986dd"}, - {file = "triton-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:218d742e67480d9581bafb73ed598416cc8a56f6316152e5562ee65e33de01c0"}, - {file = "triton-2.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381ec6b3dac06922d3e4099cfc943ef032893b25415de295e82b1a82b0359d2c"}, - {file = "triton-2.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038e06a09c06a164fef9c48de3af1e13a63dc1ba3c792871e61a8e79720ea440"}, - {file = "triton-2.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8f636e0341ac348899a47a057c3daea99ea7db31528a225a3ba4ded28ccc65"}, + {file = "triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8"}, + {file = "triton-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f34f6e7885d1bf0eaaf7ba875a5f0ce6f3c13ba98f9503651c1e6dc6757ed5c"}, + {file = "triton-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8182f42fd8080a7d39d666814fa36c5e30cc00ea7eeeb1a2983dbb4c99a0fdc"}, + {file = "triton-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dadaca7fc24de34e180271b5cf864c16755702e9f63a16f62df714a8099126a"}, + {file = "triton-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aafa9a20cd0d9fee523cd4504aa7131807a864cd77dcf6efe7e981f18b8c6c11"}, ] [package.dependencies] @@ -7704,8 +7965,8 @@ filelock = "*" [package.extras] build = ["cmake (>=3.20)", "lit"] -tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)", "torch"] -tutorials = ["matplotlib", "pandas", "tabulate", "torch"] +tests = ["autopep8", "flake8", "isort", "llnl-hatchet", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] [[package]] name = "twine" @@ -7745,59 +8006,52 @@ typing-extensions = ">=3.0.0" [[package]] name = "typer" -version = "0.9.4" +version = "0.12.5" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "typer-0.9.4-py3-none-any.whl", hash = "sha256:aa6c4a4e2329d868b80ecbaf16f807f2b54e192209d7ac9dd42691d63f7a54eb"}, - {file = "typer-0.9.4.tar.gz", hash = "sha256:f714c2d90afae3a7929fcd72a3abb08df305e1ff61719381384211c4070af57f"}, + {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"}, + {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"}, ] [package.dependencies] -click = ">=7.1.1,<9.0.0" -colorama = {version = ">=0.4.3,<0.5.0", optional = true, markers = "extra == \"all\""} -rich = {version = ">=10.11.0,<14.0.0", optional = true, markers = "extra == \"all\""} -shellingham = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"all\""} +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" typing-extensions = ">=3.7.4.3" -[package.extras] -all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] -dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] -doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] -test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.971)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] - [[package]] name = "types-python-dateutil" -version = "2.9.0.20240316" +version = "2.9.0.20241003" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, - {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, + {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, + {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, ] [[package]] name = "typing-extensions" -version = "4.12.1" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.12.1-py3-none-any.whl", hash = "sha256:6024b58b69089e5a89c347397254e35f1bf02a907728ec7fee9bf0fe837d203a"}, - {file = "typing_extensions-4.12.1.tar.gz", hash = "sha256:915f5e35ff76f56588223f15fdd5938f9a1cf9195c0de25130c627e4d597f6d1"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = true python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] @@ -7826,13 +8080,13 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "1.26.19" +version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "urllib3-1.26.19-py2.py3-none-any.whl", hash = "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3"}, - {file = "urllib3-1.26.19.tar.gz", hash = "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429"}, + {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, + {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] [package.extras] @@ -7842,13 +8096,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -7857,6 +8111,25 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "uvicorn" +version = "0.32.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.32.0-py3-none-any.whl", hash = "sha256:60b8f3a5ac027dcd31448f411ced12b5ef452c646f76f02f8cc3f25d8d26fd82"}, + {file = "uvicorn-0.32.0.tar.gz", hash = "sha256:f78b36b143c16f54ccdb8190d0a26b5f1901fe5a3c777e1ab29f26391af8551e"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + [[package]] name = "uvloop" version = "0.20.0" @@ -7903,13 +8176,13 @@ test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)" [[package]] name = "virtualenv" -version = "20.26.2" +version = "20.27.0" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, - {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, + {file = "virtualenv-20.27.0-py3-none-any.whl", hash = "sha256:44a72c29cceb0ee08f300b314848c86e57bf8d1f13107a5e671fb9274138d655"}, + {file = "virtualenv-20.27.0.tar.gz", hash = "sha256:2ca56a68ed615b8fe4326d11a0dca5dfbe8fd68510fb6c6349163bed3c15f2b2"}, ] [package.dependencies] @@ -7938,43 +8211,41 @@ testing = ["coverage (>=5.0)", "pytest", "pytest-cov"] [[package]] name = "watchdog" -version = "4.0.1" +version = "5.0.3" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645"}, - {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b"}, - {file = "watchdog-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682"}, - {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, - {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, - {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, - {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, - {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, - {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, - {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, - {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, - {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, - {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, ] [package.extras] @@ -7993,18 +8264,18 @@ files = [ [[package]] name = "webcolors" -version = "1.13" +version = "24.8.0" description = "A library for working with the color formats defined by HTML and CSS." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, - {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, + {file = "webcolors-24.8.0-py3-none-any.whl", hash = "sha256:fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a"}, + {file = "webcolors-24.8.0.tar.gz", hash = "sha256:08b07af286a01bcd30d583a7acadf629583d1f79bfef27dd2c2c5c263817277d"}, ] [package.extras] docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] -tests = ["pytest", "pytest-cov"] +tests = ["coverage[toml]"] [[package]] name = "webencodings" @@ -8035,13 +8306,13 @@ test = ["websockets"] [[package]] name = "werkzeug" -version = "3.0.3" +version = "3.0.4" description = "The comprehensive WSGI web application library." -optional = false +optional = true python-versions = ">=3.8" files = [ - {file = "werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8"}, - {file = "werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18"}, + {file = "werkzeug-3.0.4-py3-none-any.whl", hash = "sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c"}, + {file = "werkzeug-3.0.4.tar.gz", hash = "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306"}, ] [package.dependencies] @@ -8052,13 +8323,13 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "widgetsnbextension" -version = "4.0.11" +version = "4.0.13" description = "Jupyter interactive widgets for Jupyter Notebook" optional = true python-versions = ">=3.7" files = [ - {file = "widgetsnbextension-4.0.11-py3-none-any.whl", hash = "sha256:55d4d6949d100e0d08b94948a42efc3ed6dfdc0e9468b2c4b128c9a2ce3a7a36"}, - {file = "widgetsnbextension-4.0.11.tar.gz", hash = "sha256:8b22a8f1910bfd188e596fe7fc05dcbd87e810c8a4ba010bdb3da86637398474"}, + {file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"}, + {file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"}, ] [[package]] @@ -8142,119 +8413,134 @@ files = [ [[package]] name = "xxhash" -version = "3.4.1" +version = "3.5.0" description = "Python binding for xxHash" optional = true python-versions = ">=3.7" files = [ - {file = "xxhash-3.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91dbfa55346ad3e18e738742236554531a621042e419b70ad8f3c1d9c7a16e7f"}, - {file = "xxhash-3.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:665a65c2a48a72068fcc4d21721510df5f51f1142541c890491afc80451636d2"}, - {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb11628470a6004dc71a09fe90c2f459ff03d611376c1debeec2d648f44cb693"}, - {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bef2a7dc7b4f4beb45a1edbba9b9194c60a43a89598a87f1a0226d183764189"}, - {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c0f7b2d547d72c7eda7aa817acf8791f0146b12b9eba1d4432c531fb0352228"}, - {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00f2fdef6b41c9db3d2fc0e7f94cb3db86693e5c45d6de09625caad9a469635b"}, - {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23cfd9ca09acaf07a43e5a695143d9a21bf00f5b49b15c07d5388cadf1f9ce11"}, - {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6a9ff50a3cf88355ca4731682c168049af1ca222d1d2925ef7119c1a78e95b3b"}, - {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f1d7c69a1e9ca5faa75546fdd267f214f63f52f12692f9b3a2f6467c9e67d5e7"}, - {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:672b273040d5d5a6864a36287f3514efcd1d4b1b6a7480f294c4b1d1ee1b8de0"}, - {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4178f78d70e88f1c4a89ff1ffe9f43147185930bb962ee3979dba15f2b1cc799"}, - {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9804b9eb254d4b8cc83ab5a2002128f7d631dd427aa873c8727dba7f1f0d1c2b"}, - {file = "xxhash-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c09c49473212d9c87261d22c74370457cfff5db2ddfc7fd1e35c80c31a8c14ce"}, - {file = "xxhash-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ebbb1616435b4a194ce3466d7247df23499475c7ed4eb2681a1fa42ff766aff6"}, - {file = "xxhash-3.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:25dc66be3db54f8a2d136f695b00cfe88018e59ccff0f3b8f545869f376a8a46"}, - {file = "xxhash-3.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5"}, - {file = "xxhash-3.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520"}, - {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ad4457644c91a966f6fe137d7467636bdc51a6ce10a1d04f365c70d6a16d7e"}, - {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:248d3e83d119770f96003271fe41e049dd4ae52da2feb8f832b7a20e791d2920"}, - {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2070b6d5bbef5ee031666cf21d4953c16e92c2f8a24a94b5c240f8995ba3b1d0"}, - {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2746035f518f0410915e247877f7df43ef3372bf36cfa52cc4bc33e85242641"}, - {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ba6181514681c2591840d5632fcf7356ab287d4aff1c8dea20f3c78097088"}, - {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aac5010869240e95f740de43cd6a05eae180c59edd182ad93bf12ee289484fa"}, - {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4cb11d8debab1626181633d184b2372aaa09825bde709bf927704ed72765bed1"}, - {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b29728cff2c12f3d9f1d940528ee83918d803c0567866e062683f300d1d2eff3"}, - {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a15cbf3a9c40672523bdb6ea97ff74b443406ba0ab9bca10ceccd9546414bd84"}, - {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e66df260fed01ed8ea790c2913271641c58481e807790d9fca8bfd5a3c13844"}, - {file = "xxhash-3.4.1-cp311-cp311-win32.whl", hash = "sha256:e867f68a8f381ea12858e6d67378c05359d3a53a888913b5f7d35fbf68939d5f"}, - {file = "xxhash-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:200a5a3ad9c7c0c02ed1484a1d838b63edcf92ff538770ea07456a3732c577f4"}, - {file = "xxhash-3.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:1d03f1c0d16d24ea032e99f61c552cb2b77d502e545187338bea461fde253583"}, - {file = "xxhash-3.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4bbba9b182697a52bc0c9f8ec0ba1acb914b4937cd4a877ad78a3b3eeabefb3"}, - {file = "xxhash-3.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9fd28a9da300e64e434cfc96567a8387d9a96e824a9be1452a1e7248b7763b78"}, - {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6066d88c9329ab230e18998daec53d819daeee99d003955c8db6fc4971b45ca3"}, - {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93805bc3233ad89abf51772f2ed3355097a5dc74e6080de19706fc447da99cd3"}, - {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64da57d5ed586ebb2ecdde1e997fa37c27fe32fe61a656b77fabbc58e6fbff6e"}, - {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a97322e9a7440bf3c9805cbaac090358b43f650516486746f7fa482672593df"}, - {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe750d512982ee7d831838a5dee9e9848f3fb440e4734cca3f298228cc957a6"}, - {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fd79d4087727daf4d5b8afe594b37d611ab95dc8e29fe1a7517320794837eb7d"}, - {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:743612da4071ff9aa4d055f3f111ae5247342931dedb955268954ef7201a71ff"}, - {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b41edaf05734092f24f48c0958b3c6cbaaa5b7e024880692078c6b1f8247e2fc"}, - {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a90356ead70d715fe64c30cd0969072de1860e56b78adf7c69d954b43e29d9fa"}, - {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac56eebb364e44c85e1d9e9cc5f6031d78a34f0092fea7fc80478139369a8b4a"}, - {file = "xxhash-3.4.1-cp312-cp312-win32.whl", hash = "sha256:911035345932a153c427107397c1518f8ce456f93c618dd1c5b54ebb22e73747"}, - {file = "xxhash-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:f31ce76489f8601cc7b8713201ce94b4bd7b7ce90ba3353dccce7e9e1fee71fa"}, - {file = "xxhash-3.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:b5beb1c6a72fdc7584102f42c4d9df232ee018ddf806e8c90906547dfb43b2da"}, - {file = "xxhash-3.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6d42b24d1496deb05dee5a24ed510b16de1d6c866c626c2beb11aebf3be278b9"}, - {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b685fab18876b14a8f94813fa2ca80cfb5ab6a85d31d5539b7cd749ce9e3624"}, - {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419ffe34c17ae2df019a4685e8d3934d46b2e0bbe46221ab40b7e04ed9f11137"}, - {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e041ce5714f95251a88670c114b748bca3bf80cc72400e9f23e6d0d59cf2681"}, - {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc860d887c5cb2f524899fb8338e1bb3d5789f75fac179101920d9afddef284b"}, - {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:312eba88ffe0a05e332e3a6f9788b73883752be63f8588a6dc1261a3eaaaf2b2"}, - {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e01226b6b6a1ffe4e6bd6d08cfcb3ca708b16f02eb06dd44f3c6e53285f03e4f"}, - {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9f3025a0d5d8cf406a9313cd0d5789c77433ba2004b1c75439b67678e5136537"}, - {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:6d3472fd4afef2a567d5f14411d94060099901cd8ce9788b22b8c6f13c606a93"}, - {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:43984c0a92f06cac434ad181f329a1445017c33807b7ae4f033878d860a4b0f2"}, - {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a55e0506fdb09640a82ec4f44171273eeabf6f371a4ec605633adb2837b5d9d5"}, - {file = "xxhash-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:faec30437919555b039a8bdbaba49c013043e8f76c999670aef146d33e05b3a0"}, - {file = "xxhash-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c9e1b646af61f1fc7083bb7b40536be944f1ac67ef5e360bca2d73430186971a"}, - {file = "xxhash-3.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:961d948b7b1c1b6c08484bbce3d489cdf153e4122c3dfb07c2039621243d8795"}, - {file = "xxhash-3.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:719a378930504ab159f7b8e20fa2aa1896cde050011af838af7e7e3518dd82de"}, - {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74fb5cb9406ccd7c4dd917f16630d2e5e8cbbb02fc2fca4e559b2a47a64f4940"}, - {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5dab508ac39e0ab988039bc7f962c6ad021acd81fd29145962b068df4148c476"}, - {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c59f3e46e7daf4c589e8e853d700ef6607afa037bfad32c390175da28127e8c"}, - {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cc07256eff0795e0f642df74ad096f8c5d23fe66bc138b83970b50fc7f7f6c5"}, - {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9f749999ed80f3955a4af0eb18bb43993f04939350b07b8dd2f44edc98ffee9"}, - {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7688d7c02149a90a3d46d55b341ab7ad1b4a3f767be2357e211b4e893efbaaf6"}, - {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a8b4977963926f60b0d4f830941c864bed16aa151206c01ad5c531636da5708e"}, - {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8106d88da330f6535a58a8195aa463ef5281a9aa23b04af1848ff715c4398fb4"}, - {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4c76a77dbd169450b61c06fd2d5d436189fc8ab7c1571d39265d4822da16df22"}, - {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11f11357c86d83e53719c592021fd524efa9cf024dc7cb1dfb57bbbd0d8713f2"}, - {file = "xxhash-3.4.1-cp38-cp38-win32.whl", hash = "sha256:0c786a6cd74e8765c6809892a0d45886e7c3dc54de4985b4a5eb8b630f3b8e3b"}, - {file = "xxhash-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:aabf37fb8fa27430d50507deeab2ee7b1bcce89910dd10657c38e71fee835594"}, - {file = "xxhash-3.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6127813abc1477f3a83529b6bbcfeddc23162cece76fa69aee8f6a8a97720562"}, - {file = "xxhash-3.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef2e194262f5db16075caea7b3f7f49392242c688412f386d3c7b07c7733a70a"}, - {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71be94265b6c6590f0018bbf73759d21a41c6bda20409782d8117e76cd0dfa8b"}, - {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10e0a619cdd1c0980e25eb04e30fe96cf8f4324758fa497080af9c21a6de573f"}, - {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa122124d2e3bd36581dd78c0efa5f429f5220313479fb1072858188bc2d5ff1"}, - {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17032f5a4fea0a074717fe33477cb5ee723a5f428de7563e75af64bfc1b1e10"}, - {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca7783b20e3e4f3f52f093538895863f21d18598f9a48211ad757680c3bd006f"}, - {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d77d09a1113899fad5f354a1eb4f0a9afcf58cefff51082c8ad643ff890e30cf"}, - {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:21287bcdd299fdc3328cc0fbbdeaa46838a1c05391264e51ddb38a3f5b09611f"}, - {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dfd7a6cc483e20b4ad90224aeb589e64ec0f31e5610ab9957ff4314270b2bf31"}, - {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:543c7fcbc02bbb4840ea9915134e14dc3dc15cbd5a30873a7a5bf66039db97ec"}, - {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fe0a98d990e433013f41827b62be9ab43e3cf18e08b1483fcc343bda0d691182"}, - {file = "xxhash-3.4.1-cp39-cp39-win32.whl", hash = "sha256:b9097af00ebf429cc7c0e7d2fdf28384e4e2e91008130ccda8d5ae653db71e54"}, - {file = "xxhash-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:d699b921af0dcde50ab18be76c0d832f803034d80470703700cb7df0fbec2832"}, - {file = "xxhash-3.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:2be491723405e15cc099ade1280133ccfbf6322d2ef568494fb7d07d280e7eee"}, - {file = "xxhash-3.4.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:431625fad7ab5649368c4849d2b49a83dc711b1f20e1f7f04955aab86cd307bc"}, - {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc6dbd5fc3c9886a9e041848508b7fb65fd82f94cc793253990f81617b61fe49"}, - {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ff8dbd0ec97aec842476cb8ccc3e17dd288cd6ce3c8ef38bff83d6eb927817"}, - {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef73a53fe90558a4096e3256752268a8bdc0322f4692ed928b6cd7ce06ad4fe3"}, - {file = "xxhash-3.4.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:450401f42bbd274b519d3d8dcf3c57166913381a3d2664d6609004685039f9d3"}, - {file = "xxhash-3.4.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a162840cf4de8a7cd8720ff3b4417fbc10001eefdd2d21541a8226bb5556e3bb"}, - {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b736a2a2728ba45017cb67785e03125a79d246462dfa892d023b827007412c52"}, - {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0ae4c2e7698adef58710d6e7a32ff518b66b98854b1c68e70eee504ad061d8"}, - {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6322c4291c3ff174dcd104fae41500e75dad12be6f3085d119c2c8a80956c51"}, - {file = "xxhash-3.4.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:dd59ed668801c3fae282f8f4edadf6dc7784db6d18139b584b6d9677ddde1b6b"}, - {file = "xxhash-3.4.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92693c487e39523a80474b0394645b393f0ae781d8db3474ccdcead0559ccf45"}, - {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4603a0f642a1e8d7f3ba5c4c25509aca6a9c1cc16f85091004a7028607ead663"}, - {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa45e8cbfbadb40a920fe9ca40c34b393e0b067082d94006f7f64e70c7490a6"}, - {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:595b252943b3552de491ff51e5bb79660f84f033977f88f6ca1605846637b7c6"}, - {file = "xxhash-3.4.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:562d8b8f783c6af969806aaacf95b6c7b776929ae26c0cd941d54644ea7ef51e"}, - {file = "xxhash-3.4.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:41ddeae47cf2828335d8d991f2d2b03b0bdc89289dc64349d712ff8ce59d0647"}, - {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c44d584afdf3c4dbb3277e32321d1a7b01d6071c1992524b6543025fb8f4206f"}, - {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7bddb3a5b86213cc3f2c61500c16945a1b80ecd572f3078ddbbe68f9dabdfb"}, - {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ecb6c987b62437c2f99c01e97caf8d25660bf541fe79a481d05732e5236719c"}, - {file = "xxhash-3.4.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:696b4e18b7023527d5c50ed0626ac0520edac45a50ec7cf3fc265cd08b1f4c03"}, - {file = "xxhash-3.4.1.tar.gz", hash = "sha256:0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9"}, + {file = "xxhash-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212"}, + {file = "xxhash-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5d3e570ef46adaf93fc81b44aca6002b5a4d8ca11bd0580c07eac537f36680"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7cb29a034301e2982df8b1fe6328a84f4b676106a13e9135a0d7e0c3e9f806da"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d0d307d27099bb0cbeea7260eb39ed4fdb99c5542e21e94bb6fd29e49c57a23"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0342aafd421795d740e514bc9858ebddfc705a75a8c5046ac56d85fe97bf196"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dbbd9892c5ebffeca1ed620cf0ade13eb55a0d8c84e0751a6653adc6ac40d0c"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4cc2d67fdb4d057730c75a64c5923abfa17775ae234a71b0200346bfb0a7f482"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ec28adb204b759306a3d64358a5e5c07d7b1dd0ccbce04aa76cb9377b7b70296"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1328f6d8cca2b86acb14104e381225a3d7b42c92c4b86ceae814e5c400dbb415"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8d47ebd9f5d9607fd039c1fbf4994e3b071ea23eff42f4ecef246ab2b7334198"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b96d559e0fcddd3343c510a0fe2b127fbff16bf346dd76280b82292567523442"}, + {file = "xxhash-3.5.0-cp310-cp310-win32.whl", hash = "sha256:61c722ed8d49ac9bc26c7071eeaa1f6ff24053d553146d5df031802deffd03da"}, + {file = "xxhash-3.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:9bed5144c6923cc902cd14bb8963f2d5e034def4486ab0bbe1f58f03f042f9a9"}, + {file = "xxhash-3.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:893074d651cf25c1cc14e3bea4fceefd67f2921b1bb8e40fcfeba56820de80c6"}, + {file = "xxhash-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02c2e816896dc6f85922ced60097bcf6f008dedfc5073dcba32f9c8dd786f3c1"}, + {file = "xxhash-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6027dcd885e21581e46d3c7f682cfb2b870942feeed58a21c29583512c3f09f8"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1308fa542bbdbf2fa85e9e66b1077eea3a88bef38ee8a06270b4298a7a62a166"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28b2fdcee797e1c1961cd3bcd3d545cab22ad202c846235197935e1df2f8ef7"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:924361811732ddad75ff23e90efd9ccfda4f664132feecb90895bade6a1b4623"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89997aa1c4b6a5b1e5b588979d1da048a3c6f15e55c11d117a56b75c84531f5a"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c4f4e8c59837de103344eb1c8a3851f670309eb5c361f746805c5471b8c88"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbd2ecfbfee70bc1a4acb7461fa6af7748ec2ab08ac0fa298f281c51518f982c"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25b5a51dc3dfb20a10833c8eee25903fd2e14059e9afcd329c9da20609a307b2"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a8fb786fb754ef6ff8c120cb96629fb518f8eb5a61a16aac3a979a9dbd40a084"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a905ad00ad1e1c34fe4e9d7c1d949ab09c6fa90c919860c1534ff479f40fd12d"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:963be41bcd49f53af6d795f65c0da9b4cc518c0dd9c47145c98f61cb464f4839"}, + {file = "xxhash-3.5.0-cp311-cp311-win32.whl", hash = "sha256:109b436096d0a2dd039c355fa3414160ec4d843dfecc64a14077332a00aeb7da"}, + {file = "xxhash-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b702f806693201ad6c0a05ddbbe4c8f359626d0b3305f766077d51388a6bac58"}, + {file = "xxhash-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:c4dcb4120d0cc3cc448624147dba64e9021b278c63e34a38789b688fd0da9bf3"}, + {file = "xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00"}, + {file = "xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e"}, + {file = "xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8"}, + {file = "xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e"}, + {file = "xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2"}, + {file = "xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6"}, + {file = "xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c"}, + {file = "xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637"}, + {file = "xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43"}, + {file = "xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b"}, + {file = "xxhash-3.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6e5f70f6dca1d3b09bccb7daf4e087075ff776e3da9ac870f86ca316736bb4aa"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e76e83efc7b443052dd1e585a76201e40b3411fe3da7af4fe434ec51b2f163b"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33eac61d0796ca0591f94548dcfe37bb193671e0c9bcf065789b5792f2eda644"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ec70a89be933ea49222fafc3999987d7899fc676f688dd12252509434636622"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86b8e7f703ec6ff4f351cfdb9f428955859537125904aa8c963604f2e9d3e7"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0adfbd36003d9f86c8c97110039f7539b379f28656a04097e7434d3eaf9aa131"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:63107013578c8a730419adc05608756c3fa640bdc6abe806c3123a49fb829f43"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:683b94dbd1ca67557850b86423318a2e323511648f9f3f7b1840408a02b9a48c"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:5d2a01dcce81789cf4b12d478b5464632204f4c834dc2d064902ee27d2d1f0ee"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:a9d360a792cbcce2fe7b66b8d51274ec297c53cbc423401480e53b26161a290d"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:f0b48edbebea1b7421a9c687c304f7b44d0677c46498a046079d445454504737"}, + {file = "xxhash-3.5.0-cp37-cp37m-win32.whl", hash = "sha256:7ccb800c9418e438b44b060a32adeb8393764da7441eb52aa2aa195448935306"}, + {file = "xxhash-3.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c3bc7bf8cb8806f8d1c9bf149c18708cb1c406520097d6b0a73977460ea03602"}, + {file = "xxhash-3.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:74752ecaa544657d88b1d1c94ae68031e364a4d47005a90288f3bab3da3c970f"}, + {file = "xxhash-3.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dee1316133c9b463aa81aca676bc506d3f80d8f65aeb0bba2b78d0b30c51d7bd"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:602d339548d35a8579c6b013339fb34aee2df9b4e105f985443d2860e4d7ffaa"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:695735deeddfb35da1677dbc16a083445360e37ff46d8ac5c6fcd64917ff9ade"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1030a39ba01b0c519b1a82f80e8802630d16ab95dc3f2b2386a0b5c8ed5cbb10"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5bc08f33c4966f4eb6590d6ff3ceae76151ad744576b5fc6c4ba8edd459fdec"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160e0c19ee500482ddfb5d5570a0415f565d8ae2b3fd69c5dcfce8a58107b1c3"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f1abffa122452481a61c3551ab3c89d72238e279e517705b8b03847b1d93d738"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d5e9db7ef3ecbfc0b4733579cea45713a76852b002cf605420b12ef3ef1ec148"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:23241ff6423378a731d84864bf923a41649dc67b144debd1077f02e6249a0d54"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:82b833d5563fefd6fceafb1aed2f3f3ebe19f84760fdd289f8b926731c2e6e91"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a80ad0ffd78bef9509eee27b4a29e56f5414b87fb01a888353e3d5bda7038bd"}, + {file = "xxhash-3.5.0-cp38-cp38-win32.whl", hash = "sha256:50ac2184ffb1b999e11e27c7e3e70cc1139047e7ebc1aa95ed12f4269abe98d4"}, + {file = "xxhash-3.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:392f52ebbb932db566973693de48f15ce787cabd15cf6334e855ed22ea0be5b3"}, + {file = "xxhash-3.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc8cdd7f33d57f0468b0614ae634cc38ab9202c6957a60e31d285a71ebe0301"}, + {file = "xxhash-3.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0c48b6300cd0b0106bf49169c3e0536408dfbeb1ccb53180068a18b03c662ab"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe1a92cfbaa0a1253e339ccec42dbe6db262615e52df591b68726ab10338003f"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33513d6cc3ed3b559134fb307aae9bdd94d7e7c02907b37896a6c45ff9ce51bd"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eefc37f6138f522e771ac6db71a6d4838ec7933939676f3753eafd7d3f4c40bc"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a606c8070ada8aa2a88e181773fa1ef17ba65ce5dd168b9d08038e2a61b33754"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42eca420c8fa072cc1dd62597635d140e78e384a79bb4944f825fbef8bfeeef6"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:604253b2143e13218ff1ef0b59ce67f18b8bd1c4205d2ffda22b09b426386898"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6e93a5ad22f434d7876665444a97e713a8f60b5b1a3521e8df11b98309bff833"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:7a46e1d6d2817ba8024de44c4fd79913a90e5f7265434cef97026215b7d30df6"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:30eb2efe6503c379b7ab99c81ba4a779748e3830241f032ab46bd182bf5873af"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c8aa771ff2c13dd9cda8166d685d7333d389fae30a4d2bb39d63ab5775de8606"}, + {file = "xxhash-3.5.0-cp39-cp39-win32.whl", hash = "sha256:5ed9ebc46f24cf91034544b26b131241b699edbfc99ec5e7f8f3d02d6eb7fba4"}, + {file = "xxhash-3.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:220f3f896c6b8d0316f63f16c077d52c412619e475f9372333474ee15133a558"}, + {file = "xxhash-3.5.0-cp39-cp39-win_arm64.whl", hash = "sha256:a7b1d8315d9b5e9f89eb2933b73afae6ec9597a258d52190944437158b49d38e"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2014c5b3ff15e64feecb6b713af12093f75b7926049e26a580e94dcad3c73d8c"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fab81ef75003eda96239a23eda4e4543cedc22e34c373edcaf744e721a163986"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2febf914ace002132aa09169cc572e0d8959d0f305f93d5828c4836f9bc5a6"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d3a10609c51da2a1c0ea0293fc3968ca0a18bd73838455b5bca3069d7f8e32b"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a74f23335b9689b66eb6dbe2a931a88fcd7a4c2cc4b1cb0edba8ce381c7a1da"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b4154c00eb22e4d543f472cfca430e7962a0f1d0f3778334f2e08a7ba59363c"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d30bbc1644f726b825b3278764240f449d75f1a8bdda892e641d4a688b1494ae"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa0b72f2423e2aa53077e54a61c28e181d23effeaafd73fcb9c494e60930c8e"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13de2b76c1835399b2e419a296d5b38dc4855385d9e96916299170085ef72f57"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0691bfcc4f9c656bcb96cc5db94b4d75980b9d5589f2e59de790091028580837"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:297595fe6138d4da2c8ce9e72a04d73e58725bb60f3a19048bc96ab2ff31c692"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc1276d369452040cbb943300dc8abeedab14245ea44056a2943183822513a18"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2061188a1ba352fc699c82bff722f4baacb4b4b8b2f0c745d2001e56d0dfb514"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38c384c434021e4f62b8d9ba0bc9467e14d394893077e2c66d826243025e1f81"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e6a4dd644d72ab316b580a1c120b375890e4c52ec392d4aef3c63361ec4d77d1"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:531af8845aaadcadf951b7e0c1345c6b9c68a990eeb74ff9acd8501a0ad6a1c9"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ce379bcaa9fcc00f19affa7773084dd09f5b59947b3fb47a1ceb0179f91aaa1"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd1b2281d01723f076df3c8188f43f2472248a6b63118b036e641243656b1b0f"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c770750cc80e8694492244bca7251385188bc5597b6a39d98a9f30e8da984e0"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b150b8467852e1bd844387459aa6fbe11d7f38b56e901f9f3b3e6aba0d660240"}, + {file = "xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f"}, ] [[package]] @@ -8275,121 +8561,118 @@ tomli = ">=2.0.1" [[package]] name = "yarl" -version = "1.9.4" +version = "1.15.5" description = "Yet another URL library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, - {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, - {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, - {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, - {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, - {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, - {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, - {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, - {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, - {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, - {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, - {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, - {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, - {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, - {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, - {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, + {file = "yarl-1.15.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b6c57972a406ea0f61e3f28f2b3a780fb71fbe1d82d267afe5a2f889a83ee7e7"}, + {file = "yarl-1.15.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c3ac5bdcc1375c8ee52784adf94edbce37c471dd2100a117cfef56fe8dbc2b4"}, + {file = "yarl-1.15.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:68d21d0563d82aaf46163eac529adac301b20be3181b8a2811f7bd5615466055"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7d317fb80bc17ed4b34a9aad8b80cef34bea0993654f3e8566daf323def7ef9"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed9c72d5361cfd5af5ccadffa8f8077f4929640e1f938aa0f4b92c5a24996ac5"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb707859218e8335447b210f41a755e7b1367c33e87add884128bba144694a7f"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6563394492c96cb57f4dff0c69c63d2b28b5469c59c66f35a1e6451583cd0ab4"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c2d1109c8d92059314cc34dd8f0a31f74b720dc140744923ed7ca228bf9b491"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8fc727f0fb388debc771eaa7091c092bd2e8b6b4741b73354b8efadcf96d6031"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:94189746c5ad62e1014a16298130e696fe593d031d442ef135fb7787b7a1f820"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b06d8b05d0fafef204d635a4711283ddbf19c7c0facdc61b4b775f6e47e2d4be"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:de6917946dc6bc237d4b354e38aa13a232e0c7948fdbdb160edee3862e9d735f"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:34816f1d833433a16c4832562a050b0a60eac53dcb71b2032e6ebff82d74b6a7"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:19e2a4b2935f95fad0949f420514c5d862f5f18058fbbfd8854f496a97d9fd87"}, + {file = "yarl-1.15.5-cp310-cp310-win32.whl", hash = "sha256:30ca64521f1a96b72886dd9e8652f16eab11891b4572dcfcfc1ad6d6ccb27abd"}, + {file = "yarl-1.15.5-cp310-cp310-win_amd64.whl", hash = "sha256:86648c53b10c53db8b967a75fb41e0c89dbec7398f6525e34af2b6c456bb0ac0"}, + {file = "yarl-1.15.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e652aa9f8dfa808bc5b2da4d1f4e286cf1d640570fdfa72ffc0c1d16ba114651"}, + {file = "yarl-1.15.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21050b6cd569980fe20ceeab4baeb900d3f7247270475e42bafe117416a5496c"}, + {file = "yarl-1.15.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:18940191ec9a83bbfe63eea61c3e9d12474bb910d5613bce8fa46e84a80b75b2"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a082dc948045606f62dca0228ab24f13737180b253378d6443f5b2b9ef8beefe"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a843e692f9d5402b3455653f4607dc521de2385f01c5cad7ba4a87c46e2ea8d"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5093a453176a4fad4f9c3006f507cf300546190bb3e27944275a37cfd6323a65"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2597a589859b94d0a5e2f5d30fee95081867926e57cb751f8b44a7dd92da4e79"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5a1ca6eaabfe62718b87eac06d9a47b30cf92ffa065fee9196d3ecd24a3cf1"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4ac83b307cc4b8907345b52994055c6c3c2601ceb6fcb94c5ed6a93c6b4e8257"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:325e2beb2cd8654b276e7686a3cd203628dd3fe32d5c616e632bc35a2901fb16"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:75d04ba8ed335042328086e643e01165e0c24598216f72da709b375930ae3bdb"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7abd7d15aedb3961a967cc65f8144dbbca42e3626a21c5f4f29919cf43eeafb9"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:294c742a273f44511f14b03a9e06b66094dcdf4bbb75a5e23fead548fd5310ae"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:63d46606b20f80a6476f1044bab78e1a69c2e0747f174583e2f12fc70bad2170"}, + {file = "yarl-1.15.5-cp311-cp311-win32.whl", hash = "sha256:b1217102a455e3ac9ac293081093f21f0183e978c7692171ff669fee5296fa28"}, + {file = "yarl-1.15.5-cp311-cp311-win_amd64.whl", hash = "sha256:5848500b6a01497560969e8c3a7eb1b2570853c74a0ca6f67ebaf6064106c49b"}, + {file = "yarl-1.15.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d3309ee667f2d9c7ac9ecf44620d6b274bfdd8065b8c5019ff6795dd887b8fed"}, + {file = "yarl-1.15.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:96ce879799fee124d241ea3b84448378f638e290c49493d00b706f3fd57ec22b"}, + {file = "yarl-1.15.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c884dfa56b050f718ea3cbbfd972e29a6f07f63a7449b10d9a20d64f7eec92e2"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0327081978fe186c3390dd4f73f95f825d0bb9c74967e22c2a1a87735974d8f5"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:524b3bb7dff320e305bc979c65eddc0342548c56ea9241502f907853fe53c408"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd56de8b645421ff09c993fdb0ee9c5a3b50d290a8f55793b500d99b34d0c1ce"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c166ad987265bb343be58cdf4fbc4478cc1d81f2246d2be9a15f94393b269faa"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d56980374a10c74255fcea6ebcfb0aeca7166d212ee9fd7e823ddef35fb62ad0"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cbf36099a9b407e1456dbf55844743a98603fcba32d2a46fb3a698d926facf1b"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d7fa4b033e2f267e37aabcc36949fa89f9f1716a723395912147f9cf3fb437c7"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bb129f77ddaea2d8e6e00417b8d907448de3407af4eddacca0a515574ad71493"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:68e837b3edfcd037f9706157e7cb8efda832de6248c7d9e893e2638356dfae5d"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5b8af4165e097ff84d9bbb97bb4f4d7f71b9c1c9565a2d0e27d93e5f92dae220"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:70d074d5a96e0954fe6db81ff356f4361397da1cda3f7c127fc0902f671a087e"}, + {file = "yarl-1.15.5-cp312-cp312-win32.whl", hash = "sha256:362da97ad4360e4ef1dd24ccdd3bceb18332da7f40026a42f49b7edd686e31c3"}, + {file = "yarl-1.15.5-cp312-cp312-win_amd64.whl", hash = "sha256:9aa054d97033beac9cb9b19b7c0b8784b85b12cd17879087ca6bffba57884e02"}, + {file = "yarl-1.15.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5fadcf532fd9f6cbad71485ef8c2462dd9a91d3efc72ca01eb0970792c92552a"}, + {file = "yarl-1.15.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8b7dd6983c81523f9de0ae6334c3b7a3cb33283936e0525f80c4f713f54a9bb6"}, + {file = "yarl-1.15.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fcfd663dc88465ebe41c7c938bdc91c4b01cda96a0d64bf38fd66c1877323771"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd529e637cd23204bd82072f6637cff7af2516ad2c132e8f3342cbc84871f7d1"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b30f13fac56598474071a4f1ecd66c78fdaf2f8619042d7ca135f72dbb348cf"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44088ec0be82fba118ed29b6b429f80bf295297727adae4c257ac297e01e8bcd"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607683991bab8607e5158cd290dd8fdaa613442aeab802fe1c237d3a3eee7358"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da48cdff56b01ea4282a6d04b83b07a2088351a4a3ff7aacc1e7e9b6b04b90b9"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9162ea117ce8bad8ebc95b7376b4135988acd888d2cf4702f8281e3c11f8b81f"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:e8aa19c39cb20bfb16f0266df175a6004943122cf20707fbf0cacc21f6468a25"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5d6be369488d503c8edc14e2f63d71ab2a607041ad216a8ad444fa18e8dea792"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6e2c674cfe4c03ad7a4d536b1f808221f0d11a360486b4b032d2557c0bd633ad"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:041bafaa82b77fd4ec2826d42a55461ec86d999adf7ed9644eef7e8a9febb366"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2eeb9ba53c055740cd282ae9d34eb7970d65e73a46f15adec4b0c1b0f2e55cc2"}, + {file = "yarl-1.15.5-cp313-cp313-win32.whl", hash = "sha256:73143dd279e641543da52c55652ad7b4c7c5f79e797f124f58f04cc060f14271"}, + {file = "yarl-1.15.5-cp313-cp313-win_amd64.whl", hash = "sha256:94ab1185900f43760d5487c8e49f5f1a66f864e36092f282f1813597479b9dfa"}, + {file = "yarl-1.15.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6b3d2767bd64c62909ea33525b954ba05c8f9726bfdf2141d175da4e344f19ae"}, + {file = "yarl-1.15.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:44359c52af9c383e5107f3b6301446fc8269599721fa42fafb2afb5f31a42dcb"}, + {file = "yarl-1.15.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6493da9ba5c551978c679ab04856c2cf8f79c316e8ec8c503460a135705edc3b"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6b6e95bc621c11cf9ff21012173337e789f2461ebc3b4e5bf65c74ef69adb8"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7983290ede3aaa2c9620879530849532529b4dcbf5b12a0b6a91163a773eadb9"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07a4b53abe85813c538b9cdbb02909ebe3734e3af466a587df516e960d500cc8"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5882faa2a6e684f65ee44f18c701768749a950cbd5e72db452fc07805f6bdec0"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e27861251d9c094f641d39a8a78dd2371fb9a252ea2f689d1ad353a31d46a0bc"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8669a110f655c9eb22f16fb68a7d4942020aeaa09f1def584a80183e3e89953c"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:10bfe0bef4cf5ea0383886beda004071faadedf2647048b9f876664284c5b60d"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f7de0d4b6b4d8a77e422eb54d765255c0ec6883ee03b8fd537101633948619d7"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:00bb3a559d7bd006a5302ecd7e409916939106a8cdbe31f4eb5e5b9ffcca57ea"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:06ec070a2d71415f90dbe9d70af3158e7da97a128519dba2d1581156ee27fb92"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b997a806846c00d1f41d6a251803732837771b2091bead7566f68820e317bfe7"}, + {file = "yarl-1.15.5-cp39-cp39-win32.whl", hash = "sha256:7825506fbee4055265528ec3532a8197ff26fc53d4978917a4c8ddbb4c1667d7"}, + {file = "yarl-1.15.5-cp39-cp39-win_amd64.whl", hash = "sha256:71730658be0b5de7c570a9795d7404c577b2313c1db370407092c66f70e04ccb"}, + {file = "yarl-1.15.5-py3-none-any.whl", hash = "sha256:625f31d6650829fba4030b4e7bdb2d69e41510dddfa29a1da27076c199521757"}, + {file = "yarl-1.15.5.tar.gz", hash = "sha256:8249147ee81c1cf4d1dc6f26ba28a1b9d92751529f83c308ad02164bb93abd0d"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" +propcache = ">=0.2.0" [[package]] name = "zipp" -version = "3.19.2" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, - {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [extras] anthropic = ["anthropic"] @@ -8405,4 +8688,4 @@ vectordb = ["faiss-cpu", "numpy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "97c2443e924bdc7c4cae794518c80bba648efd3144740717e412ebb907f1e092" +content-hash = "94a1c482c8626f28e65e70b3816e78436d0dfa8cdca23b4f06e627731be7a0e8" diff --git a/pyproject.toml b/pyproject.toml index 39346d8b2..5e186345e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "guardrails-ai" -version = "0.5.12" +version = "0.6.0-alpha1" description = "Adding guardrails to large language models." authors = ["Guardrails AI "] license = "Apache License 2.0" @@ -57,7 +57,7 @@ opentelemetry-exporter-otlp-proto-http = "^1.24.0" guardrails-hub-types = "^0.0.4" guardrails-api-client = ">=0.3.8" diff-match-patch = "^20230430" -guardrails-api = ">=0.1.0,<0.2.0" +guardrails-api = ">=0.1.0a1,<0.2.0" mlflow = {version = ">=2.0.1", optional = true} uvloop = {version = "^0.20.0", optional = true} semver = "^3.0.2" From e5ccff3cc60d1fc4316d0fe4f1625b910e6ab8ca Mon Sep 17 00:00:00 2001 From: David Tam Date: Mon, 21 Oct 2024 09:45:54 -0700 Subject: [PATCH 46/71] renable history by default --- guardrails/guard.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/guardrails/guard.py b/guardrails/guard.py index 85129ee1b..512ae3b92 100644 --- a/guardrails/guard.py +++ b/guardrails/guard.py @@ -1113,13 +1113,13 @@ def _single_server_call(self, *, payload: Dict[str, Any]) -> ValidationOutcome[O validation_passed=False, error="The response from the server was empty!", ) - - # TODO reenable this when we have history support in - # multi-node server environments - # guard_history = self._api_client.get_history( - # self.name, validation_output.call_id - # ) - # self.history.extend([Call.from_interface(call) for call in guard_history]) + if os.environ.get("GUARD_HISTORY_ENABLED", "true").lower() == "true": + guard_history = self._api_client.get_history( + self.name, validation_output.call_id + ) + self.history.extend( + [Call.from_interface(call) for call in guard_history] + ) validation_summaries = [] if self.history.last and self.history.last.iterations.last: @@ -1184,13 +1184,14 @@ def _stream_server_call( ) # TODO reenable this when sever supports multi-node history - # if validation_output: - # guard_history = self._api_client.get_history( - # self.name, validation_output.call_id - # ) - # self.history.extend( - # [Call.from_interface(call) for call in guard_history] - # ) + if os.environ.get("GUARD_HISTORY_ENABLED", "true").lower() == "true": + if validation_output: + guard_history = self._api_client.get_history( + self.name, validation_output.call_id + ) + self.history.extend( + [Call.from_interface(call) for call in guard_history] + ) else: raise ValueError("Guard does not have an api client!") From e167a6d77c03c9102214f3192f383c1698433e94 Mon Sep 17 00:00:00 2001 From: David Tam Date: Mon, 21 Oct 2024 10:41:55 -0700 Subject: [PATCH 47/71] expose messages to prompt helper and finish docs for it --- docs/how_to_guides/using_llms.md | 7 +++---- docs/migration_guides/0-6-migration.md | 22 +++++++++++++++++++++- guardrails/__init__.py | 5 ++++- guardrails/llm_providers.py | 21 +++------------------ guardrails/prompt/__init__.py | 2 ++ guardrails/run/__init__.py | 3 +-- guardrails/run/utils.py | 12 ------------ guardrails/utils/docs_utils.py | 21 ++++++++++++++++++++- guardrails/utils/prompt_utils.py | 20 +++++++++++++++++++- 9 files changed, 73 insertions(+), 40 deletions(-) diff --git a/docs/how_to_guides/using_llms.md b/docs/how_to_guides/using_llms.md index f085baac2..c8c3b5538 100644 --- a/docs/how_to_guides/using_llms.md +++ b/docs/how_to_guides/using_llms.md @@ -306,7 +306,6 @@ guard = Guard().use(ProfanityFree()) # Function that takes the prompt as a string and returns the LLM output as string def my_llm_api( *, - messages: Optional[list[dict]] = None, **kwargs ) -> str: """Custom LLM API wrapper. @@ -314,16 +313,16 @@ def my_llm_api( At least one of messages should be provided. Args: - messages (list[dict]): The message history to be passed to the LLM API **kwargs: Any additional arguments to be passed to the LLM API Returns: str: The output of the LLM API """ - + messages = kwargs.pop("messages", []) + updated_messages = some_message_processing(messages) # Call your LLM API here # What you pass to the llm will depend on what arguments it accepts. - llm_output = some_llm(messages, **kwargs) + llm_output = some_llm(updated_messages, **kwargs) return llm_output diff --git a/docs/migration_guides/0-6-migration.md b/docs/migration_guides/0-6-migration.md index e77b82884..6d7871553 100644 --- a/docs/migration_guides/0-6-migration.md +++ b/docs/migration_guides/0-6-migration.md @@ -90,4 +90,24 @@ guard( These callables are being removed in favor of support through passing no callable and setting the appropriate api key and model argument. See LINK TO DOCS for more info. ### Prompt no longer a required positional argument on custom callables -Custom callables will no longer throw an error if the prompt arg is missing in their declaration and guardrails will no longer pass prompt as the first argument. They need to be updated to the messages kwarg to get text input. If a custom callables underlying llm only accepts a single string a helper exists that can compose messages into one otherwise some code to adapt them will be required. \ No newline at end of file +Custom callables will no longer throw an error if the prompt arg is missing in their declaration and guardrails will no longer pass prompt as the first argument. They need to be updated to the messages kwarg to get text input. If a custom callables underlying llm only accepts a single string a helper exists that can compose messages into one otherwise some code to adapt them will be required. + +```py +from guardrails import messages_to_prompt_string + +class CustomCallableCallable(PromptCallableBase): + def llm_api( + self, + *args, + **kwargs, + ) -> str: + messages = kwargs.pop("messages", []) + prompt = messages_to_prompt_string(messages) + + llm_string_output = some_llm_call_requiring_prompt( + prompt, + *args, + **kwargs, + ) + return llm_string_output +```` \ No newline at end of file diff --git a/guardrails/__init__.py b/guardrails/__init__.py index 6dcb563b7..678ecbaa7 100644 --- a/guardrails/__init__.py +++ b/guardrails/__init__.py @@ -4,13 +4,14 @@ from guardrails.async_guard import AsyncGuard from guardrails.llm_providers import PromptCallableBase from guardrails.logging_utils import configure_logging -from guardrails.prompt import Instructions, Prompt +from guardrails.prompt import Instructions, Prompt, Messages from guardrails.utils import constants, docs_utils from guardrails.types.on_fail import OnFailAction from guardrails.validator_base import Validator, register_validator from guardrails.settings import settings from guardrails.hub.install import install from guardrails.classes.validation_outcome import ValidationOutcome +from guardrails.utils.prompt_utils import messages_to_prompt_string __all__ = [ "Guard", @@ -22,8 +23,10 @@ "constants", "docs_utils", "configure_logging", + "messages_to_prompt_string", "Prompt", "Instructions", + "Messages", "settings", "install", "ValidationOutcome", diff --git a/guardrails/llm_providers.py b/guardrails/llm_providers.py index 3f6972c88..fda296d03 100644 --- a/guardrails/llm_providers.py +++ b/guardrails/llm_providers.py @@ -31,22 +31,7 @@ from guardrails.utils.safe_get import safe_get from guardrails.telemetry import trace_llm_call, trace_operation - -# todo fix circular import -def messages_string( - messages: Union[list[dict[str, Union[str, Prompt, Instructions]]], MessageHistory], -) -> str: - messages_copy = "" - for msg in messages: - content = ( - msg["content"].source # type: ignore - if isinstance(msg["content"], Prompt) - or isinstance(msg["content"], Instructions) # type: ignore - else msg["content"] # type: ignore - ) - messages_copy += content - return messages_copy - +from guardrails.utils.prompt_utils import messages_to_prompt_string ### # Synchronous wrappers @@ -296,7 +281,7 @@ def _invoke_llm( "The `torch` package is not installed. " "Install with `pip install torch`" ) - prompt = messages_string(messages) + prompt = messages_to_prompt_string(messages) tokenizer = kwargs.pop("tokenizer") if not tokenizer: raise UserFacingException( @@ -408,7 +393,7 @@ def _invoke_llm( temperature = kwargs.pop("temperature", None) if temperature == 0: temperature = None - prompt = messages_string(messages) + prompt = messages_to_prompt_string(messages) trace_operation( input_mime_type="application/json", input_value={ diff --git a/guardrails/prompt/__init__.py b/guardrails/prompt/__init__.py index 15df888b1..2f111cb32 100644 --- a/guardrails/prompt/__init__.py +++ b/guardrails/prompt/__init__.py @@ -1,7 +1,9 @@ from .instructions import Instructions from .prompt import Prompt +from .messages import Messages __all__ = [ "Prompt", "Instructions", + "Messages", ] diff --git a/guardrails/run/__init__.py b/guardrails/run/__init__.py index 150ed41ff..981bf17f9 100644 --- a/guardrails/run/__init__.py +++ b/guardrails/run/__init__.py @@ -2,7 +2,7 @@ from guardrails.run.runner import Runner from guardrails.run.stream_runner import StreamRunner from guardrails.run.async_stream_runner import AsyncStreamRunner -from guardrails.run.utils import messages_source, messages_string +from guardrails.run.utils import messages_source __all__ = [ "Runner", @@ -10,5 +10,4 @@ "StreamRunner", "AsyncStreamRunner", "messages_source", - "messages_string", ] diff --git a/guardrails/run/utils.py b/guardrails/run/utils.py index d742f6481..6de917ce5 100644 --- a/guardrails/run/utils.py +++ b/guardrails/run/utils.py @@ -28,18 +28,6 @@ def messages_source(messages: MessageHistory) -> MessageHistory: return messages_copy -def messages_string(messages: MessageHistory) -> str: - messages_copy = "" - for msg in messages: - content = ( - msg["content"].source - if isinstance(msg["content"], Prompt) - else msg["content"] - ) - messages_copy += content - return messages_copy - - def preprocess_prompt_for_string_output( prompt_callable: PromptCallableBase, instructions: Optional[Instructions], diff --git a/guardrails/utils/docs_utils.py b/guardrails/utils/docs_utils.py index 5305e5e4f..8dd5afafd 100644 --- a/guardrails/utils/docs_utils.py +++ b/guardrails/utils/docs_utils.py @@ -1,6 +1,8 @@ import typing as t -from guardrails.prompt import Prompt +from guardrails.prompt import Prompt, Instructions + +from guardrails.types.inputs import MessageHistory try: import tiktoken @@ -19,6 +21,23 @@ nltk.download("punkt") +def messages_to_prompt_string( + messages: t.Union[ + list[dict[str, t.Union[str, Prompt, Instructions]]], MessageHistory + ], +) -> str: + messages_copy = "" + for msg in messages: + content = ( + msg["content"].source # type: ignore + if isinstance(msg["content"], Prompt) + or isinstance(msg["content"], Instructions) # type: ignore + else msg["content"] # type: ignore + ) + messages_copy += content + return messages_copy + + class TextSplitter: """Split the docs into chunks with token boundaries.""" diff --git a/guardrails/utils/prompt_utils.py b/guardrails/utils/prompt_utils.py index 9b16fd03e..398a2c85d 100644 --- a/guardrails/utils/prompt_utils.py +++ b/guardrails/utils/prompt_utils.py @@ -1,10 +1,13 @@ import json import re -from typing import Any, Dict +from typing import Any, Dict, Union from guardrails.classes.output_type import OutputTypes from guardrails.types.validator import ValidatorMap +from guardrails.prompt.prompt import Prompt +from guardrails.prompt.instructions import Instructions +from guardrails.types.inputs import MessageHistory def prompt_uses_xml(prompt: str) -> bool: @@ -47,3 +50,18 @@ def prompt_content_for_schema( if output_type == OutputTypes.STRING: return prompt_content_for_string_schema(output_schema, validator_map, json_path) return json.dumps(output_schema) + + +def messages_to_prompt_string( + messages: Union[list[dict[str, Union[str, Prompt, Instructions]]], MessageHistory], +) -> str: + messages_copy = "" + for msg in messages: + content = ( + msg["content"].source # type: ignore + if isinstance(msg["content"], Prompt) + or isinstance(msg["content"], Instructions) # type: ignore + else msg["content"] # type: ignore + ) + messages_copy += content + return messages_copy From 7898e76747b9ae364d903e04381e120c8fd773bc Mon Sep 17 00:00:00 2001 From: David Tam Date: Mon, 21 Oct 2024 13:47:20 -0700 Subject: [PATCH 48/71] indention --- guardrails/guard.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/guardrails/guard.py b/guardrails/guard.py index 512ae3b92..763a5350e 100644 --- a/guardrails/guard.py +++ b/guardrails/guard.py @@ -1183,15 +1183,14 @@ def _stream_server_call( validation_passed=(validation_output.validation_passed is True), ) - # TODO reenable this when sever supports multi-node history if os.environ.get("GUARD_HISTORY_ENABLED", "true").lower() == "true": if validation_output: guard_history = self._api_client.get_history( self.name, validation_output.call_id ) - self.history.extend( - [Call.from_interface(call) for call in guard_history] - ) + self.history.extend( + [Call.from_interface(call) for call in guard_history] + ) else: raise ValueError("Guard does not have an api client!") From 7d7240b81ebbc6e665dcfd02f168699f7ec9417d Mon Sep 17 00:00:00 2001 From: David Tam Date: Mon, 21 Oct 2024 13:53:07 -0700 Subject: [PATCH 49/71] fix test out of main --- tests/integration_tests/test_async_streaming.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/integration_tests/test_async_streaming.py b/tests/integration_tests/test_async_streaming.py index cb6fe18c0..e09ab47ff 100644 --- a/tests/integration_tests/test_async_streaming.py +++ b/tests/integration_tests/test_async_streaming.py @@ -176,8 +176,7 @@ async def test_async_streaming_fix_behavior_two_validators(mocker): assert ( text == """, under golden bridges, roams, - hills, his home. -dreams of fog, and salty air, + hills, his home.dreams of fog, and salty air, in his heart, he's always there.""" ) assert ( From 60605fa0051faad6f7d4f5955727cf55302f2847 Mon Sep 17 00:00:00 2001 From: David Tam Date: Mon, 21 Oct 2024 14:43:34 -0700 Subject: [PATCH 50/71] update api client to point to its alpha --- poetry.lock | 293 ++++++++++++++++++++++++------------------------- pyproject.toml | 2 +- 2 files changed, 147 insertions(+), 148 deletions(-) diff --git a/poetry.lock b/poetry.lock index eafa419f2..fc01a2bfd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiocache" @@ -531,17 +531,17 @@ files = [ [[package]] name = "boto3" -version = "1.35.44" +version = "1.35.45" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.35.44-py3-none-any.whl", hash = "sha256:18416d07b41e6094101a44f8b881047dcec6b846dad0b9f83b9bbf2f0cd93d07"}, - {file = "boto3-1.35.44.tar.gz", hash = "sha256:7f8e8a252458d584d8cf7877c372c4f74ec103356eedf43d2dd9e479f47f3639"}, + {file = "boto3-1.35.45-py3-none-any.whl", hash = "sha256:f16c7edfcbbeb0a0c22d67d6ebbfcb332fa78d3ea88275e082260ba04fe65347"}, + {file = "boto3-1.35.45.tar.gz", hash = "sha256:9f4a081e1940846171b51d903000a04322f1356d53225ce1028fc1760a155a70"}, ] [package.dependencies] -botocore = ">=1.35.44,<1.36.0" +botocore = ">=1.35.45,<1.36.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -550,13 +550,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.35.44" +version = "1.35.45" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.35.44-py3-none-any.whl", hash = "sha256:55388e80624401d017a9a2b8109afd94814f7e666b53e28fce51375cfa8d9326"}, - {file = "botocore-1.35.44.tar.gz", hash = "sha256:1fcd97b966ad8a88de4106fe1bd3bbd6d8dadabe99bbd4a6aadcf11cb6c66b39"}, + {file = "botocore-1.35.45-py3-none-any.whl", hash = "sha256:e07e170975721c94ec1e3bf71a484552ad63e2499f769dd14f9f37375b4993fd"}, + {file = "botocore-1.35.45.tar.gz", hash = "sha256:9a898bfdd6b0027fee2018711192c15c2716bf6a7096b1168bd8a896df3664a1"}, ] [package.dependencies] @@ -993,73 +993,73 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist" [[package]] name = "coverage" -version = "7.6.3" +version = "7.6.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6da42bbcec130b188169107ecb6ee7bd7b4c849d24c9370a0c884cf728d8e976"}, - {file = "coverage-7.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c222958f59b0ae091f4535851cbb24eb57fc0baea07ba675af718fb5302dddb2"}, - {file = "coverage-7.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab84a8b698ad5a6c365b08061920138e7a7dd9a04b6feb09ba1bfae68346ce6d"}, - {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70a6756ce66cd6fe8486c775b30889f0dc4cb20c157aa8c35b45fd7868255c5c"}, - {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c2e6fa98032fec8282f6b27e3f3986c6e05702828380618776ad794e938f53a"}, - {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:921fbe13492caf6a69528f09d5d7c7d518c8d0e7b9f6701b7719715f29a71e6e"}, - {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6d99198203f0b9cb0b5d1c0393859555bc26b548223a769baf7e321a627ed4fc"}, - {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87cd2e29067ea397a47e352efb13f976eb1b03e18c999270bb50589323294c6e"}, - {file = "coverage-7.6.3-cp310-cp310-win32.whl", hash = "sha256:a3328c3e64ea4ab12b85999eb0779e6139295bbf5485f69d42cf794309e3d007"}, - {file = "coverage-7.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bca4c8abc50d38f9773c1ec80d43f3768df2e8576807d1656016b9d3eeaa96fd"}, - {file = "coverage-7.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c51ef82302386d686feea1c44dbeef744585da16fcf97deea2a8d6c1556f519b"}, - {file = "coverage-7.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ca37993206402c6c35dc717f90d4c8f53568a8b80f0bf1a1b2b334f4d488fba"}, - {file = "coverage-7.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c77326300b839c44c3e5a8fe26c15b7e87b2f32dfd2fc9fee1d13604347c9b38"}, - {file = "coverage-7.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e484e479860e00da1f005cd19d1c5d4a813324e5951319ac3f3eefb497cc549"}, - {file = "coverage-7.6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c6c0f4d53ef603397fc894a895b960ecd7d44c727df42a8d500031716d4e8d2"}, - {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:37be7b5ea3ff5b7c4a9db16074dc94523b5f10dd1f3b362a827af66a55198175"}, - {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:43b32a06c47539fe275106b376658638b418c7cfdfff0e0259fbf877e845f14b"}, - {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee77c7bef0724165e795b6b7bf9c4c22a9b8468a6bdb9c6b4281293c6b22a90f"}, - {file = "coverage-7.6.3-cp311-cp311-win32.whl", hash = "sha256:43517e1f6b19f610a93d8227e47790722c8bf7422e46b365e0469fc3d3563d97"}, - {file = "coverage-7.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:04f2189716e85ec9192df307f7c255f90e78b6e9863a03223c3b998d24a3c6c6"}, - {file = "coverage-7.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27bd5f18d8f2879e45724b0ce74f61811639a846ff0e5c0395b7818fae87aec6"}, - {file = "coverage-7.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d546cfa78844b8b9c1c0533de1851569a13f87449897bbc95d698d1d3cb2a30f"}, - {file = "coverage-7.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9975442f2e7a5cfcf87299c26b5a45266ab0696348420049b9b94b2ad3d40234"}, - {file = "coverage-7.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:583049c63106c0555e3ae3931edab5669668bbef84c15861421b94e121878d3f"}, - {file = "coverage-7.6.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2341a78ae3a5ed454d524206a3fcb3cec408c2a0c7c2752cd78b606a2ff15af4"}, - {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a4fb91d5f72b7e06a14ff4ae5be625a81cd7e5f869d7a54578fc271d08d58ae3"}, - {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e279f3db904e3b55f520f11f983cc8dc8a4ce9b65f11692d4718ed021ec58b83"}, - {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa23ce39661a3e90eea5f99ec59b763b7d655c2cada10729ed920a38bfc2b167"}, - {file = "coverage-7.6.3-cp312-cp312-win32.whl", hash = "sha256:52ac29cc72ee7e25ace7807249638f94c9b6a862c56b1df015d2b2e388e51dbd"}, - {file = "coverage-7.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:40e8b1983080439d4802d80b951f4a93d991ef3261f69e81095a66f86cf3c3c6"}, - {file = "coverage-7.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9134032f5aa445ae591c2ba6991d10136a1f533b1d2fa8f8c21126468c5025c6"}, - {file = "coverage-7.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:99670790f21a96665a35849990b1df447993880bb6463a0a1d757897f30da929"}, - {file = "coverage-7.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc7d6b380ca76f5e817ac9eef0c3686e7834c8346bef30b041a4ad286449990"}, - {file = "coverage-7.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7b26757b22faf88fcf232f5f0e62f6e0fd9e22a8a5d0d5016888cdfe1f6c1c4"}, - {file = "coverage-7.6.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c59d6a4a4633fad297f943c03d0d2569867bd5372eb5684befdff8df8522e39"}, - {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f263b18692f8ed52c8de7f40a0751e79015983dbd77b16906e5b310a39d3ca21"}, - {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79644f68a6ff23b251cae1c82b01a0b51bc40c8468ca9585c6c4b1aeee570e0b"}, - {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71967c35828c9ff94e8c7d405469a1fb68257f686bca7c1ed85ed34e7c2529c4"}, - {file = "coverage-7.6.3-cp313-cp313-win32.whl", hash = "sha256:e266af4da2c1a4cbc6135a570c64577fd3e6eb204607eaff99d8e9b710003c6f"}, - {file = "coverage-7.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:ea52bd218d4ba260399a8ae4bb6b577d82adfc4518b93566ce1fddd4a49d1dce"}, - {file = "coverage-7.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8d4c6ea0f498c7c79111033a290d060c517853a7bcb2f46516f591dab628ddd3"}, - {file = "coverage-7.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:331b200ad03dbaa44151d74daeb7da2cf382db424ab923574f6ecca7d3b30de3"}, - {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54356a76b67cf8a3085818026bb556545ebb8353951923b88292556dfa9f812d"}, - {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebec65f5068e7df2d49466aab9128510c4867e532e07cb6960075b27658dca38"}, - {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33a785ea8354c480515e781554d3be582a86297e41ccbea627a5c632647f2cd"}, - {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f7ddb920106bbbbcaf2a274d56f46956bf56ecbde210d88061824a95bdd94e92"}, - {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:70d24936ca6c15a3bbc91ee9c7fc661132c6f4c9d42a23b31b6686c05073bde5"}, - {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c30e42ea11badb147f0d2e387115b15e2bd8205a5ad70d6ad79cf37f6ac08c91"}, - {file = "coverage-7.6.3-cp313-cp313t-win32.whl", hash = "sha256:365defc257c687ce3e7d275f39738dcd230777424117a6c76043459db131dd43"}, - {file = "coverage-7.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:23bb63ae3f4c645d2d82fa22697364b0046fbafb6261b258a58587441c5f7bd0"}, - {file = "coverage-7.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da29ceabe3025a1e5a5aeeb331c5b1af686daab4ff0fb4f83df18b1180ea83e2"}, - {file = "coverage-7.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df8c05a0f574d480947cba11b947dc41b1265d721c3777881da2fb8d3a1ddfba"}, - {file = "coverage-7.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec1e3b40b82236d100d259854840555469fad4db64f669ab817279eb95cd535c"}, - {file = "coverage-7.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4adeb878a374126f1e5cf03b87f66279f479e01af0e9a654cf6d1509af46c40"}, - {file = "coverage-7.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43d6a66e33b1455b98fc7312b124296dad97a2e191c80320587234a77b1b736e"}, - {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1990b1f4e2c402beb317840030bb9f1b6a363f86e14e21b4212e618acdfce7f6"}, - {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:12f9515d875859faedb4144fd38694a761cd2a61ef9603bf887b13956d0bbfbb"}, - {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99ded130555c021d99729fabd4ddb91a6f4cc0707df4b1daf912c7850c373b13"}, - {file = "coverage-7.6.3-cp39-cp39-win32.whl", hash = "sha256:c3a79f56dee9136084cf84a6c7c4341427ef36e05ae6415bf7d787c96ff5eaa3"}, - {file = "coverage-7.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:aac7501ae73d4a02f4b7ac8fcb9dc55342ca98ffb9ed9f2dfb8a25d53eda0e4d"}, - {file = "coverage-7.6.3-pp39.pp310-none-any.whl", hash = "sha256:b9853509b4bf57ba7b1f99b9d866c422c9c5248799ab20e652bbb8a184a38181"}, - {file = "coverage-7.6.3.tar.gz", hash = "sha256:bb7d5fe92bd0dc235f63ebe9f8c6e0884f7360f88f3411bfed1350c872ef2054"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a"}, + {file = "coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa"}, + {file = "coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, + {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, + {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, + {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, + {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, + {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, + {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, + {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, + {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901"}, + {file = "coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09"}, + {file = "coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f"}, + {file = "coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e"}, + {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, ] [package.dependencies] @@ -1790,13 +1790,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.9.0" +version = "2024.10.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.9.0-py3-none-any.whl", hash = "sha256:a0947d552d8a6efa72cc2c730b12c41d043509156966cca4fb157b0f2a0c574b"}, - {file = "fsspec-2024.9.0.tar.gz", hash = "sha256:4b0afb90c2f21832df142f292649035d80b421f60a9e1c027802e5a0da2b04e8"}, + {file = "fsspec-2024.10.0-py3-none-any.whl", hash = "sha256:03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871"}, + {file = "fsspec-2024.10.0.tar.gz", hash = "sha256:eda2d8a4116d4f2429db8550f2457da57279247dd930bb12f821b58391359493"}, ] [package.extras] @@ -2185,13 +2185,13 @@ dev = ["coverage", "gunicorn (>=22.0.0,<23)", "pytest", "pytest-mock", "ruff"] [[package]] name = "guardrails-api-client" -version = "0.3.13" +version = "0.4.0a1" description = "Guardrails API Client." optional = false python-versions = "<4,>=3.8" files = [ - {file = "guardrails_api_client-0.3.13-py3-none-any.whl", hash = "sha256:c9c5297355d022428a573e6e845d4876cdfbda81635d9c65fb107db1f3bb0ac2"}, - {file = "guardrails_api_client-0.3.13.tar.gz", hash = "sha256:4f0f1a7e7ef100138fb99634d75e3330e9abba9d4e8363f27af8bc7e722e2d88"}, + {file = "guardrails_api_client-0.4.0a1-py3-none-any.whl", hash = "sha256:163352bc09b295966d206bc5e912edb29fc3cae8f7749a6ceea1a80aae816029"}, + {file = "guardrails_api_client-0.4.0a1.tar.gz", hash = "sha256:102e70cd53704298cd3d71c58bdac71bc6bfa2c341bc3b336a4ec434c540e9b4"}, ] [package.dependencies] @@ -2298,13 +2298,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "huggingface-hub" -version = "0.26.0" +version = "0.26.1" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.26.0-py3-none-any.whl", hash = "sha256:e43b8f36042b2103b48dea822535e08f5f089c4aa7013a067fca7b4ebf7f85a3"}, - {file = "huggingface_hub-0.26.0.tar.gz", hash = "sha256:524fe9281b015b76aa73ff1a83bf1cbe8cab851c9ac5ae5fcd2a25d5173ce629"}, + {file = "huggingface_hub-0.26.1-py3-none-any.whl", hash = "sha256:5927a8fc64ae68859cd954b7cc29d1c8390a5e15caba6d3d349c973be8fdacf3"}, + {file = "huggingface_hub-0.26.1.tar.gz", hash = "sha256:414c0d9b769eecc86c70f9d939d0f48bb28e8461dd1130021542eff0212db890"}, ] [package.dependencies] @@ -3364,13 +3364,13 @@ requests-toolbelt = ">=1.0.0,<2.0.0" [[package]] name = "litellm" -version = "1.49.7" +version = "1.50.1" description = "Library to easily interface with LLM API providers" optional = false python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" files = [ - {file = "litellm-1.49.7-py3-none-any.whl", hash = "sha256:30f0c5b1b0a1466ae29006f3d3b29dd8a3836387375cc2efbde9a5d76bc92673"}, - {file = "litellm-1.49.7.tar.gz", hash = "sha256:9442b5c0922580ce3d536030247800c0112c64c0f123aad1a4a87872e51f0e09"}, + {file = "litellm-1.50.1-py3-none-any.whl", hash = "sha256:7606ee74f8ad0f31814587861cc94e724fa7951381135e17ca69deddd1acde08"}, + {file = "litellm-1.50.1.tar.gz", hash = "sha256:ddda7ac94d769734e7c38866d0dc1a94c3e3fe5af2a111fcf04c97cc6d6e847a"}, ] [package.dependencies] @@ -3379,7 +3379,7 @@ click = "*" importlib-metadata = ">=6.8.0" jinja2 = ">=3.1.2,<4.0.0" jsonschema = ">=4.22.0,<5.0.0" -openai = ">=1.51.0" +openai = ">=1.52.0" pydantic = ">=2.0.0,<3.0.0" python-dotenv = ">=0.2.0" requests = ">=2.31.0,<3.0.0" @@ -3899,13 +3899,13 @@ pygments = ">2.12.0" [[package]] name = "mkdocs-material" -version = "9.5.41" +version = "9.5.42" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.41-py3-none-any.whl", hash = "sha256:990bc138c33342b5b73e7545915ebc0136e501bfbd8e365735144f5120891d83"}, - {file = "mkdocs_material-9.5.41.tar.gz", hash = "sha256:30fa5d459b4b8130848ecd8e1c908878345d9d8268f7ddbc31eebe88d462d97b"}, + {file = "mkdocs_material-9.5.42-py3-none-any.whl", hash = "sha256:452a7c5d21284b373f36b981a2cbebfff59263feebeede1bc28652e9c5bbe316"}, + {file = "mkdocs_material-9.5.42.tar.gz", hash = "sha256:92779b5e9b5934540c574c11647131d217dc540dce72b05feeda088c8eb1b8f2"}, ] [package.dependencies] @@ -4689,7 +4689,6 @@ description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, ] @@ -4915,68 +4914,68 @@ files = [ [[package]] name = "orjson" -version = "3.10.7" +version = "3.10.9" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:74f4544f5a6405b90da8ea724d15ac9c36da4d72a738c64685003337401f5c12"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34a566f22c28222b08875b18b0dfbf8a947e69df21a9ed5c51a6bf91cfb944ac"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf6ba8ebc8ef5792e2337fb0419f8009729335bb400ece005606336b7fd7bab7"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac7cf6222b29fbda9e3a472b41e6a5538b48f2c8f99261eecd60aafbdb60690c"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de817e2f5fc75a9e7dd350c4b0f54617b280e26d1631811a43e7e968fa71e3e9"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:348bdd16b32556cf8d7257b17cf2bdb7ab7976af4af41ebe79f9796c218f7e91"}, - {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:479fd0844ddc3ca77e0fd99644c7fe2de8e8be1efcd57705b5c92e5186e8a250"}, - {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fdf5197a21dd660cf19dfd2a3ce79574588f8f5e2dbf21bda9ee2d2b46924d84"}, - {file = "orjson-3.10.7-cp310-none-win32.whl", hash = "sha256:d374d36726746c81a49f3ff8daa2898dccab6596864ebe43d50733275c629175"}, - {file = "orjson-3.10.7-cp310-none-win_amd64.whl", hash = "sha256:cb61938aec8b0ffb6eef484d480188a1777e67b05d58e41b435c74b9d84e0b9c"}, - {file = "orjson-3.10.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7db8539039698ddfb9a524b4dd19508256107568cdad24f3682d5773e60504a2"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:480f455222cb7a1dea35c57a67578848537d2602b46c464472c995297117fa09"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8a9c9b168b3a19e37fe2778c0003359f07822c90fdff8f98d9d2a91b3144d8e0"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8de062de550f63185e4c1c54151bdddfc5625e37daf0aa1e75d2a1293e3b7d9a"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b0dd04483499d1de9c8f6203f8975caf17a6000b9c0c54630cef02e44ee624e"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b58d3795dafa334fc8fd46f7c5dc013e6ad06fd5b9a4cc98cb1456e7d3558bd6"}, - {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33cfb96c24034a878d83d1a9415799a73dc77480e6c40417e5dda0710d559ee6"}, - {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e724cebe1fadc2b23c6f7415bad5ee6239e00a69f30ee423f319c6af70e2a5c0"}, - {file = "orjson-3.10.7-cp311-none-win32.whl", hash = "sha256:82763b46053727a7168d29c772ed5c870fdae2f61aa8a25994c7984a19b1021f"}, - {file = "orjson-3.10.7-cp311-none-win_amd64.whl", hash = "sha256:eb8d384a24778abf29afb8e41d68fdd9a156cf6e5390c04cc07bbc24b89e98b5"}, - {file = "orjson-3.10.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44a96f2d4c3af51bfac6bc4ef7b182aa33f2f054fd7f34cc0ee9a320d051d41f"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ac14cd57df0572453543f8f2575e2d01ae9e790c21f57627803f5e79b0d3c3"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bdbb61dcc365dd9be94e8f7df91975edc9364d6a78c8f7adb69c1cdff318ec93"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b48b3db6bb6e0a08fa8c83b47bc169623f801e5cc4f24442ab2b6617da3b5313"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23820a1563a1d386414fef15c249040042b8e5d07b40ab3fe3efbfbbcbcb8864"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c6a008e91d10a2564edbb6ee5069a9e66df3fbe11c9a005cb411f441fd2c09"}, - {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d352ee8ac1926d6193f602cbe36b1643bbd1bbcb25e3c1a657a4390f3000c9a5"}, - {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2d9f990623f15c0ae7ac608103c33dfe1486d2ed974ac3f40b693bad1a22a7b"}, - {file = "orjson-3.10.7-cp312-none-win32.whl", hash = "sha256:7c4c17f8157bd520cdb7195f75ddbd31671997cbe10aee559c2d613592e7d7eb"}, - {file = "orjson-3.10.7-cp312-none-win_amd64.whl", hash = "sha256:1d9c0e733e02ada3ed6098a10a8ee0052dd55774de3d9110d29868d24b17faa1"}, - {file = "orjson-3.10.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:77d325ed866876c0fa6492598ec01fe30e803272a6e8b10e992288b009cbe149"}, - {file = "orjson-3.10.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea2c232deedcb605e853ae1db2cc94f7390ac776743b699b50b071b02bea6fe"}, - {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3dcfbede6737fdbef3ce9c37af3fb6142e8e1ebc10336daa05872bfb1d87839c"}, - {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11748c135f281203f4ee695b7f80bb1358a82a63905f9f0b794769483ea854ad"}, - {file = "orjson-3.10.7-cp313-none-win32.whl", hash = "sha256:a7e19150d215c7a13f39eb787d84db274298d3f83d85463e61d277bbd7f401d2"}, - {file = "orjson-3.10.7-cp313-none-win_amd64.whl", hash = "sha256:eef44224729e9525d5261cc8d28d6b11cafc90e6bd0be2157bde69a52ec83024"}, - {file = "orjson-3.10.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6ea2b2258eff652c82652d5e0f02bd5e0463a6a52abb78e49ac288827aaa1469"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430ee4d85841e1483d487e7b81401785a5dfd69db5de01314538f31f8fbf7ee1"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b6146e439af4c2472c56f8540d799a67a81226e11992008cb47e1267a9b3225"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:084e537806b458911137f76097e53ce7bf5806dda33ddf6aaa66a028f8d43a23"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829cf2195838e3f93b70fd3b4292156fc5e097aac3739859ac0dcc722b27ac0"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1193b2416cbad1a769f868b1749535d5da47626ac29445803dae7cc64b3f5c98"}, - {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4e6c3da13e5a57e4b3dca2de059f243ebec705857522f188f0180ae88badd354"}, - {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c31008598424dfbe52ce8c5b47e0752dca918a4fdc4a2a32004efd9fab41d866"}, - {file = "orjson-3.10.7-cp38-none-win32.whl", hash = "sha256:7122a99831f9e7fe977dc45784d3b2edc821c172d545e6420c375e5a935f5a1c"}, - {file = "orjson-3.10.7-cp38-none-win_amd64.whl", hash = "sha256:a763bc0e58504cc803739e7df040685816145a6f3c8a589787084b54ebc9f16e"}, - {file = "orjson-3.10.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e76be12658a6fa376fcd331b1ea4e58f5a06fd0220653450f0d415b8fd0fbe20"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed350d6978d28b92939bfeb1a0570c523f6170efc3f0a0ef1f1df287cd4f4960"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:144888c76f8520e39bfa121b31fd637e18d4cc2f115727865fdf9fa325b10412"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09b2d92fd95ad2402188cf51573acde57eb269eddabaa60f69ea0d733e789fe9"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b24a579123fa884f3a3caadaed7b75eb5715ee2b17ab5c66ac97d29b18fe57f"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591bcfe7512353bd609875ab38050efe3d55e18934e2f18950c108334b4ff"}, - {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f4db56635b58cd1a200b0a23744ff44206ee6aa428185e2b6c4a65b3197abdcd"}, - {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0fa5886854673222618638c6df7718ea7fe2f3f2384c452c9ccedc70b4a510a5"}, - {file = "orjson-3.10.7-cp39-none-win32.whl", hash = "sha256:8272527d08450ab16eb405f47e0f4ef0e5ff5981c3d82afe0efd25dcbef2bcd2"}, - {file = "orjson-3.10.7-cp39-none-win_amd64.whl", hash = "sha256:974683d4618c0c7dbf4f69c95a979734bf183d0658611760017f6e70a145af58"}, - {file = "orjson-3.10.7.tar.gz", hash = "sha256:75ef0640403f945f3a1f9f6400686560dbfb0fb5b16589ad62cd477043c4eee3"}, + {file = "orjson-3.10.9-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a377186a11b48c55969e34f0aa414c2826a234f212d6f2b312ba512e3cdb2c6f"}, + {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bf37bf0ca538065c34efe1803378b2dadd7e05b06610a086c2857f15ee59e12"}, + {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d9d83a91168aa48309acba804e393b7d9216b66f15e38f339b9fbb00db8986d"}, + {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0014038a17a1fe273da0a5489787677ef5a64566ab383ad6d929e44ed5683f4"}, + {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6ae1b1733e4528e45675ed09a732b6ac37d716bce2facaf467f84ce774adecd"}, + {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe91c2259c4a859356b6db1c6e649b40577492f66d483da8b8af6da0f87c00e3"}, + {file = "orjson-3.10.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a04f912c32463386ba117591c99a3d9e40b3b69bed9c5123d89dff06f0f5a4b0"}, + {file = "orjson-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae82ca347829ca47431767b079f96bb977f592189250ccdede676339a80c8982"}, + {file = "orjson-3.10.9-cp310-none-win32.whl", hash = "sha256:fd5083906825d7f5d23089425ce5424d783d6294020bcabb8518a3e1f97833e5"}, + {file = "orjson-3.10.9-cp310-none-win_amd64.whl", hash = "sha256:e9ff9521b5be0340c8e686bcfe2619777fd7583f71e7b494601cc91ad3919d2e"}, + {file = "orjson-3.10.9-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f3bd9df47385b8fabb3b2ee1e83f9960b8accc1905be971a1c257f16c32b491e"}, + {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4948961b6bce1e2086b2cf0b56cc454cdab589d40c7f85be71fb5a5556c51d3"}, + {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a9fc7a6cf2b229ddc323e136df13b3fb4466c50d84ed600cd0898223dd2fea3"}, + {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2314846e1029a2d2b899140f350eaaf3a73281df43ba84ac44d94ca861b5b269"}, + {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f52d993504827503411df2d60e60acf52885561458d6273f99ecd172f31c4352"}, + {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e29bbf08d907756c145a3a3a1f7ce2f11f15e3edbd3342842589d6030981b76f"}, + {file = "orjson-3.10.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ae82992c00b480c3cc7dac6739324554be8c5d8e858a90044928506a3333ef4"}, + {file = "orjson-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6fdf8d32b6d94019dc15163542d345e9ce4c4661f56b318608aa3088a1a3a23b"}, + {file = "orjson-3.10.9-cp311-none-win32.whl", hash = "sha256:01f5fef452b4d7615f2e94153479370a4b59e0c964efb32dd902978f807a45cd"}, + {file = "orjson-3.10.9-cp311-none-win_amd64.whl", hash = "sha256:95361c4197c7ce9afdf56255de6f4e2474c39d16a277cce31d1b99a2520486d8"}, + {file = "orjson-3.10.9-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:43ad5560db54331c007dc38be5ba7706cb72974a29ae8227019d89305d750a6f"}, + {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1471c3274b1a4a9b8f4b9ed6effaea9ad885796373797515c44b365b375c256d"}, + {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41d8cac575acd15918903d74cfaabb5dbe57b357b93341332f647d1013928dcc"}, + {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2920c8754f1aedc98bd357ec172af18ce48f5f1017a92244c85fe41d16d3c6e0"}, + {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7fa3ff6a0d9d15a0d0d2254cca16cd919156a18423654ce5574591392fe9914"}, + {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1e91b90c0c26bd79593967c1adef421bcff88c9e723d49c93bb7ad8af80bc6b"}, + {file = "orjson-3.10.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f11949024f785ace1a516db32fa6255f6227226b2c988abf66f5aee61d43d8f7"}, + {file = "orjson-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:060e020d85d0ec145bc1b536b1fd9c10a0519c91991ead9724d6f759ebe26b9a"}, + {file = "orjson-3.10.9-cp312-none-win32.whl", hash = "sha256:71f73439999fe662843da3607cdf6e75b1551c330f487e5801d463d969091c63"}, + {file = "orjson-3.10.9-cp312-none-win_amd64.whl", hash = "sha256:12e2efe81356b8448f1cd130f8d75d3718de583112d71f2e2f8baa81bd835bb9"}, + {file = "orjson-3.10.9-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:0ab6e3ad10e964392f0e838751bcce2ef9c8fa8be7deddffff83088e5791566d"}, + {file = "orjson-3.10.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68ef65223baab00f469c8698f771ab3e6ccf6af2a987e77de5b566b4ec651150"}, + {file = "orjson-3.10.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6f130848205fea90a2cb9fa2b11cafff9a9f31f4efad225800bc8b9e4a702f24"}, + {file = "orjson-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2ea7a98f3295ed8adb6730a5788cc78dafea28300d19932a1d2143457f7db802"}, + {file = "orjson-3.10.9-cp313-none-win32.whl", hash = "sha256:bdce39f96149a74fddeb2674c54f1da5e57724d32952eb6df2ac719b66d453cc"}, + {file = "orjson-3.10.9-cp313-none-win_amd64.whl", hash = "sha256:d11383701d4b58e795039b662ada46987744293d57bfa2719e7379b8d67bc796"}, + {file = "orjson-3.10.9-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1c3a1e845916a3739ab4162bb48dee66e0e727a19faf397176a7db0d9826cc3c"}, + {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:063ca59d93d93d1387f0c4bb766c6d4f5b0e423fe7c366d0bd4401a56d1669d1"}, + {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:938b7fcd79cf06fe348fb24b6163fbaa2fdc9fbed8b1f06318f24467f1487e63"}, + {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cc32a9e43c7693011ccde6f8eff8cba75ca0d2a55de11092faa4a716101e67f5"}, + {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b3069b7e2f57f3eef2282029b9c2ba21f08a55f1018e483663a3356f046af4c"}, + {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4289b5d1f88fd05dcafdd7a1f3b17bb722e77712b7618f98e86bdda560e0a1a"}, + {file = "orjson-3.10.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:74f5a7a7f282d326be71b722b0c350da7af6f5f15b9378da177e0e4a09bd91a3"}, + {file = "orjson-3.10.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:80e0c013e50cf7198319d8137931684eb9f32daa067e8276d9dbdd4010bb4add"}, + {file = "orjson-3.10.9-cp38-none-win32.whl", hash = "sha256:9d989152df8f60a76867354e0e08d896292ab9fb96a7ef89a5b3838de174522c"}, + {file = "orjson-3.10.9-cp38-none-win_amd64.whl", hash = "sha256:485358fe9892d6bfd88e5885b66bf88496e1842c8f35f61682ff9928b12a6cf0"}, + {file = "orjson-3.10.9-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ca54e6f320e33c8a6e471c424ee16576361d905c15d69e134c2906d3fcb31795"}, + {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9a9eb03a29c9b30b6c8bb35e5fa20d96589a76e0042005be59b7c3af10a7e43"}, + {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:731e8859fc99b398c286320726906404091141e9223dd5e9e6917f7e32e1cc68"}, + {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75b061c11f5aab979a95927a76394b4a85e3e4d63d0a2a16b56a4f7c6503afab"}, + {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b61b08f6397f004570fd6a840f4a58946b63b4c7029408cdedb45fe85c7d17f7"}, + {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c4f5e0360b7f0aba91dafe12469108109a0e8973956d4a9865ca262a6881406"}, + {file = "orjson-3.10.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e403429e2947a059545e305d97e4b0eb90d3bb44b396d6f327d7ae2018391e13"}, + {file = "orjson-3.10.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0e492b93e122264c2dc78700859122631a4715bda88fabf57d9226954cfe7ec5"}, + {file = "orjson-3.10.9-cp39-none-win32.whl", hash = "sha256:bfba9605e85bfd19b83a21c2c25c2bed2000d5f097f3fa3ad5b5f8a7263a3148"}, + {file = "orjson-3.10.9-cp39-none-win_amd64.whl", hash = "sha256:77d277fa138d4bf145e8b24042004891c188c52ac8492724a183f42b0031cf0c"}, + {file = "orjson-3.10.9.tar.gz", hash = "sha256:c378074e0c46035dc66e57006993233ec66bf8487d501bab41649b4b7289ed4d"}, ] [[package]] @@ -8674,4 +8673,4 @@ vectordb = ["faiss-cpu", "numpy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "00dc0d05363d8bc86320d18440956938bb6554c7c861b7abf58c616789874fbc" +content-hash = "56b550e0c08b8861e2cdd761116d3ec955c9e725bcbfe45881667f73d6cdc49e" diff --git a/pyproject.toml b/pyproject.toml index 8b6d8ac26..c067c68c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,7 +55,7 @@ opentelemetry-sdk = "^1.24.0" opentelemetry-exporter-otlp-proto-grpc = "^1.24.0" opentelemetry-exporter-otlp-proto-http = "^1.24.0" guardrails-hub-types = "^0.0.4" -guardrails-api-client = "^0.3.13" +guardrails-api-client = "^0.4.0a1" diff-match-patch = "^20230430" guardrails-api = ">=0.1.0a1,<0.2.0" mlflow = {version = "^2.0.1", optional = true} From 6ae7f75e82de6b89b67feeb436234d140ccf6006 Mon Sep 17 00:00:00 2001 From: David Tam Date: Mon, 21 Oct 2024 17:03:07 -0700 Subject: [PATCH 51/71] update validator default on fail behavior from no op to exception --- guardrails/utils/tokenization_utils.py | 8 ++---- guardrails/validator_base.py | 8 +++--- .../schema/test_primitive_schema.py | 2 +- tests/integration_tests/test_guard.py | 16 ++++++----- .../databricks/test_ml_flow_instrumentor.py | 2 +- tests/unit_tests/test_async_guard.py | 28 +++++++++---------- tests/unit_tests/test_guard.py | 22 +++++++-------- 7 files changed, 43 insertions(+), 43 deletions(-) diff --git a/guardrails/utils/tokenization_utils.py b/guardrails/utils/tokenization_utils.py index 6dab87cdd..437fdb751 100644 --- a/guardrails/utils/tokenization_utils.py +++ b/guardrails/utils/tokenization_utils.py @@ -17,11 +17,9 @@ def replace_til_no_change(input_text, pattern, replacement): def postproc_splits(sentences, separator): - """ - Applies heuristic rules to repair sentence splitting errors. - Developed for use as postprocessing for the GENIA sentence - splitter on PubMed abstracts, with minor tweaks for - full-text documents. + """Applies heuristic rules to repair sentence splitting errors. Developed + for use as postprocessing for the GENIA sentence splitter on PubMed + abstracts, with minor tweaks for full-text documents. `sentences` should be a string, with line breaks on sentence boundaries. Returns a similar string, but more correct. diff --git a/guardrails/validator_base.py b/guardrails/validator_base.py index ba86d2989..1425c134b 100644 --- a/guardrails/validator_base.py +++ b/guardrails/validator_base.py @@ -49,9 +49,9 @@ def split_sentence_str(chunk: str): def split_sentence_word_tokenizers_jl_separator( chunk: str, separator: str = "abcdsentenceseperatordcba" ): - """ - Use a sentence tokenizer to detect if at least one sentence is present in the chunk. - We return the first sentence and the remaining chunks without the first sentence. + """Use a sentence tokenizer to detect if at least one sentence is present + in the chunk. We return the first sentence and the remaining chunks without + the first sentence. We perform the first step of WordTokenizers.jl's split_sentences function to detect possible sentence boundaries before calling the sentence tokenizer. @@ -142,7 +142,7 @@ def __init__( self.accumulated_chunks: List[str] = [] if on_fail is None: - on_fail = OnFailAction.NOOP + on_fail = OnFailAction.EXCEPTION if isinstance(on_fail, OnFailAction): self.on_fail_descriptor = on_fail self.on_fail_method = None diff --git a/tests/integration_tests/schema/test_primitive_schema.py b/tests/integration_tests/schema/test_primitive_schema.py index 566c6dcb0..9d8a7e27b 100644 --- a/tests/integration_tests/schema/test_primitive_schema.py +++ b/tests/integration_tests/schema/test_primitive_schema.py @@ -31,7 +31,7 @@ def test_choice_case_happy_path(self): ValidatorReference( id="valid-choices", on="$", - on_fail=OnFailAction.NOOP, + on_fail=OnFailAction.EXCEPTION, kwargs={"choices": ["north", "south", "east", "west"]}, ), ValidatorReference( diff --git a/tests/integration_tests/test_guard.py b/tests/integration_tests/test_guard.py index 7fb99b094..f8fb2f8e8 100644 --- a/tests/integration_tests/test_guard.py +++ b/tests/integration_tests/test_guard.py @@ -1270,9 +1270,9 @@ def test_guard_i_guard(self): guard = Guard( name="name-case", description="Checks that a string is in Name Case format." ).use_many( - RegexMatch(regex="^(?:[A-Z][^\s]*\s?)+$"), - ValidLength(1, 100), - ValidChoices(["Some Name", "Some Other Name"]), + RegexMatch(regex="^(?:[A-Z][^\s]*\s?)+$", on_fail="noop"), + ValidLength(1, 100, on_fail="noop"), + ValidChoices(["Some Name", "Some Other Name"], on_fail="noop"), ) response = guard.parse("Some Name") @@ -1315,9 +1315,9 @@ def test_ser_deser(self): guard = Guard( name="name-case", description="Checks that a string is in Name Case format." ).use_many( - RegexMatch(regex="^(?:[A-Z][^\s]*\s?)+$"), - ValidLength(1, 100), - ValidChoices(["Some Name", "Some Other Name"]), + RegexMatch(regex="^(?:[A-Z][^\s]*\s?)+$", on_fail="noop"), + ValidLength(1, 100, on_fail="noop"), + ValidChoices(["Some Name", "Some Other Name"], on_fail="noop"), ) response = guard.parse("Some Name") @@ -1379,7 +1379,9 @@ class TestValidatorInitializedOnce: def test_guard_init(self, mocker): init_spy = mocker.spy(LowerCase, "__init__") - guard = Guard(validators=[ValidatorReference(id="lower-case", on="$")]) + guard = Guard( + validators=[ValidatorReference(id="lower-case", on="$", onFail="noop")] + ) # Validator is not initialized until the guard is used assert init_spy.call_count == 0 diff --git a/tests/unit_tests/integrations/databricks/test_ml_flow_instrumentor.py b/tests/unit_tests/integrations/databricks/test_ml_flow_instrumentor.py index 07177dc24..25bdfd72c 100644 --- a/tests/unit_tests/integrations/databricks/test_ml_flow_instrumentor.py +++ b/tests/unit_tests/integrations/databricks/test_ml_flow_instrumentor.py @@ -625,7 +625,7 @@ def test__instrument_validator_validate(self, mocker): validator_span=mock_span, # type: ignore validator_name="mock-validator", obj_id=id(mock_validator), - on_fail_descriptor="noop", + on_fail_descriptor="exception", result=resp, init_kwargs={}, validation_session_id="unknown", diff --git a/tests/unit_tests/test_async_guard.py b/tests/unit_tests/test_async_guard.py index 0fbebbd3a..1c26b8965 100644 --- a/tests/unit_tests/test_async_guard.py +++ b/tests/unit_tests/test_async_guard.py @@ -165,12 +165,12 @@ def test_use(): assert isinstance(guard._validators[1], OneLine) assert ( - guard._validators[1].on_fail_descriptor == OnFailAction.NOOP + guard._validators[1].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[2], LowerCase) assert ( - guard._validators[2].on_fail_descriptor == OnFailAction.NOOP + guard._validators[2].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[3], TwoWords) @@ -265,12 +265,12 @@ def test_use_many_instances(): assert isinstance(guard._validators[1], OneLine) assert ( - guard._validators[1].on_fail_descriptor == OnFailAction.NOOP + guard._validators[1].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[2], LowerCase) assert ( - guard._validators[2].on_fail_descriptor == OnFailAction.NOOP + guard._validators[2].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[3], TwoWords) @@ -317,12 +317,12 @@ class TestClass(BaseModel): assert isinstance(guard._validators[1], OneLine) assert ( - guard._validators[1].on_fail_descriptor == OnFailAction.NOOP + guard._validators[1].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[2], LowerCase) assert ( - guard._validators[2].on_fail_descriptor == OnFailAction.NOOP + guard._validators[2].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[3], TwoWords) @@ -385,7 +385,7 @@ def test_use_many_tuple(): assert isinstance(guard._validators[0], OneLine) assert ( - guard._validators[0].on_fail_descriptor == OnFailAction.NOOP + guard._validators[0].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[1], EndsWith) @@ -431,7 +431,7 @@ def test_use_many_tuple(): assert isinstance(guard._validators[1], OneLine) assert ( - guard._validators[1].on_fail_descriptor == OnFailAction.NOOP + guard._validators[1].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default # Test with an unrecognized "on" parameter, should warn with a UserWarning @@ -468,11 +468,11 @@ async def test_output_only_success(self): async def test_output_only_failure(self): guard: AsyncGuard = ( AsyncGuard() - .use(OneLine) + .use(OneLine, on_fail=OnFailAction.NOOP) .use( LowerCase(on_fail=OnFailAction.FIX), on="output" ) # default on="output", still explicitly set - .use(TwoWords) + .use(TwoWords, on_fail=OnFailAction.NOOP) .use(ValidLength, 0, 12, on_fail=OnFailAction.REFRAIN) ) @@ -509,11 +509,11 @@ async def test_on_many_success(self): async def test_on_many_failure(self): guard: AsyncGuard = ( AsyncGuard() - .use(OneLine, on="messages") - .use(LowerCase, on="messages") - .use(UpperCase, on="messages") + .use(OneLine, on="messages", on_fail=OnFailAction.NOOP) + .use(LowerCase, on="messages", on_fail=OnFailAction.NOOP) + .use(UpperCase, on="messages", on_fail=OnFailAction.NOOP) .use(LowerCase, on="output", on_fail=OnFailAction.FIX) - .use(TwoWords) + .use(TwoWords, on_fail=OnFailAction.NOOP) .use(ValidLength, 0, 12, on_fail=OnFailAction.REFRAIN) ) diff --git a/tests/unit_tests/test_guard.py b/tests/unit_tests/test_guard.py index dc2ac5479..22ab2ed5c 100644 --- a/tests/unit_tests/test_guard.py +++ b/tests/unit_tests/test_guard.py @@ -213,12 +213,12 @@ def test_use(): assert isinstance(guard._validators[1], OneLine) assert ( - guard._validators[1].on_fail_descriptor == OnFailAction.NOOP + guard._validators[1].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[2], LowerCase) assert ( - guard._validators[2].on_fail_descriptor == OnFailAction.NOOP + guard._validators[2].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[3], TwoWords) @@ -303,12 +303,12 @@ def test_use_many_instances(): assert isinstance(guard._validators[1], OneLine) assert ( - guard._validators[1].on_fail_descriptor == OnFailAction.NOOP + guard._validators[1].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[2], LowerCase) assert ( - guard._validators[2].on_fail_descriptor == OnFailAction.NOOP + guard._validators[2].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[3], TwoWords) @@ -356,12 +356,12 @@ class TestClass(BaseModel): assert isinstance(guard._validators[1], OneLine) assert ( - guard._validators[1].on_fail_descriptor == OnFailAction.NOOP + guard._validators[1].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[2], LowerCase) assert ( - guard._validators[2].on_fail_descriptor == OnFailAction.NOOP + guard._validators[2].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[3], TwoWords) @@ -424,7 +424,7 @@ def test_use_many_tuple(): assert isinstance(guard._validators[0], OneLine) assert ( - guard._validators[0].on_fail_descriptor == OnFailAction.NOOP + guard._validators[0].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default assert isinstance(guard._validators[1], EndsWith) @@ -470,7 +470,7 @@ def test_use_many_tuple(): assert isinstance(guard._validators[1], OneLine) assert ( - guard._validators[1].on_fail_descriptor == OnFailAction.NOOP + guard._validators[1].on_fail_descriptor == OnFailAction.EXCEPTION ) # bc this is the default # Test with an unrecognized "on" parameter, should warn with a UserWarning @@ -505,11 +505,11 @@ def test_output_only_success(self): def test_output_only_failure(self): guard: Guard = ( Guard() - .use(OneLine) + .use(OneLine, on_fail=OnFailAction.NOOP) .use( LowerCase(on_fail=OnFailAction.FIX), on="output" ) # default on="output", still explicitly set - .use(TwoWords) + .use(TwoWords, on_fail=OnFailAction.NOOP) .use(ValidLength, 0, 12, on_fail=OnFailAction.REFRAIN) ) @@ -546,7 +546,7 @@ def test_on_many_failure(self): Guard() .use(OneLine, on="messages") .use(LowerCase, on="output", on_fail=OnFailAction.FIX) - .use(TwoWords) + .use(TwoWords, on_fail=OnFailAction.NOOP) .use(ValidLength, 0, 12, on_fail=OnFailAction.REFRAIN) ) From 766d9cc1b41e6128b5f8379a6a7b57d588c4d137 Mon Sep 17 00:00:00 2001 From: David Tam Date: Tue, 22 Oct 2024 10:59:07 -0700 Subject: [PATCH 52/71] update notebooks --- docs/examples/chatbot.ipynb | 85 +++----- docs/examples/data/config.py | 6 +- docs/examples/extracting_entities.ipynb | 2 +- docs/examples/generate_structured_data.ipynb | 4 +- .../generate_structured_data_cohere.ipynb | 182 +++++++++--------- .../guardrails_with_chat_models.ipynb | 60 +++++- .../json_function_calling_tools.ipynb | 2 +- docs/examples/lite_llm_defaults.ipynb | 2 +- 8 files changed, 174 insertions(+), 169 deletions(-) diff --git a/docs/examples/chatbot.ipynb b/docs/examples/chatbot.ipynb index 5ace1397d..97c943c17 100644 --- a/docs/examples/chatbot.ipynb +++ b/docs/examples/chatbot.ipynb @@ -52,14 +52,14 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/Users/dtam/.pyenv/versions/3.10.4/lib/python3.10/site-packages/pypdfium2/_helpers/textpage.py:80: UserWarning: get_text_range() call with default params will be implicitly redirected to get_text_bounded()\n", + "/Users/dtam/.pyenv/versions/3.12.3/envs/060dev/lib/python3.12/site-packages/pypdfium2/_helpers/textpage.py:80: UserWarning: get_text_range() call with default params will be implicitly redirected to get_text_bounded()\n", " warnings.warn(\"get_text_range() call with default params will be implicitly redirected to get_text_bounded()\")\n" ] }, @@ -97,6 +97,7 @@ ], "source": [ "from guardrails import Guard, docs_utils\n", + "from guardrails.errors import ValidationError\n", "from rich import print\n", "\n", "content = docs_utils.read_pdf(\"./data/chase_card_agreement.pdf\")\n", @@ -113,24 +114,16 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/dtam/.pyenv/versions/3.10.4/lib/python3.10/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.\n", - " warnings.warn(\n" - ] - }, { "data": { "text/plain": [ - "Guard(id='OWR778', name='ChatBotGuard', description=None, validators=[ValidatorReference(id='guardrails/profanity_free', on='$', on_fail='noop', args=None, kwargs={}), ValidatorReference(id='guardrails/toxic_language', on='$', on_fail='noop', args=None, kwargs={'threshold': 0.5, 'validation_method': 'sentence'})], output_schema=ModelSchema(definitions=None, dependencies=None, anchor=None, ref=None, dynamic_ref=None, dynamic_anchor=None, vocabulary=None, comment=None, defs=None, prefix_items=None, items=None, contains=None, additional_properties=None, properties=None, pattern_properties=None, dependent_schemas=None, property_names=None, var_if=None, then=None, var_else=None, all_of=None, any_of=None, one_of=None, var_not=None, unevaluated_items=None, unevaluated_properties=None, multiple_of=None, maximum=None, exclusive_maximum=None, minimum=None, exclusive_minimum=None, max_length=None, min_length=None, pattern=None, max_items=None, min_items=None, unique_items=None, max_contains=None, min_contains=None, max_properties=None, min_properties=None, required=None, dependent_required=None, const=None, enum=None, type=ValidationType(anyof_schema_1_validator=None, anyof_schema_2_validator=None, actual_instance=, any_of_schemas={'SimpleTypes', 'List[SimpleTypes]'}), title=None, description=None, default=None, deprecated=None, read_only=None, write_only=None, examples=None, format=None, content_media_type=None, content_encoding=None, content_schema=None), history=[])" + "Guard(id='SG816R', name='ChatBotGuard', description=None, validators=[ValidatorReference(id='guardrails/profanity_free', on='$', on_fail='exception', args=None, kwargs={}), ValidatorReference(id='guardrails/toxic_language', on='$', on_fail='exception', args=None, kwargs={'threshold': 0.5, 'validation_method': 'sentence'})], output_schema=ModelSchema(definitions=None, dependencies=None, anchor=None, ref=None, dynamic_ref=None, dynamic_anchor=None, vocabulary=None, comment=None, defs=None, prefix_items=None, items=None, contains=None, additional_properties=None, properties=None, pattern_properties=None, dependent_schemas=None, property_names=None, var_if=None, then=None, var_else=None, all_of=None, any_of=None, one_of=None, var_not=None, unevaluated_items=None, unevaluated_properties=None, multiple_of=None, maximum=None, exclusive_maximum=None, minimum=None, exclusive_minimum=None, max_length=None, min_length=None, pattern=None, max_items=None, min_items=None, unique_items=None, max_contains=None, min_contains=None, max_properties=None, min_properties=None, required=None, dependent_required=None, const=None, enum=None, type=ValidationType(anyof_schema_1_validator=None, anyof_schema_2_validator=None, actual_instance=, any_of_schemas={'List[SimpleTypes]', 'SimpleTypes'}), title=None, description=None, default=None, deprecated=None, read_only=None, write_only=None, examples=None, format=None, content_media_type=None, content_encoding=None, content_schema=None), history=[])" ] }, - "execution_count": 9, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -154,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -199,14 +192,18 @@ "def random_response(message, history):\n", " messages = history_to_messages(history)\n", " messages.append({\"role\": \"user\", \"content\": message})\n", - " response = guard(\n", - " model=\"gpt-4o\",\n", - " messages=messages,\n", - " prompt_params={\"document\": content[:6000]},\n", - " temperature=0,\n", - " )\n", - "\n", - " return response.validated_output if response.validation_passed else \"I'm sorry, I can't answer that question.\"\n", + " try:\n", + " response = guard(\n", + " model=\"gpt-4o\",\n", + " messages=messages,\n", + " prompt_params={\"document\": content[:6000]},\n", + " temperature=0,\n", + " )\n", + " except Exception as e:\n", + " if isinstance(e, ValidationError):\n", + " return \"I'm sorry, I can't answer that question.\"\n", + " return \"I'm sorry there was a problem, I can't answer that question.\"\n", + " return response.validated_output\n", "\n", "gr.ChatInterface(random_response).launch()" ] @@ -246,43 +243,11 @@ { "data": { "text/html": [ - "
Raw output: [\"**INT. DETECTIVE'S OFFICE - NIGHT**\\n\\nThe room is dimly lit, papers scattered across the desk, and a\n",
-       "corkboard filled with photos and notes pinned haphazardly. The DETECTIVE, a grizzled man in his late 40s with a \n",
-       "five o'clock shadow, paces back and forth, his face a mask of frustration and anger.\\n\\n**DETECTIVE**\\n(voice \n",
-       "trembling with rage)\\nDamn it!\\n\\nHe slams his fist onto the desk, causing a coffee mug to topple over and spill \n",
-       "its contents. He grabs a file folder, flipping it open only to find it empty. He throws it across the room in a fit\n",
-       "of fury.\\n\\n**DETECTIVE**\\n(under his breath, seething)\\nHow the hell did this happen?\\n\\nHe runs his hands through\n",
-       "his hair, trying to calm himself but failing miserably. He looks at the corkboard, the photos of crime scenes and \n",
-       "suspects now mocking him with their uselessness.\\n\\n**DETECTIVE**\\n(shouting)\\nFuck!\\n\\nHe kicks a chair, sending \n",
-       "it skidding across the floor. He takes a deep breath, trying to regain his composure, but the anger is still \n",
-       "boiling just beneath the surface.\\n\\n**DETECTIVE**\\n(to himself)\\nAll the evidence... gone. Every damn piece.\\n\\nHe\n",
-       "walks over to the window, looking out into the dark, rainy night. The city lights blur through the raindrops on the\n",
-       "glass. He clenches his fists, his knuckles turning white.\\n\\n**DETECTIVE**\\n(whispering)\\nWhoever did this... \n",
-       "they're gonna pay.\\n\\nHe turns back to the room, his eyes now filled with a cold determination. He grabs his coat \n",
-       "from the back of the chair and heads for the door, his mind already racing with plans to track down the \n",
-       "thief.\\n\\n**DETECTIVE**\\n(to himself)\\nThis isn't over. Not by a long shot.\\n\\nHe exits the office, the door \n",
-       "slamming shut behind him, leaving the room in silence except for the steady drip of the spilled coffee.\\n\\n**FADE \n",
-       "OUT.**\"]\n",
+       "
Raw output: ['\"Why does everything have to be such a damn mess all the time?\"']\n",
        "
\n" ], "text/plain": [ - "Raw output: \u001b[1m[\u001b[0m\u001b[32m\"**INT. DETECTIVE'S OFFICE - NIGHT**\\n\\nThe room is dimly lit, papers scattered across the desk, and a\u001b[0m\n", - "\u001b[32mcorkboard filled with photos and notes pinned haphazardly. The DETECTIVE, a grizzled man in his late 40s with a \u001b[0m\n", - "\u001b[32mfive o'clock shadow, paces back and forth, his face a mask of frustration and anger.\\n\\n**DETECTIVE**\\n\u001b[0m\u001b[32m(\u001b[0m\u001b[32mvoice \u001b[0m\n", - "\u001b[32mtrembling with rage\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\nDamn it!\\n\\nHe slams his fist onto the desk, causing a coffee mug to topple over and spill \u001b[0m\n", - "\u001b[32mits contents. He grabs a file folder, flipping it open only to find it empty. He throws it across the room in a fit\u001b[0m\n", - "\u001b[32mof fury.\\n\\n**DETECTIVE**\\n\u001b[0m\u001b[32m(\u001b[0m\u001b[32munder his breath, seething\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\nHow the hell did this happen?\\n\\nHe runs his hands through\u001b[0m\n", - "\u001b[32mhis hair, trying to calm himself but failing miserably. He looks at the corkboard, the photos of crime scenes and \u001b[0m\n", - "\u001b[32msuspects now mocking him with their uselessness.\\n\\n**DETECTIVE**\\n\u001b[0m\u001b[32m(\u001b[0m\u001b[32mshouting\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\nFuck!\\n\\nHe kicks a chair, sending \u001b[0m\n", - "\u001b[32mit skidding across the floor. He takes a deep breath, trying to regain his composure, but the anger is still \u001b[0m\n", - "\u001b[32mboiling just beneath the surface.\\n\\n**DETECTIVE**\\n\u001b[0m\u001b[32m(\u001b[0m\u001b[32mto himself\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\nAll the evidence... gone. Every damn piece.\\n\\nHe\u001b[0m\n", - "\u001b[32mwalks over to the window, looking out into the dark, rainy night. The city lights blur through the raindrops on the\u001b[0m\n", - "\u001b[32mglass. He clenches his fists, his knuckles turning white.\\n\\n**DETECTIVE**\\n\u001b[0m\u001b[32m(\u001b[0m\u001b[32mwhispering\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\nWhoever did this... \u001b[0m\n", - "\u001b[32mthey're gonna pay.\\n\\nHe turns back to the room, his eyes now filled with a cold determination. He grabs his coat \u001b[0m\n", - "\u001b[32mfrom the back of the chair and heads for the door, his mind already racing with plans to track down the \u001b[0m\n", - "\u001b[32mthief.\\n\\n**DETECTIVE**\\n\u001b[0m\u001b[32m(\u001b[0m\u001b[32mto himself\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\nThis isn't over. Not by a long shot.\\n\\nHe exits the office, the door \u001b[0m\n", - "\u001b[32mslamming shut behind him, leaving the room in silence except for the steady drip of the spilled coffee.\\n\\n**FADE \u001b[0m\n", - "\u001b[32mOUT.**\"\u001b[0m\u001b[1m]\u001b[0m\n" + "Raw output: \u001b[1m[\u001b[0m\u001b[32m'\"Why does everything have to be such a damn mess all the time?\"'\u001b[0m\u001b[1m]\u001b[0m\n" ] }, "metadata": {}, @@ -291,11 +256,11 @@ { "data": { "text/html": [ - "
Last validation status: fail\n",
+       "
Last validation status: error\n",
        "
\n" ], "text/plain": [ - "Last validation status: fail\n" + "Last validation status: error\n" ] }, "metadata": {}, @@ -313,7 +278,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "060dev", "language": "python", "name": "python3" }, @@ -327,7 +292,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.4" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/examples/data/config.py b/docs/examples/data/config.py index d4e6913b7..5a7905f10 100644 --- a/docs/examples/data/config.py +++ b/docs/examples/data/config.py @@ -21,11 +21,11 @@ name_case = Guard( name="name-case", description="Checks that a string is in Name Case format." -).use(RegexMatch(regex="^(?:[A-Z][^\s]*\s?)+$")) +).use(RegexMatch(regex="^(?:[A-Z][^\s]*\s?)+$", on_fail=OnFailAction.NOOP)) all_caps = Guard( name="all-caps", description="Checks that a string is all capital." -).use(RegexMatch(regex="^[A-Z\\s]*$")) +).use(RegexMatch(regex="^[A-Z\\s]*$", on_fail=OnFailAction.NOOP)) @register_validator(name="custom/dynamic-enum", data_type="all") @@ -67,4 +67,4 @@ def custom_enum_fetcher(*args): custom_code_guard = Guard( name="custom", description="Uses a custom callable init argument for dynamic enum checks", -).use(DynamicEnum(custom_enum_fetcher)) +).use(DynamicEnum(custom_enum_fetcher, on_fail=OnFailAction.NOOP)) diff --git a/docs/examples/extracting_entities.ipynb b/docs/examples/extracting_entities.ipynb index 784a27754..c9249cef5 100644 --- a/docs/examples/extracting_entities.ipynb +++ b/docs/examples/extracting_entities.ipynb @@ -153,7 +153,7 @@ "\n", "class Fee(BaseModel):\n", " name: str = Field(validators=[LowerCase(on_fail=\"fix\"), TwoWords(on_fail=\"reask\")])\n", - " explanation: str = Field(validators=[OneLine()])\n", + " explanation: str = Field(validators=[OneLine(on_fail=\"noop\")])\n", " value: float = Field(description=\"The fee amount in USD or as a percentage.\")\n", "\n", "class AccountFee(BaseModel):\n", diff --git a/docs/examples/generate_structured_data.ipynb b/docs/examples/generate_structured_data.ipynb index e52d6dc29..1b5485107 100644 --- a/docs/examples/generate_structured_data.ipynb +++ b/docs/examples/generate_structured_data.ipynb @@ -80,11 +80,11 @@ " user_id: str = Field(description=\"The user's id.\")\n", " user_name: str = Field(\n", " description=\"The user's first name and last name\",\n", - " validators=[TwoWords()]\n", + " validators=[TwoWords(on_fail=\"noop\")]\n", " )\n", " num_orders: int = Field(\n", " description=\"The number of orders the user has placed\",\n", - " validators=[ValidRange(0, 50)]\n", + " validators=[ValidRange(0, 50, on_fail=\"noop\")]\n", " )\n", "\n", "class Orders(BaseModel):\n", diff --git a/docs/examples/generate_structured_data_cohere.ipynb b/docs/examples/generate_structured_data_cohere.ipynb index 9d36c84eb..9fae8d52f 100644 --- a/docs/examples/generate_structured_data_cohere.ipynb +++ b/docs/examples/generate_structured_data_cohere.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "346e1b5c", "metadata": {}, "outputs": [], @@ -97,12 +97,12 @@ "\tuser_id: int = Field(description=\"The user's id.\", validators=[(\"1-indexed\", \"noop\")])\n", "\tuser_name: str = Field(\n", "\t\tdescription=\"The user's first name and last name\",\n", - "\t\tvalidators=[TwoWords()]\n", + "\t\tvalidators=[TwoWords(on_fail=\"noop\")]\n", "\t)\n", "\n", "\tnum_orders: int = Field(\n", "\t\tdescription=\"The number of orders the user has placed\",\n", - "\t\tvalidators=[ValidRange(0, 50)]\n", + "\t\tvalidators=[ValidRange(0, 50, on_fail=\"noop\")]\n", "\t)\n", "\t\n", "\n", @@ -152,7 +152,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/Users/dtam/dev/guardrails/guardrails/validator_base.py:567: UserWarning: Validator with id 1-indexed was not found in the registry! Ignoring...\n", + "/Users/dtam/dev/guardrails/guardrails/validator_base.py:590: UserWarning: Validator with id 1-indexed was not found in the registry! Ignoring...\n", " warn(f\"Validator with id {name} was not found in the registry! Ignoring...\")\n", "WARNING:guardrails-ai:Validator with id 1-indexed was not found in the registry! Ignoring...\n", "WARNING:guardrails-ai:Invalid arguments! ('1-indexed', 'noop')\n", @@ -193,7 +193,7 @@ "text/html": [ "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
        "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │\n",
        "    │ │ ┃ Role  Content                                                                                      ┃ │ │\n",
        "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │\n",
@@ -245,7 +245,7 @@
        "    │ │ │      │                                                                                              │ │ │\n",
        "    │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │     \"user_orders\": [                                                                                    │ │\n",
        "    │ │         {                                                                                               │ │\n",
@@ -254,72 +254,72 @@
        "    │ │             \"num_orders\": 12                                                                            │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 22,                                                                              │ │\n",
-       "    │ │             \"user_name\": \"Alice Johnson\",                                                               │ │\n",
-       "    │ │             \"num_orders\": 5                                                                             │ │\n",
+       "    │ │             \"user_id\": 5,                                                                               │ │\n",
+       "    │ │             \"user_name\": \"Michael Jones\",                                                               │ │\n",
+       "    │ │             \"num_orders\": 18                                                                            │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 11,                                                                              │ │\n",
-       "    │ │             \"user_name\": \"Bob Williams\",                                                                │ │\n",
-       "    │ │             \"num_orders\": 23                                                                            │ │\n",
+       "    │ │             \"user_id\": 10,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Mary Sue\",                                                                    │ │\n",
+       "    │ │             \"num_orders\": 9                                                                             │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 6,                                                                               │ │\n",
-       "    │ │             \"user_name\": \"David Jones\",                                                                 │ │\n",
-       "    │ │             \"num_orders\": 14                                                                            │ │\n",
+       "    │ │             \"user_id\": 3,                                                                               │ │\n",
+       "    │ │             \"user_name\": \"David Miller\",                                                                │ │\n",
+       "    │ │             \"num_orders\": 7                                                                             │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 19,                                                                              │ │\n",
-       "    │ │             \"user_name\": \"Michelle Brown\",                                                              │ │\n",
-       "    │ │             \"num_orders\": 10                                                                            │ │\n",
+       "    │ │             \"user_id\": 15,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Eva Gonzalez\",                                                                │ │\n",
+       "    │ │             \"num_orders\": 15                                                                            │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 10,                                                                              │ │\n",
-       "    │ │             \"user_name\": \"Michael Miller\",                                                              │ │\n",
-       "    │ │             \"num_orders\": 18                                                                            │ │\n",
+       "    │ │             \"user_id\": 8,                                                                               │ │\n",
+       "    │ │             \"user_name\": \"William Martinez\",                                                            │ │\n",
+       "    │ │             \"num_orders\": 1                                                                             │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 15,                                                                              │ │\n",
-       "    │ │             \"user_name\": \"Jessica Taylor\",                                                              │ │\n",
-       "    │ │             \"num_orders\": 2                                                                             │ │\n",
+       "    │ │             \"user_id\": 12,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Sophia Lee\",                                                                  │ │\n",
+       "    │ │             \"num_orders\": 10                                                                            │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 21,                                                                              │ │\n",
-       "    │ │             \"user_name\": \"William Ian\",                                                                 │ │\n",
-       "    │ │             \"num_orders\": 16                                                                            │ │\n",
+       "    │ │             \"user_id\": 6,                                                                               │ │\n",
+       "    │ │             \"user_name\": \"Robert Wilson\",                                                               │ │\n",
+       "    │ │             \"num_orders\": 22                                                                            │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 16,                                                                              │ │\n",
-       "    │ │             \"user_name\": \"Sophia Martinez\",                                                             │ │\n",
-       "    │ │             \"num_orders\": 7                                                                             │ │\n",
+       "    │ │             \"user_id\": 18,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Albert Taylor\",                                                               │ │\n",
+       "    │ │             \"num_orders\": 3                                                                             │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 8,                                                                               │ │\n",
-       "    │ │             \"user_name\": \"Daniel Park\",                                                                 │ │\n",
-       "    │ │             \"num_orders\": 28                                                                            │ │\n",
+       "    │ │             \"user_id\": 14,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Olivia Davis\",                                                                │ │\n",
+       "    │ │             \"num_orders\": 17                                                                            │ │\n",
        "    │ │         },                                                                                              │ │\n",
        "    │ │         {                                                                                               │ │\n",
-       "    │ │             \"user_id\": 14,                                                                              │ │\n",
-       "    │ │             \"user_name\": \"Olivia Robinson\",                                                             │ │\n",
-       "    │ │             \"num_orders\": 4                                                                             │ │\n",
+       "    │ │             \"user_id\": 17,                                                                              │ │\n",
+       "    │ │             \"user_name\": \"Jonathan Smith\",                                                              │ │\n",
+       "    │ │             \"num_orders\": 5                                                                             │ │\n",
        "    │ │         }                                                                                               │ │\n",
        "    │ │     ]                                                                                                   │ │\n",
        "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ {                                                                                                       │ │\n",
        "    │ │     'user_orders': [                                                                                    │ │\n",
        "    │ │         {'user_id': 2, 'user_name': 'Jane Smith', 'num_orders': 12},                                    │ │\n",
-       "    │ │         {'user_id': 22, 'user_name': 'Alice Johnson', 'num_orders': 5},                                 │ │\n",
-       "    │ │         {'user_id': 11, 'user_name': 'Bob Williams', 'num_orders': 23},                                 │ │\n",
-       "    │ │         {'user_id': 6, 'user_name': 'David Jones', 'num_orders': 14},                                   │ │\n",
-       "    │ │         {'user_id': 19, 'user_name': 'Michelle Brown', 'num_orders': 10},                               │ │\n",
-       "    │ │         {'user_id': 10, 'user_name': 'Michael Miller', 'num_orders': 18},                               │ │\n",
-       "    │ │         {'user_id': 15, 'user_name': 'Jessica Taylor', 'num_orders': 2},                                │ │\n",
-       "    │ │         {'user_id': 21, 'user_name': 'William Ian', 'num_orders': 16},                                  │ │\n",
-       "    │ │         {'user_id': 16, 'user_name': 'Sophia Martinez', 'num_orders': 7},                               │ │\n",
-       "    │ │         {'user_id': 8, 'user_name': 'Daniel Park', 'num_orders': 28},                                   │ │\n",
-       "    │ │         {'user_id': 14, 'user_name': 'Olivia Robinson', 'num_orders': 4}                                │ │\n",
+       "    │ │         {'user_id': 5, 'user_name': 'Michael Jones', 'num_orders': 18},                                 │ │\n",
+       "    │ │         {'user_id': 10, 'user_name': 'Mary Sue', 'num_orders': 9},                                      │ │\n",
+       "    │ │         {'user_id': 3, 'user_name': 'David Miller', 'num_orders': 7},                                   │ │\n",
+       "    │ │         {'user_id': 15, 'user_name': 'Eva Gonzalez', 'num_orders': 15},                                 │ │\n",
+       "    │ │         {'user_id': 8, 'user_name': 'William Martinez', 'num_orders': 1},                               │ │\n",
+       "    │ │         {'user_id': 12, 'user_name': 'Sophia Lee', 'num_orders': 10},                                   │ │\n",
+       "    │ │         {'user_id': 6, 'user_name': 'Robert Wilson', 'num_orders': 22},                                 │ │\n",
+       "    │ │         {'user_id': 18, 'user_name': 'Albert Taylor', 'num_orders': 3},                                 │ │\n",
+       "    │ │         {'user_id': 14, 'user_name': 'Olivia Davis', 'num_orders': 17},                                 │ │\n",
+       "    │ │         {'user_id': 17, 'user_name': 'Jonathan Smith', 'num_orders': 5}                                 │ │\n",
        "    │ │     ]                                                                                                   │ │\n",
        "    │ │ }                                                                                                       │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
@@ -329,7 +329,7 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m Messages \u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent                                                                                     \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
@@ -381,7 +381,7 @@
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m      \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m                                                                                            \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    \"user_orders\": [\u001b[0m\u001b[48;2;245;245;220m                                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
@@ -390,72 +390,72 @@
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 12\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 22,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Alice Johnson\",\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 5\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 5,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Michael Jones\",\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 18\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 11,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Bob Williams\",\u001b[0m\u001b[48;2;245;245;220m                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 23\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 10,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Mary Sue\",\u001b[0m\u001b[48;2;245;245;220m                                                                   \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 9\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 6,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"David Jones\",\u001b[0m\u001b[48;2;245;245;220m                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 14\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 3,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"David Miller\",\u001b[0m\u001b[48;2;245;245;220m                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 7\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 19,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Michelle Brown\",\u001b[0m\u001b[48;2;245;245;220m                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 10\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 15,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Eva Gonzalez\",\u001b[0m\u001b[48;2;245;245;220m                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 15\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 10,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Michael Miller\",\u001b[0m\u001b[48;2;245;245;220m                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 18\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 8,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"William Martinez\",\u001b[0m\u001b[48;2;245;245;220m                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 1\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 15,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Jessica Taylor\",\u001b[0m\u001b[48;2;245;245;220m                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 2\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 12,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Sophia Lee\",\u001b[0m\u001b[48;2;245;245;220m                                                                 \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 10\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 21,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"William Ian\",\u001b[0m\u001b[48;2;245;245;220m                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 16\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 6,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Robert Wilson\",\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 22\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 16,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Sophia Martinez\",\u001b[0m\u001b[48;2;245;245;220m                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 7\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 18,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Albert Taylor\",\u001b[0m\u001b[48;2;245;245;220m                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 3\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 8,\u001b[0m\u001b[48;2;245;245;220m                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Daniel Park\",\u001b[0m\u001b[48;2;245;245;220m                                                                \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 28\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 14,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Olivia Davis\",\u001b[0m\u001b[48;2;245;245;220m                                                               \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 17\u001b[0m\u001b[48;2;245;245;220m                                                                           \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        },\u001b[0m\u001b[48;2;245;245;220m                                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        {\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 14,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Olivia Robinson\",\u001b[0m\u001b[48;2;245;245;220m                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 4\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_id\": 17,\u001b[0m\u001b[48;2;245;245;220m                                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"user_name\": \"Jonathan Smith\",\u001b[0m\u001b[48;2;245;245;220m                                                             \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m            \"num_orders\": 5\u001b[0m\u001b[48;2;245;245;220m                                                                            \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m        }\u001b[0m\u001b[48;2;245;245;220m                                                                                              \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m    ]\u001b[0m\u001b[48;2;245;245;220m                                                                                                  \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m                                                                                                      \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    'user_orders': [\u001b[0m\u001b[48;2;240;255;240m                                                                                   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 2, 'user_name': 'Jane Smith', 'num_orders': 12},\u001b[0m\u001b[48;2;240;255;240m                                   \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 22, 'user_name': 'Alice Johnson', 'num_orders': 5},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 11, 'user_name': 'Bob Williams', 'num_orders': 23},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 6, 'user_name': 'David Jones', 'num_orders': 14},\u001b[0m\u001b[48;2;240;255;240m                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 19, 'user_name': 'Michelle Brown', 'num_orders': 10},\u001b[0m\u001b[48;2;240;255;240m                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 10, 'user_name': 'Michael Miller', 'num_orders': 18},\u001b[0m\u001b[48;2;240;255;240m                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 15, 'user_name': 'Jessica Taylor', 'num_orders': 2},\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 21, 'user_name': 'William Ian', 'num_orders': 16},\u001b[0m\u001b[48;2;240;255;240m                                 \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 16, 'user_name': 'Sophia Martinez', 'num_orders': 7},\u001b[0m\u001b[48;2;240;255;240m                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 8, 'user_name': 'Daniel Park', 'num_orders': 28},\u001b[0m\u001b[48;2;240;255;240m                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 14, 'user_name': 'Olivia Robinson', 'num_orders': 4}\u001b[0m\u001b[48;2;240;255;240m                               \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 5, 'user_name': 'Michael Jones', 'num_orders': 18},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 10, 'user_name': 'Mary Sue', 'num_orders': 9},\u001b[0m\u001b[48;2;240;255;240m                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 3, 'user_name': 'David Miller', 'num_orders': 7},\u001b[0m\u001b[48;2;240;255;240m                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 15, 'user_name': 'Eva Gonzalez', 'num_orders': 15},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 8, 'user_name': 'William Martinez', 'num_orders': 1},\u001b[0m\u001b[48;2;240;255;240m                              \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 12, 'user_name': 'Sophia Lee', 'num_orders': 10},\u001b[0m\u001b[48;2;240;255;240m                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 6, 'user_name': 'Robert Wilson', 'num_orders': 22},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 18, 'user_name': 'Albert Taylor', 'num_orders': 3},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 14, 'user_name': 'Olivia Davis', 'num_orders': 17},\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m        {'user_id': 17, 'user_name': 'Jonathan Smith', 'num_orders': 5}\u001b[0m\u001b[48;2;240;255;240m                                \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m    ]\u001b[0m\u001b[48;2;240;255;240m                                                                                                  \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m                                                                                                      \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
@@ -475,7 +475,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "litellm",
+   "display_name": "060dev",
    "language": "python",
    "name": "python3"
   },
diff --git a/docs/examples/guardrails_with_chat_models.ipynb b/docs/examples/guardrails_with_chat_models.ipynb
index b669f8e58..d0819af27 100644
--- a/docs/examples/guardrails_with_chat_models.ipynb
+++ b/docs/examples/guardrails_with_chat_models.ipynb
@@ -59,9 +59,49 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 4,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/dtam/.pyenv/versions/3.12.3/envs/060dev/lib/python3.12/site-packages/pypdfium2/_helpers/textpage.py:80: UserWarning: get_text_range() call with default params will be implicitly redirected to get_text_bounded()\n",
+      "  warnings.warn(\"get_text_range() call with default params will be implicitly redirected to get_text_bounded()\")\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "
Chase Credit Card Document:\n",
+       "\n",
+       "2/25/23, 7:59 PM about:blank\n",
+       "about:blank 1/4\n",
+       "PRICING INFORMATION\n",
+       "INTEREST RATES AND INTEREST CHARGES\n",
+       "Purchase Annual\n",
+       "Percentage Rate (APR) 0% Intro APR for the first 18 months that your Account is open.\n",
+       "After that, 19.49%. This APR will vary with the market based on the Prim\n",
+       "...\n",
+       "
\n" + ], + "text/plain": [ + "Chase Credit Card Document:\n", + "\n", + "\u001b[1;36m2\u001b[0m/\u001b[1;36m25\u001b[0m/\u001b[1;36m23\u001b[0m, \u001b[1;92m7:59\u001b[0m PM about:blank\n", + "about:blank \u001b[1;36m1\u001b[0m/\u001b[1;36m4\u001b[0m\n", + "PRICING INFORMATION\n", + "INTEREST RATES AND INTEREST CHARGES\n", + "Purchase Annual\n", + "Percentage Rate \u001b[1m(\u001b[0mAPR\u001b[1m)\u001b[0m \u001b[1;36m0\u001b[0m% Intro APR for the first \u001b[1;36m18\u001b[0m months that your Account is open.\n", + "After that, \u001b[1;36m19.49\u001b[0m%. This APR will vary with the market based on the Prim\n", + "\u001b[33m...\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "import guardrails as gd\n", "from rich import print\n", @@ -232,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -245,7 +285,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -285,7 +325,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -302,7 +342,7 @@ "\n", "class Fee(BaseModel):\n", " name: str = Field(validators=[LowerCase(on_fail=\"fix\"), TwoWords(on_fail=\"reask\")])\n", - " explanation: str = Field(validators=[OneLine()])\n", + " explanation: str = Field(validators=[OneLine(on_fail=\"noop\")])\n", " value: float = Field(description=\"The fee amount in USD or as a percentage.\")\n", "\n", "class AccountFee(BaseModel):\n", @@ -336,7 +376,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -352,7 +392,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -368,7 +408,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -1445,7 +1485,7 @@ ], "metadata": { "kernelspec": { - "display_name": "litellm", + "display_name": "060dev", "language": "python", "name": "python3" }, diff --git a/docs/examples/json_function_calling_tools.ipynb b/docs/examples/json_function_calling_tools.ipynb index 136d7870c..f3fb7f73d 100644 --- a/docs/examples/json_function_calling_tools.ipynb +++ b/docs/examples/json_function_calling_tools.ipynb @@ -205,7 +205,7 @@ "NAME_REGEX = \"^[A-Z][a-z]+\\\\s[A-Z][a-z]+$\"\n", "\n", "class Delivery(BaseModel):\n", - " custome_name: str= Field(validators=[RegexMatch(regex=NAME_REGEX)], description=\"customer name\")\n", + " custome_name: str= Field(validators=[RegexMatch(regex=NAME_REGEX, on_fail=\"noop\")], description=\"customer name\")\n", " pickup_time: str= Field(description=\"date and time of pickup\")\n", " pickup_location: str= Field(description=\"address of pickup\")\n", " dropoff_time: str= Field(description=\"date and time of dropoff\")\n", diff --git a/docs/examples/lite_llm_defaults.ipynb b/docs/examples/lite_llm_defaults.ipynb index b173f9cde..8c8792218 100644 --- a/docs/examples/lite_llm_defaults.ipynb +++ b/docs/examples/lite_llm_defaults.ipynb @@ -80,7 +80,7 @@ "# import os\n", "# os.environ[\"OPENAI_API_KEY\"] = \"YOUR_API_KEY\"\n", "\n", - "guard = Guard().use(RegexMatch(\"95\", match_type=\"search\"))\n", + "guard = Guard().use(RegexMatch(\"95\", match_type=\"search\", on_fail=\"noop\"))\n", "\n", "response = guard(\n", " model=\"gpt-4o\",\n", From 595ccf5adbe4bbf1a00a0f3ace3c7ad2e15ee073 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 22 Oct 2024 19:08:58 -0700 Subject: [PATCH 53/71] Installs from private pypi with validator versioning --- guardrails/cli/hub/utils.py | 52 +++++--- guardrails/hub/install.py | 30 ++++- guardrails/hub/validator_package_service.py | 140 ++++++++++---------- 3 files changed, 127 insertions(+), 95 deletions(-) diff --git a/guardrails/cli/hub/utils.py b/guardrails/cli/hub/utils.py index 8d7220801..5abe7d2c9 100644 --- a/guardrails/cli/hub/utils.py +++ b/guardrails/cli/hub/utils.py @@ -3,17 +3,24 @@ import re import subprocess import sys + +from typing import Literal +import logging + from email.parser import BytesHeaderParser -from typing import List, Literal, Union +from typing import List, Union from pydash.strings import snake_case from guardrails_hub_types import Manifest -from guardrails.cli.logger import logger - json_format: Literal["json"] = "json" string_format: Literal["string"] = "string" +logger = logging.getLogger(__name__) + +json_format = "json" +string_format = "string" + def pip_process( action: str, @@ -34,47 +41,50 @@ def pip_process( env = dict(os.environ) if no_color: env["NO_COLOR"] = "true" - if not quiet: - logger.debug(f"decoding output from pip {action} {package}") - output = subprocess.check_output(command, env=env) - else: - output = subprocess.check_output( - command, stderr=subprocess.DEVNULL, env=env - ) + + result = subprocess.run( + command, + env=env, + capture_output=True, # Capture both stdout and stderr + text=True, # Automatically decode to strings + check=True, # Automatically raise error on non-zero exit code + ) if format == json_format: - parsed = BytesHeaderParser().parsebytes(output) try: remove_color_codes = re.compile(r"\x1b\[[0-9;]*m") - parsed_as_string = re.sub( - remove_color_codes, "", parsed.as_string().strip() - ) + parsed_as_string = re.sub(remove_color_codes, "", result.stdout.strip()) return json.loads(parsed_as_string) except Exception: logger.debug( - f"JSON parse exception in decoding output from pip \ -{action} {package}. Falling back to accumulating the byte stream", + f"JSON parse exception in decoding output from pip {action}" + "{package}. Falling back to accumulating the byte stream", ) accumulator = {} + parsed = BytesHeaderParser().parsebytes(result.stdout.encode()) for key, value in parsed.items(): accumulator[key] = value return accumulator - return str(output.decode()) + + return result.stdout + except subprocess.CalledProcessError as exc: logger.error( ( f"Failed to {action} {package}\n" f"Exit code: {exc.returncode}\n" - f"stdout: {exc.output}" + f"stderr: {(exc.stderr or "").strip()}\n" + f"stdout: {(exc.stdout or "").strip()}" ) ) - sys.exit(1) + # Re-raise the error or handle it accordingly + raise except Exception as e: logger.error( - f"An unexpected exception occurred while try to {action} {package}!", + f"An unexpected exception occurred while trying to {action} {package}!", e, ) - sys.exit(1) + raise def get_site_packages_location() -> str: diff --git a/guardrails/hub/install.py b/guardrails/hub/install.py index 677e7c392..7f09b604a 100644 --- a/guardrails/hub/install.py +++ b/guardrails/hub/install.py @@ -1,7 +1,10 @@ from contextlib import contextmanager +import contextlib from string import Template from typing import Callable, cast, List +import pkg_resources + from guardrails.hub.validator_package_service import ( ValidatorPackageService, ValidatorModuleType, @@ -52,9 +55,11 @@ def install( Examples: >>> RegexMatch = install("hub://guardrails/regex_match").RegexMatch + >>> RegexMatch = install("hub://guardrails/regex_match~=1.4").RegexMatch + - >>> install("hub://guardrails/regex_match") - >>> import guardrails.hub.regex_match as regex_match + >>> install("hub://guardrails/regex_match>=1.4,==1.*.") + >>> from guardrails.hub.regex_match import RegexMatch """ verbose_printer = console.print @@ -62,7 +67,9 @@ def install( # 1. Validation rc_file_exists = RC.exists() - module_name = ValidatorPackageService.get_module_name(package_uri) + validator_id, validator_version = ValidatorPackageService.get_validator_id( + package_uri + ) installing_msg = f"Installing {package_uri}..." cli_logger.log( @@ -78,15 +85,15 @@ def install( fetch_manifest_msg = "Fetching manifest" with loader(fetch_manifest_msg, spinner="bouncingBar"): (module_manifest, site_packages) = ( - ValidatorPackageService.get_manifest_and_site_packages(module_name) + ValidatorPackageService.get_manifest_and_site_packages(validator_id) ) # 3. Install - Pip Installation of git module dl_deps_msg = "Downloading dependencies" with loader(dl_deps_msg, spinner="bouncingBar"): ValidatorPackageService.install_hub_module( - module_manifest, - site_packages, + validator_id, + validator_version=validator_version, quiet=quiet, upgrade=upgrade, logger=cli_logger, @@ -139,7 +146,16 @@ def install( # Print success messages cli_logger.info("Installation complete") - verbose_printer(f"✅Successfully installed {module_name}!\n\n") + installed_version_message = "" + with contextlib.suppress(Exception): + package_name = ValidatorPackageService.get_normalized_package_name(validator_id) + installed_version = pkg_resources.get_distribution(package_name).version + if installed_version: + installed_version_message = f" version {installed_version}" + + verbose_printer( + f"✅Successfully installed {validator_id}{installed_version_message}!\n\n" + ) success_message_cli = Template( "[bold]Import validator:[/bold]\n" "from guardrails.hub import ${export}\n\n" diff --git a/guardrails/hub/validator_package_service.py b/guardrails/hub/validator_package_service.py index e90825d27..8431dc9d1 100644 --- a/guardrails/hub/validator_package_service.py +++ b/guardrails/hub/validator_package_service.py @@ -1,20 +1,22 @@ import importlib import os from pathlib import Path +import re import subprocess import sys -from typing import List, Literal +from typing import List, Literal, Optional from types import ModuleType from pydash.strings import snake_case +from packaging.utils import canonicalize_name # PEP 503 -from guardrails.classes.generic.stack import Stack from guardrails.logger import logger as guardrails_logger from guardrails.cli.hub.utils import pip_process from guardrails_hub_types import Manifest from guardrails.cli.server.hub_client import get_validator_manifest +from guardrails.settings import settings json_format: Literal["json"] = "json" @@ -91,11 +93,13 @@ def get_validator_from_manifest(manifest: Manifest) -> ModuleType: Returns: Any: The Validator class from the installed module """ - org_package = ValidatorPackageService.get_org_and_package_dirs(manifest) - module_name = manifest.module_name - _relative_path = ".".join([*org_package, module_name]) - import_line = f"guardrails.hub.{_relative_path}" + validator_id = manifest.id + import_path = ValidatorPackageService.get_import_path_from_validator_id( + validator_id + ) + + import_line = f"{import_path}" # Reload or import the module return ValidatorPackageService.reload_module(import_line) @@ -112,14 +116,15 @@ def get_org_and_package_dirs( @staticmethod def add_to_hub_inits(manifest: Manifest, site_packages: str): + validator_id = manifest.id org_package = ValidatorPackageService.get_org_and_package_dirs(manifest) exports: List[str] = manifest.exports or [] sorted_exports = sorted(exports, reverse=True) - module_name = manifest.module_name - relative_path = ".".join([*org_package, module_name]) - import_line = ( - f"from guardrails.hub.{relative_path} import {', '.join(sorted_exports)}" + + import_path = ValidatorPackageService.get_import_path_from_validator_id( + validator_id ) + import_line = f"from {import_path} import {', '.join(sorted_exports)}" hub_init_location = os.path.join( site_packages, "guardrails", "hub", "__init__.py" @@ -179,14 +184,29 @@ def get_module_path(package_name): return package_path @staticmethod - def get_module_name(package_uri: str): - if not package_uri.startswith("hub://"): + def get_validator_id(validator_uri: str): + if not validator_uri.startswith("hub://"): raise InvalidHubInstallURL( "Invalid URI! The package URI must start with 'hub://'" ) - module_name = package_uri.replace("hub://", "") - return module_name + validator_uri_with_version = validator_uri.replace("hub://", "") + + validator_id_version_regex = ( + r"(?P[\/a-zA-Z0-9\-_]+)(?P.*)" + ) + match = re.match(validator_id_version_regex, validator_uri_with_version) + validator_version = None + + if match: + validator_id = match.group("validator_id") + validator_version = ( + match.group("version").strip() if match.group("version") else None + ) + else: + validator_id = validator_uri_with_version + + return (validator_id, validator_version) @staticmethod def get_install_url(manifest: Manifest) -> str: @@ -207,18 +227,19 @@ def get_install_url(manifest: Manifest) -> str: def run_post_install( manifest: Manifest, site_packages: str, logger=guardrails_logger ): - org_package = ValidatorPackageService.get_org_and_package_dirs(manifest) + validator_id = manifest.id post_install_script = manifest.post_install + if not post_install_script: return - module_name = manifest.module_name + import_path = ValidatorPackageService.get_import_path_from_validator_id( + validator_id + ) + relative_path = os.path.join( site_packages, - "guardrails", - "hub", - *org_package, - module_name, + import_path, post_install_script, ) @@ -255,20 +276,42 @@ def get_hub_directory(manifest: Manifest, site_packages: str) -> str: org_package = ValidatorPackageService.get_org_and_package_dirs(manifest) return os.path.join(site_packages, "guardrails", "hub", *org_package) + @staticmethod + def get_normalized_package_name(validator_id: str): + validator_id_parts = validator_id.split("/") + concatanated_package_name = ( + f"{validator_id_parts[0]}-grhub-{validator_id_parts[1]}" + ) + pep_503_package_name = canonicalize_name(concatanated_package_name) + return pep_503_package_name + + @staticmethod + def get_import_path_from_validator_id(validator_id): + pep_503_package_name = ValidatorPackageService.get_normalized_package_name( + validator_id + ) + return pep_503_package_name.replace("-", "_") + @staticmethod def install_hub_module( - module_manifest: Manifest, - site_packages: str, + validator_id: str, + validator_version: Optional[str] = "", quiet: bool = False, upgrade: bool = False, logger=guardrails_logger, ): - install_url = ValidatorPackageService.get_install_url(module_manifest) - install_directory = ValidatorPackageService.get_hub_directory( - module_manifest, site_packages + pep_503_package_name = ValidatorPackageService.get_normalized_package_name( + validator_id ) + validator_version = validator_version if validator_version else "" + full_package_name = f"{pep_503_package_name}{validator_version}" + + guardrails_token = settings.rc.token - pip_flags = [f"--target={install_directory}", "--no-deps"] + pip_flags = [ + f"--index-url=https://__token__:{guardrails_token}@e4c4zula06.execute-api.us-east-1.amazonaws.com/simple", + "--extra-index-url=https://pypi.org/simple", + ] if upgrade: pip_flags.append("--upgrade") @@ -276,46 +319,9 @@ def install_hub_module( if quiet: pip_flags.append("-q") - # Install validator module in namespaced directory under guardrails.hub - download_output = pip_process("install", install_url, pip_flags, quiet=quiet) + # Install from guardrails hub pypi server with public pypi index as fallback + download_output = pip_process( + "install", full_package_name, pip_flags, quiet=quiet + ) if not quiet: logger.info(download_output) - - # Install validator module's dependencies in normal site-packages directory - inspect_output = pip_process( - "inspect", - flags=[f"--path={install_directory}"], - format=json_format, - quiet=quiet, - no_color=True, - ) - - # throw if inspect_output is a string. Mostly for pyright - if isinstance(inspect_output, str): - logger.error("Failed to inspect the installed package!") - raise FailedPackageInspection - - dependencies = ( - Stack(*inspect_output.get("installed", [])) - .at(0, {}) - .get("metadata", {}) # type: ignore - .get("requires_dist", []) # type: ignore - ) - requirements = list(filter(lambda dep: "extra" not in dep, dependencies)) - for req in requirements: - if "git+" in req: - install_spec = req.replace(" ", "") - dep_install_output = pip_process("install", install_spec, quiet=quiet) - if not quiet: - logger.info(dep_install_output) - else: - req_info = Stack(*req.split(" ")) - name = req_info.at(0, "").strip() # type: ignore - versions = req_info.at(1, "").strip("()") # type: ignore - if name: - install_spec = name if not versions else f"{name}{versions}" - dep_install_output = pip_process( - "install", install_spec, quiet=quiet - ) - if not quiet: - logger.info(dep_install_output) From 6d31efc25da3290fef43dea3f2a012392e192898 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 22 Oct 2024 19:13:35 -0700 Subject: [PATCH 54/71] chore: Fix typo in pip_process function --- guardrails/cli/hub/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guardrails/cli/hub/utils.py b/guardrails/cli/hub/utils.py index 5abe7d2c9..b4af8283f 100644 --- a/guardrails/cli/hub/utils.py +++ b/guardrails/cli/hub/utils.py @@ -58,7 +58,7 @@ def pip_process( except Exception: logger.debug( f"JSON parse exception in decoding output from pip {action}" - "{package}. Falling back to accumulating the byte stream", + f"{package}. Falling back to accumulating the byte stream", ) accumulator = {} parsed = BytesHeaderParser().parsebytes(result.stdout.encode()) From 3b781146d07f1f347b7cbf9fcfa0d4fc624a0432 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 22 Oct 2024 19:40:03 -0700 Subject: [PATCH 55/71] wip: updating tests --- guardrails/hub/validator_package_service.py | 20 --- .../hub/test_validator_package_service.py | 147 +++--------------- 2 files changed, 25 insertions(+), 142 deletions(-) diff --git a/guardrails/hub/validator_package_service.py b/guardrails/hub/validator_package_service.py index 8431dc9d1..41518bc3b 100644 --- a/guardrails/hub/validator_package_service.py +++ b/guardrails/hub/validator_package_service.py @@ -208,21 +208,6 @@ def get_validator_id(validator_uri: str): return (validator_id, validator_version) - @staticmethod - def get_install_url(manifest: Manifest) -> str: - repo = manifest.repository - repo_url = repo.url - branch = repo.branch - - git_url = repo_url - if not repo_url.startswith("git+"): - git_url = f"git+{repo_url}" - - if branch is not None: - git_url = f"{git_url}@{branch}" - - return git_url - @staticmethod def run_post_install( manifest: Manifest, site_packages: str, logger=guardrails_logger @@ -271,11 +256,6 @@ def run_post_install( """ ) - @staticmethod - def get_hub_directory(manifest: Manifest, site_packages: str) -> str: - org_package = ValidatorPackageService.get_org_and_package_dirs(manifest) - return os.path.join(site_packages, "guardrails", "hub", *org_package) - @staticmethod def get_normalized_package_name(validator_id: str): validator_id_parts = validator_id.split("/") diff --git a/tests/unit_tests/hub/test_validator_package_service.py b/tests/unit_tests/hub/test_validator_package_service.py index a407c312b..7f27d9c79 100644 --- a/tests/unit_tests/hub/test_validator_package_service.py +++ b/tests/unit_tests/hub/test_validator_package_service.py @@ -1,4 +1,5 @@ from pathlib import Path +from typing import cast import pytest import sys from unittest.mock import call, patch, MagicMock @@ -88,6 +89,7 @@ def test_closes_early_if_already_added(self, mocker): from guardrails.hub.validator_package_service import ValidatorPackageService + manifest = cast(Manifest, manifest) ValidatorPackageService.add_to_hub_inits(manifest, site_packages) assert mock_open.call_count == 2 @@ -154,6 +156,7 @@ def test_appends_import_line_if_not_present(self, mocker): from guardrails.hub.validator_package_service import ValidatorPackageService + manifest = cast(Manifest, manifest) ValidatorPackageService.add_to_hub_inits(manifest, site_packages) assert mock_open.call_count == 2 @@ -235,6 +238,7 @@ def test_creates_namespace_init_if_not_exists(self, mocker): from guardrails.hub.validator_package_service import ValidatorPackageService + manifest = cast(Manifest, manifest) ValidatorPackageService.add_to_hub_inits(manifest, site_packages) assert mock_open.call_count == 2 @@ -335,7 +339,7 @@ class TestRunPostInstall: [ Manifest.from_dict( { - "id": "id", + "id": "guardrails-ai/id", "name": "name", "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], @@ -350,7 +354,7 @@ class TestRunPostInstall: ), Manifest.from_dict( { - "id": "id", + "id": "guardrails-ai/id", "name": "name", "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], @@ -391,7 +395,7 @@ def test_runs_script_if_exists(self, mocker): manifest = Manifest.from_dict( { - "id": "id", + "id": "guardrails-ai/id", "name": "name", "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], @@ -406,6 +410,7 @@ def test_runs_script_if_exists(self, mocker): } ) + manifest = cast(Manifest, manifest) ValidatorPackageService.run_post_install(manifest, "./site_packages") assert mock_subprocess_check_output.call_count == 1 @@ -421,7 +426,7 @@ class TestValidatorPackageService: def setup_method(self): self.manifest = Manifest.from_dict( { - "id": "id", + "id": "guardrails/id", "name": "name", "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], @@ -466,25 +471,17 @@ def test_get_site_packages_location(self, mock_get_module_path): site_packages_path = ValidatorPackageService.get_site_packages_location() assert site_packages_path == "/fake/site-packages" - @patch( - "guardrails.hub.validator_package_service.ValidatorPackageService.get_org_and_package_dirs" - ) @patch( "guardrails.hub.validator_package_service.ValidatorPackageService.reload_module" ) - def test_get_validator_from_manifest( - self, mock_reload_module, mock_get_org_and_package_dirs - ): - mock_get_org_and_package_dirs.return_value = ["guardrails_ai", "test_package"] - + def test_get_validator_from_manifest(self, mock_reload_module): mock_validator_module = MagicMock() mock_reload_module.return_value = mock_validator_module - ValidatorPackageService.get_validator_from_manifest(self.manifest) + manifest = cast(Manifest, self.manifest) + ValidatorPackageService.get_validator_from_manifest(manifest) - mock_reload_module.assert_called_once_with( - f"guardrails.hub.guardrails_ai.test_package.{self.manifest.module_name}" - ) + mock_reload_module.assert_called_once_with("guardrails_grhub_id") @pytest.mark.parametrize( "manifest,expected", @@ -492,7 +489,7 @@ def test_get_validator_from_manifest( ( Manifest.from_dict( { - "id": "id", + "id": "guardrails-ai/id", "name": "name", "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], @@ -510,12 +507,12 @@ def test_get_validator_from_manifest( ( Manifest.from_dict( { - "id": "id", + "id": "guardrails-ai/id", "name": "name", "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], "repository": {"url": "some-repo"}, - "namespace": "", + "namespace": "guardrails-ai", "packageName": "test-validator", "moduleName": "test_validator", "description": "description", @@ -534,98 +531,17 @@ def test_get_org_and_package_dirs(self, manifest, expected): assert actual == expected def test_get_module_name_valid(self): - module_name = ValidatorPackageService.get_module_name("hub://test-module") + module_name, module_version = ValidatorPackageService.get_validator_id( + "hub://test-module>=1.0.0" + ) assert module_name == "test-module" + assert module_version == ">=1.0.0" def test_get_module_name_invalid(self): with pytest.raises(InvalidHubInstallURL): - ValidatorPackageService.get_module_name("invalid-uri") - - @pytest.mark.parametrize( - "manifest,expected", - [ - ( - Manifest.from_dict( - { - "id": "id", - "name": "name", - "author": {"name": "me", "email": "me@me.me"}, - "maintainers": [], - "repository": {"url": "some-repo"}, - "namespace": "guardrails-ai", - "packageName": "test-validator", - "moduleName": "validator", - "description": "description", - "exports": ["TestValidator"], - "tags": {}, - } - ), - "git+some-repo", - ), - ( - Manifest.from_dict( - { - "id": "id", - "name": "name", - "author": {"name": "me", "email": "me@me.me"}, - "maintainers": [], - "repository": {"url": "git+some-repo"}, - "namespace": "guardrails-ai", - "packageName": "test-validator", - "moduleName": "validator", - "description": "description", - "exports": ["TestValidator"], - "tags": {}, - "post_install": "", - } - ), - "git+some-repo", - ), - ( - Manifest.from_dict( - { - "id": "id", - "name": "name", - "author": {"name": "me", "email": "me@me.me"}, - "maintainers": [], - "repository": {"url": "git+some-repo", "branch": "prod"}, - "namespace": "guardrails-ai", - "packageName": "test-validator", - "moduleName": "validator", - "description": "description", - "exports": ["TestValidator"], - "tags": {}, - "post_install": "", - } - ), - "git+some-repo@prod", - ), - ], - ) - def test_get_install_url(self, manifest, expected): - actual = ValidatorPackageService.get_install_url(manifest) - assert actual == expected - - def test_get_hub_directory(self): - hub_directory = ValidatorPackageService.get_hub_directory( - self.manifest, self.site_packages - ) - assert ( - hub_directory - == "./.venv/lib/python3.X/site-packages/guardrails/hub/guardrails/test_validator" # noqa - ) # noqa + ValidatorPackageService.get_validator_id("invalid-uri") def test_install_hub_module(self, mocker): - mock_get_install_url = mocker.patch( - "guardrails.hub.validator_package_service.ValidatorPackageService.get_install_url" - ) - mock_get_install_url.return_value = "mock-install-url" - - mock_get_hub_directory = mocker.patch( - "guardrails.hub.validator_package_service.ValidatorPackageService.get_hub_directory" - ) - mock_get_hub_directory.return_value = "mock/install/directory" - mock_pip_process = mocker.patch( "guardrails.hub.validator_package_service.pip_process" ) @@ -653,7 +569,7 @@ def test_install_hub_module(self, mocker): manifest = Manifest.from_dict( { - "id": "id", + "id": "guardrails-ai/id", "name": "name", "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], @@ -666,13 +582,10 @@ def test_install_hub_module(self, mocker): "tags": {}, } ) - site_packages = "./site-packages" - ValidatorPackageService.install_hub_module(manifest, site_packages) + manifest = cast(Manifest, manifest) + ValidatorPackageService.install_hub_module(manifest.id) - mock_get_install_url.assert_called_once_with(manifest) - mock_get_hub_directory.assert_called_once_with(manifest, site_packages) - - assert mock_pip_process.call_count == 5 + assert mock_pip_process.call_count == 1 pip_calls = [ call( "install", @@ -680,15 +593,5 @@ def test_install_hub_module(self, mocker): ["--target=mock/install/directory", "--no-deps"], quiet=False, ), - call( - "inspect", - flags=["--path=mock/install/directory"], - format="json", - quiet=False, - no_color=True, - ), - call("install", "rstr", quiet=False), - call("install", "openai<2", quiet=False), - call("install", "pydash>=7.0.6,<8.0.0", quiet=False), ] mock_pip_process.assert_has_calls(pip_calls) From 0d1367a6a66d3319edac19054abb6323224c0901 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 22 Oct 2024 23:04:13 -0700 Subject: [PATCH 56/71] fixed tests --- guardrails/hub/validator_package_service.py | 2 +- tests/unit_tests/hub/test_hub_install.py | 53 +++++++++---------- .../hub/test_validator_package_service.py | 38 ++++++++----- 3 files changed, 50 insertions(+), 43 deletions(-) diff --git a/guardrails/hub/validator_package_service.py b/guardrails/hub/validator_package_service.py index 41518bc3b..ee2b87e42 100644 --- a/guardrails/hub/validator_package_service.py +++ b/guardrails/hub/validator_package_service.py @@ -289,7 +289,7 @@ def install_hub_module( guardrails_token = settings.rc.token pip_flags = [ - f"--index-url=https://__token__:{guardrails_token}@e4c4zula06.execute-api.us-east-1.amazonaws.com/simple", + f"--index-url=https://__token__:{guardrails_token}@pypi.guardrailsai.com/simple", "--extra-index-url=https://pypi.org/simple", ] diff --git a/tests/unit_tests/hub/test_hub_install.py b/tests/unit_tests/hub/test_hub_install.py index 3aea52899..c94c909c7 100644 --- a/tests/unit_tests/hub/test_hub_install.py +++ b/tests/unit_tests/hub/test_hub_install.py @@ -18,7 +18,7 @@ class TestInstall: def setup_method(self): self.manifest = Manifest.from_dict( { - "id": "id", + "id": "guardrails/id", "name": "name", "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], @@ -74,13 +74,13 @@ def test_install_local_models__false(self, mocker, use_remote_inferencing): ) install( - "hub://guardrails/test-validator", + "hub://guardrails/id", install_local_models=False, install_local_models_confirm=lambda: False, ) log_calls = [ - call(level=5, msg="Installing hub://guardrails/test-validator..."), + call(level=5, msg="Installing hub://guardrails/id..."), call( level=5, msg="Skipping post install, models will not be downloaded for local " @@ -88,18 +88,16 @@ def test_install_local_models__false(self, mocker, use_remote_inferencing): ), call( level=5, - msg="✅Successfully installed hub://guardrails/test-validator!\n\nImport validator:\nfrom guardrails.hub import TestValidator\n\nGet more info:\nhttps://hub.guardrailsai.com/validator/id\n", # noqa + msg="✅Successfully installed hub://guardrails/id!\n\nImport validator:\nfrom guardrails.hub import TestValidator\n\nGet more info:\nhttps://hub.guardrailsai.com/validator/guardrails/id\n", # noqa ), # noqa ] assert mock_logger_log.call_count == 3 mock_logger_log.assert_has_calls(log_calls) - get_manifest_and_site_packages_mock.assert_called_once_with( - "guardrails/test-validator" - ) + get_manifest_and_site_packages_mock.assert_called_once_with("guardrails/id") mock_pip_install_hub_module.assert_called_once_with( - self.manifest, self.site_packages, quiet=ANY, upgrade=ANY, logger=ANY + self.manifest.id, validator_version=None, quiet=ANY, upgrade=ANY, logger=ANY ) mock_add_to_hub_init.assert_called_once_with(self.manifest, self.site_packages) @@ -117,6 +115,9 @@ def test_install_local_models__true(self, mocker, use_remote_inferencing): mock_logger_log = mocker.patch("guardrails.hub.install.cli_logger.log") + pkg_resources = mocker.patch("guardrails.hub.install.pkg_resources") + pkg_resources.get_distribution.return_value.version = "1.0.0" + get_manifest_and_site_packages_mock = mocker.patch( "guardrails.hub.validator_package_service.ValidatorPackageService.get_manifest_and_site_packages" ) @@ -136,31 +137,29 @@ def test_install_local_models__true(self, mocker, use_remote_inferencing): ) install( - "hub://guardrails/test-validator", + "hub://guardrails/id", install_local_models=True, install_local_models_confirm=lambda: True, ) log_calls = [ - call(level=5, msg="Installing hub://guardrails/test-validator..."), + call(level=5, msg="Installing hub://guardrails/id..."), call( level=5, msg="Installing models locally!", ), call( level=5, - msg="✅Successfully installed hub://guardrails/test-validator!\n\nImport validator:\nfrom guardrails.hub import TestValidator\n\nGet more info:\nhttps://hub.guardrailsai.com/validator/id\n", # noqa + msg="✅Successfully installed hub://guardrails/id!\n\nImport validator:\nfrom guardrails.hub import TestValidator\n\nGet more info:\nhttps://hub.guardrailsai.com/validator/guardrails/id\n", # noqa ), # noqa ] assert mock_logger_log.call_count == 3 mock_logger_log.assert_has_calls(log_calls) - get_manifest_and_site_packages_mock.assert_called_once_with( - "guardrails/test-validator" - ) + get_manifest_and_site_packages_mock.assert_called_once_with("guardrails/id") mock_pip_install_hub_module.assert_called_once_with( - self.manifest, self.site_packages, quiet=ANY, upgrade=ANY, logger=ANY + self.manifest.id, validator_version=None, quiet=ANY, upgrade=ANY, logger=ANY ) mock_add_to_hub_init.assert_called_once_with(self.manifest, self.site_packages) @@ -197,31 +196,29 @@ def test_install_local_models__none(self, mocker, use_remote_inferencing): ) install( - "hub://guardrails/test-validator", + "hub://guardrails/id", install_local_models=None, install_local_models_confirm=lambda: True, ) log_calls = [ - call(level=5, msg="Installing hub://guardrails/test-validator..."), + call(level=5, msg="Installing hub://guardrails/id..."), call( level=5, msg="Installing models locally!", ), call( level=5, - msg="✅Successfully installed hub://guardrails/test-validator!\n\nImport validator:\nfrom guardrails.hub import TestValidator\n\nGet more info:\nhttps://hub.guardrailsai.com/validator/id\n", # noqa + msg="✅Successfully installed hub://guardrails/id!\n\nImport validator:\nfrom guardrails.hub import TestValidator\n\nGet more info:\nhttps://hub.guardrailsai.com/validator/guardrails/id\n", # noqa ), # noqa ] assert mock_logger_log.call_count == 3 mock_logger_log.assert_has_calls(log_calls) - get_manifest_and_site_packages_mock.assert_called_once_with( - "guardrails/test-validator" - ) + get_manifest_and_site_packages_mock.assert_called_once_with("guardrails/id") mock_pip_install_hub_module.assert_called_once_with( - self.manifest, self.site_packages, quiet=ANY, upgrade=ANY, logger=ANY + self.manifest.id, validator_version=None, quiet=ANY, upgrade=ANY, logger=ANY ) mock_add_to_hub_init.assert_called_once_with(self.manifest, self.site_packages) @@ -258,12 +255,12 @@ def test_happy_path(self, mocker, use_remote_inferencing): ) install( - "hub://guardrails/test-validator", + "hub://guardrails/id", install_local_models_confirm=lambda: True, ) log_calls = [ - call(level=5, msg="Installing hub://guardrails/test-validator..."), + call(level=5, msg="Installing hub://guardrails/id..."), call( level=5, msg="Installing models locally!", # noqa @@ -273,12 +270,10 @@ def test_happy_path(self, mocker, use_remote_inferencing): assert mock_logger_log.call_count == 3 mock_logger_log.assert_has_calls(log_calls) - get_manifest_and_site_packages_mock.assert_called_once_with( - "guardrails/test-validator" - ) + get_manifest_and_site_packages_mock.assert_called_once_with("guardrails/id") mock_pip_install_hub_module.assert_called_once_with( - self.manifest, self.site_packages, quiet=ANY, upgrade=ANY, logger=ANY + self.manifest.id, validator_version=None, quiet=ANY, upgrade=ANY, logger=ANY ) mock_add_to_hub_init.assert_called_once_with(self.manifest, self.site_packages) @@ -408,7 +403,7 @@ def test_use_remote_endpoint(self, mocker, use_remote_inferencing: bool): manifest = Manifest.from_dict( { - "id": "id", + "id": "guardrails/test-validator", "name": "name", "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], diff --git a/tests/unit_tests/hub/test_validator_package_service.py b/tests/unit_tests/hub/test_validator_package_service.py index 7f27d9c79..9e8b10cf3 100644 --- a/tests/unit_tests/hub/test_validator_package_service.py +++ b/tests/unit_tests/hub/test_validator_package_service.py @@ -48,7 +48,7 @@ class TestAddToHubInits: def test_closes_early_if_already_added(self, mocker): manifest = Manifest.from_dict( { - "id": "id", + "id": "guardrails-ai/id", "name": "name", "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], @@ -69,14 +69,18 @@ def test_closes_early_if_already_added(self, mocker): mock_open.side_effect = [hub_init_file, ns_init_file] mock_hub_read = mocker.patch.object(hub_init_file, "read") - mock_hub_read.return_value = "from guardrails.hub.guardrails_ai.test_validator.validator import helper, TestValidator" # noqa + mock_hub_read.return_value = ( + "from guardrails_ai_grhub_id import helper, TestValidator" # noqa + ) hub_seek_spy = mocker.spy(hub_init_file, "seek") hub_write_spy = mocker.spy(hub_init_file, "write") hub_close_spy = mocker.spy(hub_init_file, "close") mock_ns_read = mocker.patch.object(ns_init_file, "read") - mock_ns_read.return_value = "from guardrails.hub.guardrails_ai.test_validator.validator import helper, TestValidator" # noqa + mock_ns_read.return_value = ( + "from guardrails_ai_grhub_id import helper, TestValidator" # noqa + ) ns_seek_spy = mocker.spy(ns_init_file, "seek") ns_write_spy = mocker.spy(ns_init_file, "write") @@ -115,7 +119,7 @@ def test_closes_early_if_already_added(self, mocker): def test_appends_import_line_if_not_present(self, mocker): manifest = Manifest.from_dict( { - "id": "id", + "id": "guardrails-ai/id", "name": "name", "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], @@ -176,7 +180,7 @@ def test_appends_import_line_if_not_present(self, mocker): hub_write_calls = [ call("\n"), call( - "from guardrails.hub.guardrails_ai.test_validator.validator import TestValidator" # noqa + "from guardrails_ai_grhub_id import TestValidator" # noqa ), ] hub_write_spy.assert_has_calls(hub_write_calls) @@ -194,14 +198,14 @@ def test_appends_import_line_if_not_present(self, mocker): assert mock_ns_read.call_count == 1 assert ns_write_spy.call_count == 1 ns_write_spy.assert_called_once_with( - "from guardrails.hub.guardrails_ai.test_validator.validator import TestValidator" # noqa + "from guardrails_ai_grhub_id import TestValidator" # noqa ) assert ns_close_spy.call_count == 1 def test_creates_namespace_init_if_not_exists(self, mocker): manifest = Manifest.from_dict( { - "id": "id", + "id": "guardrails-ai/id", "name": "name", "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], @@ -222,7 +226,7 @@ def test_creates_namespace_init_if_not_exists(self, mocker): mock_open.side_effect = [hub_init_file, ns_init_file] mock_hub_read = mocker.patch.object(hub_init_file, "read") - mock_hub_read.return_value = "from guardrails.hub.guardrails_ai.test_validator.validator import TestValidator" # noqa + mock_hub_read.return_value = "from guardrails_ai_grhub_id import TestValidator" # noqa mock_ns_read = mocker.patch.object(ns_init_file, "read") mock_ns_read.return_value = "" @@ -256,7 +260,7 @@ def test_creates_namespace_init_if_not_exists(self, mocker): assert mock_ns_read.call_count == 0 assert ns_write_spy.call_count == 1 ns_write_spy.assert_called_once_with( - "from guardrails.hub.guardrails_ai.test_validator.validator import TestValidator" # noqa + "from guardrails_ai_grhub_id import TestValidator" # noqa ) assert ns_close_spy.call_count == 1 @@ -417,7 +421,7 @@ def test_runs_script_if_exists(self, mocker): mock_subprocess_check_output.assert_called_once_with( [ mock_sys_executable, - "./site_packages/guardrails/hub/guardrails_ai/test_validator/validator/post_install.py", # noqa + "./site_packages/guardrails_ai_grhub_id/post_install.py", # noqa ] ) @@ -512,7 +516,7 @@ def test_get_validator_from_manifest(self, mock_reload_module): "author": {"name": "me", "email": "me@me.me"}, "maintainers": [], "repository": {"url": "some-repo"}, - "namespace": "guardrails-ai", + "namespace": "", "packageName": "test-validator", "moduleName": "test_validator", "description": "description", @@ -545,6 +549,11 @@ def test_install_hub_module(self, mocker): mock_pip_process = mocker.patch( "guardrails.hub.validator_package_service.pip_process" ) + mock_settings = mocker.patch( + "guardrails.hub.validator_package_service.settings" + ) + mock_settings.rc.token = "mock-token" + inspect_report = { "installed": [ { @@ -589,8 +598,11 @@ def test_install_hub_module(self, mocker): pip_calls = [ call( "install", - "mock-install-url", - ["--target=mock/install/directory", "--no-deps"], + "guardrails-ai-grhub-id", + [ + "--index-url=https://__token__:mock-token@pypi.guardrailsai.com/simple", + "--extra-index-url=https://pypi.org/simple", + ], quiet=False, ), ] From b8d4d18977ea155d990497f57bd4f69357156817 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Wed, 23 Oct 2024 09:55:35 -0700 Subject: [PATCH 57/71] fix f-string syntax error --- guardrails/cli/hub/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guardrails/cli/hub/utils.py b/guardrails/cli/hub/utils.py index b4af8283f..0ab34a5cb 100644 --- a/guardrails/cli/hub/utils.py +++ b/guardrails/cli/hub/utils.py @@ -73,8 +73,8 @@ def pip_process( ( f"Failed to {action} {package}\n" f"Exit code: {exc.returncode}\n" - f"stderr: {(exc.stderr or "").strip()}\n" - f"stdout: {(exc.stdout or "").strip()}" + f"stderr: {(exc.stderr or '').strip()}\n" + f"stdout: {(exc.stdout or '').strip()}" ) ) # Re-raise the error or handle it accordingly From 5b4d6b8a097af8f2fe81d6f90a25220b8fddebb0 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Wed, 23 Oct 2024 13:56:24 -0700 Subject: [PATCH 58/71] fixed uninstall, list validators cli cmds, and tests --- guardrails/cli/hub/list.py | 5 +- guardrails/cli/hub/uninstall.py | 58 +++++++------------- guardrails/cli/hub/utils.py | 13 +---- tests/unit_tests/cli/hub/test_install.py | 51 ++++++++--------- tests/unit_tests/cli/hub/test_list.py | 2 +- tests/unit_tests/cli/hub/test_uninstall.py | 64 ++++++++++++---------- 6 files changed, 83 insertions(+), 110 deletions(-) diff --git a/guardrails/cli/hub/list.py b/guardrails/cli/hub/list.py index 2dcf0cd3d..8f18dff92 100644 --- a/guardrails/cli/hub/list.py +++ b/guardrails/cli/hub/list.py @@ -2,7 +2,6 @@ import re from guardrails.cli.hub.hub import hub_command -from guardrails.cli.hub.utils import get_site_packages_location from guardrails.hub_telemetry.hub_tracing import trace from .console import console @@ -11,7 +10,9 @@ @trace(name="guardrails-cli/hub/list") def list(): """List all installed validators.""" - site_packages = get_site_packages_location() + from guardrails.hub.validator_package_service import ValidatorPackageService + + site_packages = ValidatorPackageService.get_site_packages_location() hub_init_file = os.path.join(site_packages, "guardrails", "hub", "__init__.py") installed_validators = [] diff --git a/guardrails/cli/hub/uninstall.py b/guardrails/cli/hub/uninstall.py index bd3722701..8d298b885 100644 --- a/guardrails/cli/hub/uninstall.py +++ b/guardrails/cli/hub/uninstall.py @@ -1,5 +1,4 @@ import os -import shutil import sys from typing import List, Literal @@ -10,9 +9,7 @@ from guardrails.cli.server.hub_client import get_validator_manifest from guardrails_hub_types import Manifest -from guardrails.cli.hub.utils import get_site_packages_location -from guardrails.cli.hub.utils import get_org_and_package_dirs -from guardrails.cli.hub.utils import get_hub_directory +from guardrails.cli.hub.utils import pip_process from guardrails.hub_telemetry.hub_tracing import trace from .console import console @@ -32,46 +29,28 @@ def remove_line(file_path: str, line_content: str): def remove_from_hub_inits(manifest: Manifest, site_packages: str): - org_package = get_org_and_package_dirs(manifest) + from guardrails.hub.validator_package_service import ValidatorPackageService + exports: List[str] = manifest.exports or [] sorted_exports = sorted(exports, reverse=True) - module_name = manifest.module_name - relative_path = ".".join([*org_package, module_name]) - import_line = ( - f"from guardrails.hub.{relative_path} import {', '.join(sorted_exports)}" + + validator_id = manifest.id + import_path = ValidatorPackageService.get_import_path_from_validator_id( + validator_id ) + import_line = f"from {import_path} import {', '.join(sorted_exports)}" # Remove import line from main __init__.py hub_init_location = os.path.join(site_packages, "guardrails", "hub", "__init__.py") remove_line(hub_init_location, import_line) - # Remove import line from namespace __init__.py - namespace = org_package[0] - namespace_init_location = os.path.join( - site_packages, "guardrails", "hub", namespace, "__init__.py" - ) - lines = remove_line(namespace_init_location, import_line) - - # remove namespace pkg if namespace __init__.py is empty - if (len(lines) == 0) and (namespace != "hub"): - logger.info(f"Removing namespace package {namespace} as it is now empty") - try: - shutil.rmtree(os.path.join(site_packages, "guardrails", "hub", namespace)) - except Exception as e: - logger.error(f"Error removing namespace package {namespace}") - logger.error(e) - sys.exit(1) - - -def uninstall_hub_module(manifest: Manifest, site_packages: str): - uninstall_directory = get_hub_directory(manifest, site_packages) - logger.info(f"Removing directory {uninstall_directory}") - try: - shutil.rmtree(uninstall_directory) - except Exception as e: - logger.error("Error removing directory") - logger.error(e) - sys.exit(1) + +def uninstall_hub_module(manifest: Manifest): + from guardrails.hub.validator_package_service import ValidatorPackageService + + validator_id = manifest.id + package_name = ValidatorPackageService.get_normalized_package_name(validator_id) + pip_process("uninstall", package_name, flags=["-y"], quiet=True) @hub_command.command() @@ -82,6 +61,9 @@ def uninstall( ), ): """Uninstall a validator from the Hub.""" + from guardrails.hub.validator_package_service import ValidatorPackageService + + print(f"ValidatorPackageService: {ValidatorPackageService}") if not package_uri.startswith("hub://"): logger.error("Invalid URI!") sys.exit(1) @@ -98,11 +80,11 @@ def uninstall( # Prep with console.status("Fetching manifest", spinner="bouncingBar"): module_manifest = get_validator_manifest(module_name) - site_packages = get_site_packages_location() + site_packages = ValidatorPackageService.get_site_packages_location() # Uninstall with console.status("Removing module", spinner="bouncingBar"): - uninstall_hub_module(module_manifest, site_packages) + uninstall_hub_module(module_manifest) # Cleanup with console.status("Cleaning up", spinner="bouncingBar"): diff --git a/guardrails/cli/hub/utils.py b/guardrails/cli/hub/utils.py index 0ab34a5cb..5714f32d8 100644 --- a/guardrails/cli/hub/utils.py +++ b/guardrails/cli/hub/utils.py @@ -58,7 +58,7 @@ def pip_process( except Exception: logger.debug( f"JSON parse exception in decoding output from pip {action}" - f"{package}. Falling back to accumulating the byte stream", + f" {package}. Falling back to accumulating the byte stream", ) accumulator = {} parsed = BytesHeaderParser().parsebytes(result.stdout.encode()) @@ -77,20 +77,13 @@ def pip_process( f"stdout: {(exc.stdout or '').strip()}" ) ) - # Re-raise the error or handle it accordingly - raise + sys.exit(1) except Exception as e: logger.error( f"An unexpected exception occurred while trying to {action} {package}!", e, ) - raise - - -def get_site_packages_location() -> str: - output = pip_process("show", "pip", format=json_format) - pip_location = output["Location"] # type: ignore - return pip_location + sys.exit(1) def get_org_and_package_dirs(manifest: Manifest) -> List[str]: diff --git a/tests/unit_tests/cli/hub/test_install.py b/tests/unit_tests/cli/hub/test_install.py index 5c9a749e2..d69103573 100755 --- a/tests/unit_tests/cli/hub/test_install.py +++ b/tests/unit_tests/cli/hub/test_install.py @@ -1,4 +1,4 @@ -from unittest.mock import ANY, call +from unittest.mock import ANY, MagicMock, call from typer.testing import CliRunner from guardrails.cli.hub.install import hub_command @@ -140,25 +140,27 @@ def test_no_package_string_format(self, mocker): mock_sys_executable = mocker.patch("guardrails.cli.hub.utils.sys.executable") - mock_subprocess_check_output = mocker.patch( - "guardrails.cli.hub.utils.subprocess.check_output" - ) - mock_subprocess_check_output.return_value = str.encode("string output") + mock_subprocess_run = mocker.patch("guardrails.cli.hub.utils.subprocess.run") + subprocess_result_mock = MagicMock() + subprocess_result_mock.stdout = "string output" + mock_subprocess_run.return_value = subprocess_result_mock from guardrails.cli.hub.utils import pip_process response = pip_process("inspect", flags=["--path=./install-here"]) - assert mock_logger_debug.call_count == 2 + assert mock_logger_debug.call_count == 1 debug_calls = [ call("running pip inspect --path=./install-here "), - call("decoding output from pip inspect "), ] mock_logger_debug.assert_has_calls(debug_calls) - mock_subprocess_check_output.assert_called_once_with( + mock_subprocess_run.assert_called_once_with( [mock_sys_executable, "-m", "pip", "inspect", "--path=./install-here"], env={}, + capture_output=True, + text=True, + check=True, ) assert response == "string output" @@ -169,10 +171,11 @@ def test_json_format(self, mocker): mock_sys_executable = mocker.patch("guardrails.cli.hub.utils.sys.executable") - mock_subprocess_check_output = mocker.patch( - "guardrails.cli.hub.utils.subprocess.check_output" - ) - mock_subprocess_check_output.return_value = str.encode("json output") + mock_subprocess_run = mocker.patch("guardrails.cli.hub.utils.subprocess.run") + subprocess_result_mock = MagicMock() + subprocess_result_mock.stdout = "json outout" + + mock_subprocess_run.return_value = subprocess_result_mock class MockBytesHeaderParser: def parsebytes(self, *args): @@ -186,18 +189,21 @@ def parsebytes(self, *args): response = pip_process("show", "pip", format="json") - assert mock_logger_debug.call_count == 3 + assert mock_logger_debug.call_count == 2 debug_calls = [ call("running pip show pip"), - call("decoding output from pip show pip"), call( "JSON parse exception in decoding output from pip show pip. Falling back to accumulating the byte stream" # noqa ), ] mock_logger_debug.assert_has_calls(debug_calls) - mock_subprocess_check_output.assert_called_once_with( - [mock_sys_executable, "-m", "pip", "show", "pip"], env={} + mock_subprocess_run.assert_called_once_with( + [mock_sys_executable, "-m", "pip", "show", "pip"], + env={}, + capture_output=True, + text=True, + check=True, ) assert response == {"output": "json"} @@ -271,16 +277,3 @@ def test_install_with_upgrade_flag(self, mocker): ) assert result.exit_code == 0 - - -def test_get_site_packages_location(mocker): - mock_pip_process = mocker.patch("guardrails.cli.hub.utils.pip_process") - mock_pip_process.return_value = {"Location": "/site-packages"} - - from guardrails.cli.hub.utils import get_site_packages_location - - response = get_site_packages_location() - - mock_pip_process.assert_called_once_with("show", "pip", format="json") - - assert response == "/site-packages" diff --git a/tests/unit_tests/cli/hub/test_list.py b/tests/unit_tests/cli/hub/test_list.py index 5c40c831e..d569dea8e 100644 --- a/tests/unit_tests/cli/hub/test_list.py +++ b/tests/unit_tests/cli/hub/test_list.py @@ -13,7 +13,7 @@ class TestListCommand: @pytest.fixture(autouse=True) def setup(self, mocker): mocker.patch( - "guardrails.cli.hub.utils.get_site_packages_location", + "guardrails.hub.validator_package_service.ValidatorPackageService.get_manifest_and_site_packages", return_value="/test/site-packages", ) diff --git a/tests/unit_tests/cli/hub/test_uninstall.py b/tests/unit_tests/cli/hub/test_uninstall.py index aef3db760..f1779938d 100644 --- a/tests/unit_tests/cli/hub/test_uninstall.py +++ b/tests/unit_tests/cli/hub/test_uninstall.py @@ -5,46 +5,35 @@ from guardrails_hub_types import Manifest from guardrails.cli.hub.uninstall import remove_from_hub_inits -manifest_mock = Manifest( - encoder="some_encoder", - id="module_id", - name="test_module", - author={"name": "Author Name", "email": "author@example.com"}, - maintainers=[{"name": "Maintainer Name", "email": "maintainer@example.com"}], - repository={"url": "https://github.com/example/repo"}, - namespace="guardrails", - package_name="test_package", - description="Test module", - module_name="test_module", - exports=["Validator", "Helper"], +manifest_mock = Manifest.from_dict( + { + "id": "guardrails/test_package", + "name": "test_module", + "author": {"name": "Author Name", "email": "author@example.com"}, + "maintainers": [{"name": "Maintainer Name", "email": "maintainer@example.com"}], + "repository": {"url": "https://github.com/example/repo"}, + "packageName": "test_package", + "moduleName": "test_module", + "namespace": "guardrails", + "description": "Test module", + "exports": ["Validator", "Helper"], + } ) def test_remove_from_hub_inits(mocker): - mocker.patch( - "guardrails.cli.hub.uninstall.get_org_and_package_dirs", - return_value=["guardrails", "test_package"], - ) mock_remove_line = mocker.patch("guardrails.cli.hub.uninstall.remove_line") - mock_remove_dirs = mocker.patch("shutil.rmtree") remove_from_hub_inits(manifest_mock, "/site-packages") expected_calls = [ call( "/site-packages/guardrails/hub/__init__.py", - "from guardrails.hub.guardrails.test_package.test_module import " - "Validator, Helper", - ), - call( - "/site-packages/guardrails/hub/guardrails/__init__.py", - "from guardrails.hub.guardrails.test_package.test_module import " - "Validator, Helper", + "from guardrails_grhub_test_package import " "Validator, Helper", ), ] mock_remove_line.assert_has_calls(expected_calls, any_order=True) - mock_remove_dirs.assert_called_once_with("/site-packages/guardrails/hub/guardrails") def test_uninstall_invalid_uri(mocker): @@ -81,10 +70,7 @@ def test_uninstall_valid_uri(mocker): "guardrails.cli.hub.uninstall.get_validator_manifest", return_value=manifest_mock, ) - mocker.patch( - "guardrails.cli.hub.uninstall.get_site_packages_location", - return_value="/site-packages", - ) + mock_uninstall_hub_module = mocker.patch( "guardrails.cli.hub.uninstall.uninstall_hub_module" ) @@ -93,9 +79,27 @@ def test_uninstall_valid_uri(mocker): ) mocker.patch("guardrails.cli.hub.uninstall.console") + validator_package_service_mock = mocker.patch( + "guardrails.hub.validator_package_service.ValidatorPackageService", + ) + validator_package_service_mock.get_site_packages_location.return_value = ( + "/site-packages" + ) + from guardrails.cli.hub.uninstall import uninstall uninstall("hub://guardrails/test-validator") - mock_uninstall_hub_module.assert_called_once_with(manifest_mock, "/site-packages") + mock_uninstall_hub_module.assert_called_once_with(manifest_mock) mock_remove_from_hub_inits.assert_called_once_with(manifest_mock, "/site-packages") + + +def test_uninstall_hub_module(mocker): + mock_pip_process = mocker.patch("guardrails.cli.hub.uninstall.pip_process") + from guardrails.cli.hub.uninstall import uninstall_hub_module + + uninstall_hub_module(manifest_mock) + + mock_pip_process.assert_called_once_with( + "uninstall", "guardrails-grhub-test-package", flags=["-y"], quiet=True + ) From 106cc86e59a01cd43153acfbb027670e36f993b1 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Wed, 23 Oct 2024 13:58:27 -0700 Subject: [PATCH 59/71] removed unused methods from cli hub utils --- guardrails/cli/hub/utils.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/guardrails/cli/hub/utils.py b/guardrails/cli/hub/utils.py index 5714f32d8..c3f1b924a 100644 --- a/guardrails/cli/hub/utils.py +++ b/guardrails/cli/hub/utils.py @@ -9,9 +9,7 @@ from email.parser import BytesHeaderParser from typing import List, Union -from pydash.strings import snake_case -from guardrails_hub_types import Manifest json_format: Literal["json"] = "json" string_format: Literal["string"] = "string" @@ -84,16 +82,3 @@ def pip_process( e, ) sys.exit(1) - - -def get_org_and_package_dirs(manifest: Manifest) -> List[str]: - org_name = manifest.namespace - package_name = manifest.package_name - org = snake_case(org_name if len(org_name) > 1 else "") - package = snake_case(package_name if len(package_name) > 1 else package_name) - return list(filter(None, [org, package])) - - -def get_hub_directory(manifest: Manifest, site_packages: str) -> str: - org_package = get_org_and_package_dirs(manifest) - return os.path.join(site_packages, "guardrails", "hub", *org_package) From f73adf73e57389b7306016861596a4a65b6d7437 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Wed, 23 Oct 2024 14:46:21 -0700 Subject: [PATCH 60/71] Removed writes to org namespaced init files during install, removed unused methods --- guardrails/hub/validator_package_service.py | 33 ------------- .../hub/test_validator_package_service.py | 47 ------------------- 2 files changed, 80 deletions(-) diff --git a/guardrails/hub/validator_package_service.py b/guardrails/hub/validator_package_service.py index ee2b87e42..f54ccdbc9 100644 --- a/guardrails/hub/validator_package_service.py +++ b/guardrails/hub/validator_package_service.py @@ -7,7 +7,6 @@ from typing import List, Literal, Optional from types import ModuleType -from pydash.strings import snake_case from packaging.utils import canonicalize_name # PEP 503 from guardrails.logger import logger as guardrails_logger @@ -104,20 +103,9 @@ def get_validator_from_manifest(manifest: Manifest) -> ModuleType: # Reload or import the module return ValidatorPackageService.reload_module(import_line) - @staticmethod - def get_org_and_package_dirs( - manifest: Manifest, - ) -> List[str]: - org_name = manifest.namespace - package_name = manifest.package_name - org = snake_case(org_name if len(org_name) > 1 else "") - package = snake_case(package_name if len(package_name) > 1 else package_name) - return list(filter(None, [org, package])) - @staticmethod def add_to_hub_inits(manifest: Manifest, site_packages: str): validator_id = manifest.id - org_package = ValidatorPackageService.get_org_and_package_dirs(manifest) exports: List[str] = manifest.exports or [] sorted_exports = sorted(exports, reverse=True) @@ -141,27 +129,6 @@ def add_to_hub_inits(manifest: Manifest, site_packages: str): hub_init.write(import_line) hub_init.close() - namespace = org_package[0] - namespace_init_location = os.path.join( - site_packages, "guardrails", "hub", namespace, "__init__.py" - ) - if os.path.isfile(namespace_init_location): - with open(namespace_init_location, "a+") as namespace_init: - namespace_init.seek(0, 0) - content = namespace_init.read() - if import_line in content: - namespace_init.close() - else: - namespace_init.seek(0, 2) - if len(content) > 0: - namespace_init.write("\n") - namespace_init.write(import_line) - namespace_init.close() - else: - with open(namespace_init_location, "w") as namespace_init: - namespace_init.write(import_line) - namespace_init.close() - @staticmethod def get_module_path(package_name): try: diff --git a/tests/unit_tests/hub/test_validator_package_service.py b/tests/unit_tests/hub/test_validator_package_service.py index 9e8b10cf3..12030ba34 100644 --- a/tests/unit_tests/hub/test_validator_package_service.py +++ b/tests/unit_tests/hub/test_validator_package_service.py @@ -487,53 +487,6 @@ def test_get_validator_from_manifest(self, mock_reload_module): mock_reload_module.assert_called_once_with("guardrails_grhub_id") - @pytest.mark.parametrize( - "manifest,expected", - [ - ( - Manifest.from_dict( - { - "id": "guardrails-ai/id", - "name": "name", - "author": {"name": "me", "email": "me@me.me"}, - "maintainers": [], - "repository": {"url": "some-repo"}, - "namespace": "guardrails-ai", - "packageName": "test-validator", - "moduleName": "test_validator", - "description": "description", - "exports": ["TestValidator"], - "tags": {}, - } - ), - ["guardrails_ai", "test_validator"], - ), - ( - Manifest.from_dict( - { - "id": "guardrails-ai/id", - "name": "name", - "author": {"name": "me", "email": "me@me.me"}, - "maintainers": [], - "repository": {"url": "some-repo"}, - "namespace": "", - "packageName": "test-validator", - "moduleName": "test_validator", - "description": "description", - "exports": ["TestValidator"], - "tags": {}, - } - ), - ["test_validator"], - ), - ], - ) - def test_get_org_and_package_dirs(self, manifest, expected): - from guardrails.hub.validator_package_service import ValidatorPackageService - - actual = ValidatorPackageService.get_org_and_package_dirs(manifest) - assert actual == expected - def test_get_module_name_valid(self): module_name, module_version = ValidatorPackageService.get_validator_id( "hub://test-module>=1.0.0" From c0dfcce6552eb511edf9cf5663b5c99479d48d6b Mon Sep 17 00:00:00 2001 From: Alejandro Date: Wed, 23 Oct 2024 17:36:21 -0700 Subject: [PATCH 61/71] fix tests associated with removal of namespace init file --- .../hub/test_validator_package_service.py | 86 ++----------------- 1 file changed, 6 insertions(+), 80 deletions(-) diff --git a/tests/unit_tests/hub/test_validator_package_service.py b/tests/unit_tests/hub/test_validator_package_service.py index 12030ba34..7fe7129a3 100644 --- a/tests/unit_tests/hub/test_validator_package_service.py +++ b/tests/unit_tests/hub/test_validator_package_service.py @@ -64,9 +64,8 @@ def test_closes_early_if_already_added(self, mocker): site_packages = "./site-packages" hub_init_file = MockFile() - ns_init_file = MockFile() mock_open = mocker.patch("guardrails.hub.validator_package_service.open") - mock_open.side_effect = [hub_init_file, ns_init_file] + mock_open.side_effect = [hub_init_file] mock_hub_read = mocker.patch.object(hub_init_file, "read") mock_hub_read.return_value = ( @@ -77,29 +76,14 @@ def test_closes_early_if_already_added(self, mocker): hub_write_spy = mocker.spy(hub_init_file, "write") hub_close_spy = mocker.spy(hub_init_file, "close") - mock_ns_read = mocker.patch.object(ns_init_file, "read") - mock_ns_read.return_value = ( - "from guardrails_ai_grhub_id import helper, TestValidator" # noqa - ) - - ns_seek_spy = mocker.spy(ns_init_file, "seek") - ns_write_spy = mocker.spy(ns_init_file, "write") - ns_close_spy = mocker.spy(ns_init_file, "close") - - mock_is_file = mocker.patch( - "guardrails.hub.validator_package_service.os.path.isfile" - ) - mock_is_file.return_value = True - from guardrails.hub.validator_package_service import ValidatorPackageService manifest = cast(Manifest, manifest) ValidatorPackageService.add_to_hub_inits(manifest, site_packages) - assert mock_open.call_count == 2 + assert mock_open.call_count == 1 open_calls = [ call("./site-packages/guardrails/hub/__init__.py", "a+"), - call("./site-packages/guardrails/hub/guardrails_ai/__init__.py", "a+"), ] mock_open.assert_has_calls(open_calls) @@ -108,14 +92,6 @@ def test_closes_early_if_already_added(self, mocker): assert hub_write_spy.call_count == 0 assert hub_close_spy.call_count == 1 - mock_is_file.assert_called_once_with( - "./site-packages/guardrails/hub/guardrails_ai/__init__.py" - ) - assert ns_seek_spy.call_count == 1 - assert mock_ns_read.call_count == 1 - assert ns_write_spy.call_count == 0 - assert ns_close_spy.call_count == 1 - def test_appends_import_line_if_not_present(self, mocker): manifest = Manifest.from_dict( { @@ -135,9 +111,8 @@ def test_appends_import_line_if_not_present(self, mocker): site_packages = "./site-packages" hub_init_file = MockFile() - ns_init_file = MockFile() mock_open = mocker.patch("guardrails.hub.validator_package_service.open") - mock_open.side_effect = [hub_init_file, ns_init_file] + mock_open.side_effect = [hub_init_file] mock_hub_read = mocker.patch.object(hub_init_file, "read") mock_hub_read.return_value = "from guardrails.hub.other_org.other_validator.validator import OtherValidator" # noqa @@ -146,27 +121,14 @@ def test_appends_import_line_if_not_present(self, mocker): hub_write_spy = mocker.spy(hub_init_file, "write") hub_close_spy = mocker.spy(hub_init_file, "close") - mock_ns_read = mocker.patch.object(ns_init_file, "read") - mock_ns_read.return_value = "" - - ns_seek_spy = mocker.spy(ns_init_file, "seek") - ns_write_spy = mocker.spy(ns_init_file, "write") - ns_close_spy = mocker.spy(ns_init_file, "close") - - mock_is_file = mocker.patch( - "guardrails.hub.validator_package_service.os.path.isfile" - ) - mock_is_file.return_value = True - from guardrails.hub.validator_package_service import ValidatorPackageService manifest = cast(Manifest, manifest) ValidatorPackageService.add_to_hub_inits(manifest, site_packages) - assert mock_open.call_count == 2 + assert mock_open.call_count == 1 open_calls = [ call("./site-packages/guardrails/hub/__init__.py", "a+"), - call("./site-packages/guardrails/hub/guardrails_ai/__init__.py", "a+"), ] mock_open.assert_has_calls(open_calls) @@ -187,21 +149,6 @@ def test_appends_import_line_if_not_present(self, mocker): assert hub_close_spy.call_count == 1 - mock_is_file.assert_called_once_with( - "./site-packages/guardrails/hub/guardrails_ai/__init__.py" - ) - - assert ns_seek_spy.call_count == 2 - ns_seek_calls = [call(0, 0), call(0, 2)] - ns_seek_spy.assert_has_calls(ns_seek_calls) - - assert mock_ns_read.call_count == 1 - assert ns_write_spy.call_count == 1 - ns_write_spy.assert_called_once_with( - "from guardrails_ai_grhub_id import TestValidator" # noqa - ) - assert ns_close_spy.call_count == 1 - def test_creates_namespace_init_if_not_exists(self, mocker): manifest = Manifest.from_dict( { @@ -221,20 +168,12 @@ def test_creates_namespace_init_if_not_exists(self, mocker): site_packages = "./site-packages" hub_init_file = MockFile() - ns_init_file = MockFile() mock_open = mocker.patch("guardrails.hub.validator_package_service.open") - mock_open.side_effect = [hub_init_file, ns_init_file] + mock_open.side_effect = [hub_init_file] mock_hub_read = mocker.patch.object(hub_init_file, "read") mock_hub_read.return_value = "from guardrails_ai_grhub_id import TestValidator" # noqa - mock_ns_read = mocker.patch.object(ns_init_file, "read") - mock_ns_read.return_value = "" - - ns_seek_spy = mocker.spy(ns_init_file, "seek") - ns_write_spy = mocker.spy(ns_init_file, "write") - ns_close_spy = mocker.spy(ns_init_file, "close") - mock_is_file = mocker.patch( "guardrails.hub.validator_package_service.os.path.isfile" ) @@ -245,25 +184,12 @@ def test_creates_namespace_init_if_not_exists(self, mocker): manifest = cast(Manifest, manifest) ValidatorPackageService.add_to_hub_inits(manifest, site_packages) - assert mock_open.call_count == 2 + assert mock_open.call_count == 1 open_calls = [ call("./site-packages/guardrails/hub/__init__.py", "a+"), - call("./site-packages/guardrails/hub/guardrails_ai/__init__.py", "w"), ] mock_open.assert_has_calls(open_calls) - mock_is_file.assert_called_once_with( - "./site-packages/guardrails/hub/guardrails_ai/__init__.py" - ) - - assert ns_seek_spy.call_count == 0 - assert mock_ns_read.call_count == 0 - assert ns_write_spy.call_count == 1 - ns_write_spy.assert_called_once_with( - "from guardrails_ai_grhub_id import TestValidator" # noqa - ) - assert ns_close_spy.call_count == 1 - class TestReloadModule: @patch("guardrails.hub.validator_package_service.importlib") From 76f6acbc03521056b627c6a5e88b9ca85555e639 Mon Sep 17 00:00:00 2001 From: David Tam Date: Fri, 25 Oct 2024 16:18:20 -0700 Subject: [PATCH 62/71] update for litellm dont pass reask messages to llms --- guardrails/llm_providers.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/guardrails/llm_providers.py b/guardrails/llm_providers.py index fda296d03..1c826191c 100644 --- a/guardrails/llm_providers.py +++ b/guardrails/llm_providers.py @@ -204,8 +204,7 @@ def _invoke_llm( ) # these are gr only and should not be getting passed to llms - kwargs.pop("reask_prompt", None) - kwargs.pop("reask_instructions", None) + kwargs.pop("reask_messages", None) response = completion( model=model, @@ -663,8 +662,7 @@ async def invoke_llm( ) # these are gr only and should not be getting passed to llms - kwargs.pop("reask_prompt", None) - kwargs.pop("reask_instructions", None) + kwargs.pop("reask_messages", None) response = await acompletion( *args, From f2a71381f40f9971a44787bbd1ec705b164a6b03 Mon Sep 17 00:00:00 2001 From: zsimjee Date: Fri, 25 Oct 2024 16:30:30 -0700 Subject: [PATCH 63/71] Update pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c067c68c6..5ef333292 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "guardrails-ai" -version = "0.6.0-alpha1" +version = "0.6.0-alpha2" description = "Adding guardrails to large language models." authors = ["Guardrails AI "] license = "Apache License 2.0" From a82a412d37d0f242781c14f4d6f9abd8116ff30b Mon Sep 17 00:00:00 2001 From: Alejandro Esquivel Date: Mon, 28 Oct 2024 15:33:43 -0700 Subject: [PATCH 64/71] Update guardrails/cli/hub/uninstall.py --- guardrails/cli/hub/uninstall.py | 1 - 1 file changed, 1 deletion(-) diff --git a/guardrails/cli/hub/uninstall.py b/guardrails/cli/hub/uninstall.py index 8d298b885..5fdcd5755 100644 --- a/guardrails/cli/hub/uninstall.py +++ b/guardrails/cli/hub/uninstall.py @@ -63,7 +63,6 @@ def uninstall( """Uninstall a validator from the Hub.""" from guardrails.hub.validator_package_service import ValidatorPackageService - print(f"ValidatorPackageService: {ValidatorPackageService}") if not package_uri.startswith("hub://"): logger.error("Invalid URI!") sys.exit(1) From 586cf805f024423a74dea956e8115cf117d405d0 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Mon, 28 Oct 2024 22:07:51 -0700 Subject: [PATCH 65/71] remove regex pypi package dependency --- poetry.lock | 194 +++++++++++++++++++++++++------------------------ pyproject.toml | 1 - 2 files changed, 98 insertions(+), 97 deletions(-) diff --git a/poetry.lock b/poetry.lock index fc01a2bfd..d22b349ac 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4689,6 +4689,7 @@ description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, ] @@ -6410,104 +6411,105 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2023.12.25" +version = "2024.9.11" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, - {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, - {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, - {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, - {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, - {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, - {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, - {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, - {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, - {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, - {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, - {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, - {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, - {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, - {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, + {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, + {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, + {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, + {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, + {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, + {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, + {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, + {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, + {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, + {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, + {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, + {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, + {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, ] [[package]] @@ -8673,4 +8675,4 @@ vectordb = ["faiss-cpu", "numpy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "56b550e0c08b8861e2cdd761116d3ec955c9e725bcbfe45881667f73d6cdc49e" +content-hash = "1c8cc76a34f8a9108ec28cc17f6b709afc20be43e7400eebbb69f37fa38efc89" diff --git a/pyproject.toml b/pyproject.toml index 5ef333292..7daff31e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,6 @@ pydantic = ">=2.0.0, <3.0" typer = {extras = ["all"], version = ">=0.9.0, <0.13"} griffe = "^0.36.9" tenacity = ">=8.1.0" -regex = "^2023.10.3" rstr = "^3.2.2" typing-extensions = "^4.8.0" python-dateutil = "^2.8.2" From cd371598793ee2a1925c40e69895d9c483d4a623 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Mon, 28 Oct 2024 22:42:15 -0700 Subject: [PATCH 66/71] bumped version to 0.6.0-alpha3 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7daff31e7..57406bbd4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "guardrails-ai" -version = "0.6.0-alpha2" +version = "0.6.0-alpha3" description = "Adding guardrails to large language models." authors = ["Guardrails AI "] license = "Apache License 2.0" From d8fd51aa42374c50f718cd8328af7abd34521e73 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 29 Oct 2024 13:36:21 -0700 Subject: [PATCH 67/71] bump version to 0.6.0-alpha4 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 57406bbd4..38b441c10 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "guardrails-ai" -version = "0.6.0-alpha3" +version = "0.6.0-alpha4" description = "Adding guardrails to large language models." authors = ["Guardrails AI "] license = "Apache License 2.0" From 91077a948b42cbc001af7f0524019373c7a77fb6 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Mon, 4 Nov 2024 16:31:44 -0800 Subject: [PATCH 68/71] temp workaround to raise errors on on pip processes --- guardrails/cli/hub/utils.py | 81 +++++++++++++++++++++ guardrails/hub/validator_package_service.py | 44 +++++++++-- 2 files changed, 118 insertions(+), 7 deletions(-) diff --git a/guardrails/cli/hub/utils.py b/guardrails/cli/hub/utils.py index c3f1b924a..84c085c1e 100644 --- a/guardrails/cli/hub/utils.py +++ b/guardrails/cli/hub/utils.py @@ -20,6 +20,87 @@ string_format = "string" +class PipProcessError(Exception): + action: str + package: str + stderr: str = "" + stdout: str = "" + returncode: int = 1 + + def __init__( + self, + action: str, + package: str, + stderr: str = "", + stdout: str = "", + returncode: int = 1, + ): + self.action = action + self.package = package + self.stderr = stderr + self.stdout = stdout + self.returncode = returncode + message = ( + f"PipProcessError: {action} on '{package}' failed with" + "return code {returncode}.\n" + f"Stdout:\n{stdout}\n" + f"Stderr:\n{stderr}" + ) + super().__init__(message) + + +def pip_process_with_custom_exception( + action: str, + package: str = "", + flags: List[str] = [], + format: Union[Literal["string"], Literal["json"]] = string_format, + quiet: bool = False, + no_color: bool = False, +) -> Union[str, dict]: + try: + if not quiet: + logger.debug(f"running pip {action} {' '.join(flags)} {package}") + command = [sys.executable, "-m", "pip", action] + command.extend(flags) + if package: + command.append(package) + + env = dict(os.environ) + if no_color: + env["NO_COLOR"] = "true" + + result = subprocess.run( + command, + env=env, + capture_output=True, # Capture both stdout and stderr + text=True, # Automatically decode to strings + check=True, # Automatically raise error on non-zero exit code + ) + + if format == json_format: + try: + remove_color_codes = re.compile(r"\x1b\[[0-9;]*m") + parsed_as_string = re.sub(remove_color_codes, "", result.stdout.strip()) + return json.loads(parsed_as_string) + except Exception: + logger.debug( + f"JSON parse exception in decoding output from pip {action}" + f" {package}. Falling back to accumulating the byte stream", + ) + accumulator = {} + parsed = BytesHeaderParser().parsebytes(result.stdout.encode()) + for key, value in parsed.items(): + accumulator[key] = value + return accumulator + + return result.stdout + + except subprocess.CalledProcessError as exc: + raise PipProcessError(action, package, exc.stderr, exc.stdout, exc.returncode) + except Exception as e: + raise PipProcessError(action, package, stderr=str(e), stdout="", returncode=1) + + def pip_process( action: str, package: str = "", diff --git a/guardrails/hub/validator_package_service.py b/guardrails/hub/validator_package_service.py index f54ccdbc9..ecbdb3b40 100644 --- a/guardrails/hub/validator_package_service.py +++ b/guardrails/hub/validator_package_service.py @@ -12,7 +12,7 @@ from guardrails.logger import logger as guardrails_logger -from guardrails.cli.hub.utils import pip_process +from guardrails.cli.hub.utils import PipProcessError, pip_process_with_custom_exception from guardrails_hub_types import Manifest from guardrails.cli.server.hub_client import get_validator_manifest from guardrails.settings import settings @@ -251,7 +251,6 @@ def install_hub_module( validator_id ) validator_version = validator_version if validator_version else "" - full_package_name = f"{pep_503_package_name}{validator_version}" guardrails_token = settings.rc.token @@ -267,8 +266,39 @@ def install_hub_module( pip_flags.append("-q") # Install from guardrails hub pypi server with public pypi index as fallback - download_output = pip_process( - "install", full_package_name, pip_flags, quiet=quiet - ) - if not quiet: - logger.info(download_output) + + try: + full_package_name = f"{pep_503_package_name}[validators]{validator_version}" + download_output = pip_process_with_custom_exception( + "install", full_package_name, pip_flags, quiet=quiet + ) + if not quiet: + logger.info(download_output) + except PipProcessError: + try: + full_package_name = f"{pep_503_package_name}{validator_version}" + download_output = pip_process_with_custom_exception( + "install", full_package_name, pip_flags, quiet=quiet + ) + if not quiet: + logger.info(download_output) + except PipProcessError as e: + action = e.action + package = e.package + stderr = e.stderr + stdout = e.stdout + returncode = e.returncode + logger.error( + ( + f"Failed to {action} {package}\n" + f"Exit code: {returncode}\n" + f"stderr: {(stderr or '').strip()}\n" + f"stdout: {(stdout or '').strip()}" + ) + ) + except Exception as e: + logger.error( + "An unexpected exception occurred while " + f"installing {validator_id}: ", + e, + ) From 943d0c7417368dedd832ed993874c17a8d3aa587 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 5 Nov 2024 15:42:13 -0800 Subject: [PATCH 69/71] raise errors on install failures to avoid placing import statement --- guardrails/hub/validator_package_service.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/guardrails/hub/validator_package_service.py b/guardrails/hub/validator_package_service.py index ecbdb3b40..c3478b3a3 100644 --- a/guardrails/hub/validator_package_service.py +++ b/guardrails/hub/validator_package_service.py @@ -296,9 +296,11 @@ def install_hub_module( f"stdout: {(stdout or '').strip()}" ) ) + raise except Exception as e: logger.error( "An unexpected exception occurred while " f"installing {validator_id}: ", e, ) + raise From 1d9f7dd3fd5597b2209183cf396482c4d034e02e Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 5 Nov 2024 18:20:01 -0800 Subject: [PATCH 70/71] update version to 0.6.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 38b441c10..6e9d5a8f3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "guardrails-ai" -version = "0.6.0-alpha4" +version = "0.6.0" description = "Adding guardrails to large language models." authors = ["Guardrails AI "] license = "Apache License 2.0" From 02f5c21ec7e881be98551311f8c412b96a40965a Mon Sep 17 00:00:00 2001 From: Alejandro Date: Wed, 6 Nov 2024 14:00:57 -0800 Subject: [PATCH 71/71] updated installation tests to reflect change of behavior during exceptions in pip install subprocess --- .../hub/test_validator_package_service.py | 93 ++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/tests/unit_tests/hub/test_validator_package_service.py b/tests/unit_tests/hub/test_validator_package_service.py index 7fe7129a3..93bfacf34 100644 --- a/tests/unit_tests/hub/test_validator_package_service.py +++ b/tests/unit_tests/hub/test_validator_package_service.py @@ -5,6 +5,7 @@ from unittest.mock import call, patch, MagicMock from guardrails_hub_types import Manifest +from guardrails.cli.hub.utils import PipProcessError from guardrails.hub.validator_package_service import ( FailedToLocateModule, ValidatorPackageService, @@ -424,9 +425,97 @@ def test_get_module_name_invalid(self): with pytest.raises(InvalidHubInstallURL): ValidatorPackageService.get_validator_id("invalid-uri") + def test_install_hub_module_when_exception(self, mocker): + mock_pip_process = mocker.patch( + "guardrails.hub.validator_package_service.pip_process_with_custom_exception" + ) + mock_settings = mocker.patch( + "guardrails.hub.validator_package_service.settings" + ) + mock_settings.rc.token = "mock-token" + + mock_pip_process.side_effect = [Exception()] + + manifest = Manifest.from_dict( + { + "id": "guardrails-ai/id", + "name": "name", + "author": {"name": "me", "email": "me@me.me"}, + "maintainers": [], + "repository": {"url": "some-repo"}, + "namespace": "guardrails-ai", + "packageName": "test-validator", + "moduleName": "validator", + "description": "description", + "exports": ["TestValidator"], + "tags": {}, + } + ) + manifest = cast(Manifest, manifest) + + with pytest.raises(Exception): + ValidatorPackageService.install_hub_module(manifest.id) + + assert mock_pip_process.call_count == 1 + + def test_install_hub_module_when_no_validators_extras(self, mocker): + mock_pip_process = mocker.patch( + "guardrails.hub.validator_package_service.pip_process_with_custom_exception" + ) + mock_settings = mocker.patch( + "guardrails.hub.validator_package_service.settings" + ) + mock_settings.rc.token = "mock-token" + + mock_pip_process.side_effect = [ + PipProcessError("install", "guardrails-ai-grhub-id"), + "Sucessfully installed guardrails-ai-grhub-id", + ] + + manifest = Manifest.from_dict( + { + "id": "guardrails-ai/id", + "name": "name", + "author": {"name": "me", "email": "me@me.me"}, + "maintainers": [], + "repository": {"url": "some-repo"}, + "namespace": "guardrails-ai", + "packageName": "test-validator", + "moduleName": "validator", + "description": "description", + "exports": ["TestValidator"], + "tags": {}, + } + ) + manifest = cast(Manifest, manifest) + ValidatorPackageService.install_hub_module(manifest.id) + + assert mock_pip_process.call_count == 2 + pip_calls = [ + call( + "install", + "guardrails-ai-grhub-id[validators]", + [ + "--index-url=https://__token__:mock-token@pypi.guardrailsai.com/simple", + "--extra-index-url=https://pypi.org/simple", + ], + quiet=False, + ), + call( + "install", + "guardrails-ai-grhub-id", + [ + "--index-url=https://__token__:mock-token@pypi.guardrailsai.com/simple", + "--extra-index-url=https://pypi.org/simple", + ], + quiet=False, + ), + ] + mock_pip_process.assert_has_calls(pip_calls) + def test_install_hub_module(self, mocker): mock_pip_process = mocker.patch( - "guardrails.hub.validator_package_service.pip_process" + "guardrails.hub.validator_package_service.pip_process_with_custom_exception" ) mock_settings = mocker.patch( "guardrails.hub.validator_package_service.settings" @@ -477,7 +566,7 @@ def test_install_hub_module(self, mocker): pip_calls = [ call( "install", - "guardrails-ai-grhub-id", + "guardrails-ai-grhub-id[validators]", [ "--index-url=https://__token__:mock-token@pypi.guardrailsai.com/simple", "--extra-index-url=https://pypi.org/simple",