backend/langchainadapters.py (60 lines of code) (raw):

from typing import Any, Dict, List, Optional from langchain.callbacks.base import BaseCallbackHandler from langchain.schema import AgentAction, AgentFinish, LLMResult def ch(text: str) -> str: s = text if isinstance(text, str) else str(text) return s.replace("<", "&lt;").replace(">", "&gt;").replace("\r", "").replace("\n", "<br>") class HtmlCallbackHandler (BaseCallbackHandler): html: str = "" def get_and_reset_log(self) -> str: result = self.html self.html = "" return result def on_llm_start( self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any ) -> None: """Print out the prompts.""" self.html += f"LLM prompts:<br>" + "<br>".join(ch(prompts)) + "<br>"; def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None: """Do nothing.""" pass def on_llm_error(self, error: Exception, **kwargs: Any) -> None: self.html += f"<span style='color:red'>LLM error: {ch(error)}</span><br>" def on_chain_start( self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any ) -> None: """Print out that we are entering a chain.""" class_name = serialized["name"] self.html += f"Entering chain: {ch(class_name)}<br>" def on_chain_end(self, outputs: Dict[str, Any], **kwargs: Any) -> None: """Print out that we finished a chain.""" self.html += f"Finished chain<br>" def on_chain_error(self, error: Exception, **kwargs: Any) -> None: self.html += f"<span style='color:red'>Chain error: {ch(error)}</span><br>" def on_tool_start( self, serialized: Dict[str, Any], action: AgentAction, color: Optional[str] = None, **kwargs: Any, ) -> None: """Print out the log in specified color.""" self.html += f"<span style='color:{color}'>{ch(action.log)}</span><br>" def on_tool_end( self, output: str, color: Optional[str] = None, observation_prefix: Optional[str] = None, llm_prefix: Optional[str] = None, **kwargs: Any, ) -> None: """If not the final action, print out observation.""" self.html += f"{ch(observation_prefix)}<br><span style='color:{color}'>{ch(output)}</span><br>{ch(llm_prefix)}<br>" def on_tool_error(self, error: Exception, **kwargs: Any) -> None: self.html += f"<span style='color:red'>Tool error: {ch(error)}</span><br>" def on_text( self, text: str, color: Optional[str] = None, end: str = "", **kwargs: Optional[str], ) -> None: """Run when agent ends.""" self.html += f"<span style='color:{color}'>{ch(text)}</span><br>" def on_agent_finish( self, finish: AgentFinish, color: Optional[str] = None, **kwargs: Any ) -> None: """Run on agent end.""" self.html += f"<span style='color:{color}'>{ch(finish.log)}</span><br>"