AsyncFinalIteratorCallbackHandler Class — langchain Architecture
Architecture documentation for the AsyncFinalIteratorCallbackHandler class in streaming_aiter_final_only.py from the langchain codebase.
Entity Profile
Dependency Diagram
graph TD 8ff14092_eef3_abb2_55fb_ca2a28f79a83["AsyncFinalIteratorCallbackHandler"] 026a405e_b843_1fc9_0384_15895a6c1500["AsyncIteratorCallbackHandler"] 8ff14092_eef3_abb2_55fb_ca2a28f79a83 -->|extends| 026a405e_b843_1fc9_0384_15895a6c1500 a5107eea_641d_caa9_15df_650fcd7923f9["streaming_aiter_final_only.py"] 8ff14092_eef3_abb2_55fb_ca2a28f79a83 -->|defined in| a5107eea_641d_caa9_15df_650fcd7923f9 4dc80c25_f757_8f83_8d42_294e5414f053["append_to_last_tokens()"] 8ff14092_eef3_abb2_55fb_ca2a28f79a83 -->|method| 4dc80c25_f757_8f83_8d42_294e5414f053 09df20ea_dd04_8695_659f_acc907a196be["check_if_answer_reached()"] 8ff14092_eef3_abb2_55fb_ca2a28f79a83 -->|method| 09df20ea_dd04_8695_659f_acc907a196be 4fbcb1c2_72be_1d3f_eacb_3e3407d2d46b["__init__()"] 8ff14092_eef3_abb2_55fb_ca2a28f79a83 -->|method| 4fbcb1c2_72be_1d3f_eacb_3e3407d2d46b 1cfad502_36e6_46e8_0855_fee8edf85427["on_llm_start()"] 8ff14092_eef3_abb2_55fb_ca2a28f79a83 -->|method| 1cfad502_36e6_46e8_0855_fee8edf85427 e099a194_452a_0750_eefe_c5d6cd5d4863["on_llm_end()"] 8ff14092_eef3_abb2_55fb_ca2a28f79a83 -->|method| e099a194_452a_0750_eefe_c5d6cd5d4863 fe1df244_d50d_c13f_7d61_a1e52666ad43["on_llm_new_token()"] 8ff14092_eef3_abb2_55fb_ca2a28f79a83 -->|method| fe1df244_d50d_c13f_7d61_a1e52666ad43
Relationship Graph
Source Code
libs/langchain/langchain_classic/callbacks/streaming_aiter_final_only.py lines 13–98
class AsyncFinalIteratorCallbackHandler(AsyncIteratorCallbackHandler):
"""Callback handler that returns an async iterator.
Only the final output of the agent will be iterated.
"""
def append_to_last_tokens(self, token: str) -> None:
"""Append token to the last tokens."""
self.last_tokens.append(token)
self.last_tokens_stripped.append(token.strip())
if len(self.last_tokens) > len(self.answer_prefix_tokens):
self.last_tokens.pop(0)
self.last_tokens_stripped.pop(0)
def check_if_answer_reached(self) -> bool:
"""Check if the answer has been reached."""
if self.strip_tokens:
return self.last_tokens_stripped == self.answer_prefix_tokens_stripped
return self.last_tokens == self.answer_prefix_tokens
def __init__(
self,
*,
answer_prefix_tokens: list[str] | None = 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__()
if answer_prefix_tokens is None:
self.answer_prefix_tokens = DEFAULT_ANSWER_PREFIX_TOKENS
else:
self.answer_prefix_tokens = answer_prefix_tokens
if strip_tokens:
self.answer_prefix_tokens_stripped = [
token.strip() for token in self.answer_prefix_tokens
]
else:
self.answer_prefix_tokens_stripped = self.answer_prefix_tokens
self.last_tokens = [""] * len(self.answer_prefix_tokens)
self.last_tokens_stripped = [""] * len(self.answer_prefix_tokens)
self.strip_tokens = strip_tokens
self.stream_prefix = stream_prefix
self.answer_reached = False
@override
async def on_llm_start(
self,
serialized: dict[str, Any],
prompts: list[str],
**kwargs: Any,
) -> None:
# If two calls are made in a row, this resets the state
self.done.clear()
self.answer_reached = False
@override
async def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None:
if self.answer_reached:
self.done.set()
@override
async def on_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 ...
if self.check_if_answer_reached():
self.answer_reached = True
if self.stream_prefix:
for t in self.last_tokens:
self.queue.put_nowait(t)
Extends
Source
Frequently Asked Questions
What is the AsyncFinalIteratorCallbackHandler class?
AsyncFinalIteratorCallbackHandler is a class in the langchain codebase, defined in libs/langchain/langchain_classic/callbacks/streaming_aiter_final_only.py.
Where is AsyncFinalIteratorCallbackHandler defined?
AsyncFinalIteratorCallbackHandler is defined in libs/langchain/langchain_classic/callbacks/streaming_aiter_final_only.py at line 13.
What does AsyncFinalIteratorCallbackHandler extend?
AsyncFinalIteratorCallbackHandler extends AsyncIteratorCallbackHandler.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free