"""Dynamic output mapping based on state."""importloggingfromtypingimportAny,Selffromlanggraph.graphimportENDfrompydanticimportBaseModel,Field,model_validatorfromhaive.core.graph.branches.typesimportComparisonTypefromhaive.core.graph.common.field_utilsimportextract_fieldfromhaive.core.graph.common.referencesimportCallableReferencefromhaive.core.graph.common.typesimportStateLikelogger=logging.getLogger(__name__)
[docs]classDynamicMapping(BaseModel):"""Configuration for dynamic output mapping."""mappings:dict[str,dict[str,str]]=Field(default_factory=dict)function_ref:CallableReference|None=Nonekey:str|None=Nonevalue:Any|None=Nonecomparison:ComparisonType=ComparisonType.EQUALSdefault_node:str=ENDmodel_config={"arbitrary_types_allowed":True}
[docs]defget_mapping(self,state:StateLike)->tuple[str,dict[str,str]|None]:"""Determine which mapping to use based on state. Args: state: State object Returns: Tuple of (node_name, output_mapping) """next_node=self.default_nodeifself.function_ref:func=self.function_ref.resolve()iffunc:try:result=func(state)ifisinstance(result,str):next_node=resultexceptExceptionase:logger.exception(f"Error in dynamic mapping function: {e}")elifself.key:field_value=extract_field(state,self.key)iffield_valueisnotNone:comparison_result=Falseifself.comparison==ComparisonType.EQUALS:comparison_result=field_value==self.valueelifself.comparison==ComparisonType.NOT_EQUALS:comparison_result=field_value!=self.valueelifself.comparison==ComparisonType.GREATER_THAN:comparison_result=field_value>self.valueelifself.comparison==ComparisonType.LESS_THAN:comparison_result=field_value<self.valueelifself.comparison==ComparisonType.GREATER_EQUALS:comparison_result=field_value>=self.valueelifself.comparison==ComparisonType.LESS_EQUALS:comparison_result=field_value<=self.valueifcomparison_result:if"high_score_route"inself.mappings:next_node="high_score_route"else:non_default_routes=[kforkinself.mappingsifk!=self.default_node]ifnon_default_routes:next_node=non_default_routes[0]mapping=self.mappings.get(next_node)return(next_node,mapping)