from langchain_core.messages import ToolMessage from langchain_core.runnables import RunnableLambda from langgraph.prebuilt import ToolNode def handle_tool_error(state) -> dict: error = state.get("error") tool_calls = state["messages"][-1].tool_calls return { "messages": [ ToolMessage( content=f"Error: {repr(error)}\n please fix your mistakes.", tool_call_id=tc["id"], ) for tc in tool_calls ] } def create_tool_node_with_fallback(tools: list) -> dict: return ToolNode(tools).with_fallbacks( [RunnableLambda(handle_tool_error)], exception_key="error" ) def _print_event(event: dict, _printed: set, max_length=1500): current_state = event.get("dialog_state") if current_state: print("Currently in: ", current_state) message = event.get("messages") if message: if isinstance(message, list): message = message[-1] if message.id not in _printed: msg_repr = message.pretty_repr(html=True) if len(msg_repr) > max_length: msg_repr = msg_repr[:max_length] + " ... (truncated)" print(msg_repr) _printed.add(message.id) return current_state, message