1414
1515@reward_function
1616def reasoning_steps_reward (
17- messages : List [Message ],
17+ messages : Union [ List [Message ], List [ Dict [ str , Any ]] ],
1818 pattern : Optional [str ] = None ,
1919 min_steps : int = 3 ,
2020 max_steps : Optional [int ] = None ,
@@ -48,7 +48,33 @@ def reasoning_steps_reward(
4848
4949 response = messages [- 1 ]
5050
51- if response .role != "assistant" or not response .content :
51+ def _to_text (content : Any ) -> str :
52+ if content is None :
53+ return ""
54+ if isinstance (content , list ):
55+ parts = []
56+ for part in content :
57+ if isinstance (part , dict ):
58+ val = part .get ("text" )
59+ if isinstance (val , str ):
60+ parts .append (val )
61+ else :
62+ val = getattr (part , "text" , None )
63+ if isinstance (val , str ):
64+ parts .append (val )
65+ return "" .join (parts )
66+ if isinstance (content , str ):
67+ return content
68+ return str (content )
69+
70+ if isinstance (response , Message ):
71+ role_ok = response .role == "assistant"
72+ text : str = _to_text (response .content )
73+ else :
74+ role_ok = response .get ("role" ) == "assistant"
75+ text = str (response .get ("content" ) or "" )
76+
77+ if not role_ok or not text :
5278 return EvaluateResult (
5379 score = 0.0 ,
5480 reason = "No assistant response found or response has no content" ,
@@ -60,7 +86,7 @@ def reasoning_steps_reward(
6086 )
6187 },
6288 )
63- text : str = response . content
89+ # text already set
6490
6591 # Default patterns for detecting reasoning steps
6692 default_patterns = [
@@ -154,7 +180,7 @@ def reasoning_steps_reward(
154180
155181@reward_function
156182def sequence_reward (
157- messages : List [Message ],
183+ messages : Union [ List [Message ], List [ Dict [ str , Any ]] ],
158184 sequence_terms : Optional [List [str ]] = None ,
159185 min_matches : int = 3 ,
160186 case_sensitive : bool = False ,
@@ -187,7 +213,33 @@ def sequence_reward(
187213
188214 response = messages [- 1 ]
189215
190- if response .role != "assistant" or not response .content :
216+ def _to_text (content : Any ) -> str :
217+ if content is None :
218+ return ""
219+ if isinstance (content , list ):
220+ parts = []
221+ for part in content :
222+ if isinstance (part , dict ):
223+ val = part .get ("text" )
224+ if isinstance (val , str ):
225+ parts .append (val )
226+ else :
227+ val = getattr (part , "text" , None )
228+ if isinstance (val , str ):
229+ parts .append (val )
230+ return "" .join (parts )
231+ if isinstance (content , str ):
232+ return content
233+ return str (content )
234+
235+ if isinstance (response , Message ):
236+ role_ok = response .role == "assistant"
237+ text : str = _to_text (response .content )
238+ else :
239+ role_ok = response .get ("role" ) == "assistant"
240+ text = str (response .get ("content" ) or "" )
241+
242+ if not role_ok or not text :
191243 return EvaluateResult (
192244 score = 0.0 ,
193245 reason = "No assistant response found or response has no content" ,
@@ -199,7 +251,7 @@ def sequence_reward(
199251 )
200252 },
201253 )
202- text : str = response . content
254+ # text already set
203255
204256 if not sequence_terms :
205257 sequence_terms = [
0 commit comments