[docs]classAsyncFinalIteratorCallbackHandler(AsyncIteratorCallbackHandler):"""Callback handler that returns an async iterator. Only the final output of the agent will be iterated. """
[docs]def__init__(self,*,answer_prefix_tokens:Optional[List[str]]=None,strip_tokens:bool=True,stream_prefix:bool=False,)->None:"""Instantiate AsyncFinalIteratorCallbackHandler. Args: answer_prefix_tokens: Token sequence that prefixes the answer. Default is ["Final", "Answer", ":"] strip_tokens: Ignore white spaces and new lines when comparing answer_prefix_tokens to last tokens? (to determine if answer has been reached) stream_prefix: Should answer prefix itself also be streamed? """super().__init__()ifanswer_prefix_tokensisNone:self.answer_prefix_tokens=DEFAULT_ANSWER_PREFIX_TOKENSelse:self.answer_prefix_tokens=answer_prefix_tokensifstrip_tokens:self.answer_prefix_tokens_stripped=[token.strip()fortokeninself.answer_prefix_tokens]else:self.answer_prefix_tokens_stripped=self.answer_prefix_tokensself.last_tokens=[""]*len(self.answer_prefix_tokens)self.last_tokens_stripped=[""]*len(self.answer_prefix_tokens)self.strip_tokens=strip_tokensself.stream_prefix=stream_prefixself.answer_reached=False
[docs]asyncdefon_llm_start(self,serialized:Dict[str,Any],prompts:List[str],**kwargs:Any)->None:# If two calls are made in a row, this resets the stateself.done.clear()self.answer_reached=False
[docs]asyncdefon_llm_new_token(self,token:str,**kwargs:Any)->None:# Remember the last n tokens, where n = len(answer_prefix_tokens)self.append_to_last_tokens(token)# Check if the last n tokens match the answer_prefix_tokens list ...ifself.check_if_answer_reached():self.answer_reached=Trueifself.stream_prefix:fortinself.last_tokens:self.queue.put_nowait(t)return# If yes, then put tokens from now onifself.answer_reached:self.queue.put_nowait(token)