1313import  json 
1414import  logging 
1515import  time 
16- from  typing  import  Union , Callable 
16+ from  typing  import  Union , Callable ,  Optional ,  Dict 
1717
1818from  typing_extensions  import  deprecated 
1919
@@ -43,6 +43,9 @@ def get_sequence_details(request_output: RequestOutput,
4343    if  parameters .get ("decoder_input_details" ):
4444        sequence_details ["prefill" ] =  request_output .get_prompt_tokens_as_dict (
4545        )
46+     if  parameters .get ("top_n_tokens" , 0 ) >  0 :
47+         sequence_details ["top_tokens" ] =  request_output .get_top_tokens_as_dict (
48+             sequence_index )
4649    return  sequence_details 
4750
4851
@@ -106,31 +109,45 @@ def _json_output_formatter(request_output: RequestOutput):
106109        json_encoded_str  =  f"[{ json_encoded_str }  
107110    json_encoded_str  =  f"{ json_encoded_str } { json .dumps (next_token .text , ensure_ascii = False )[1 :- 1 ]}  
108111    if  last_token :
109-         if  parameters .get ("details" , tgi_compat ):
110-             final_dict  =  {
111-                 "finish_reason" : best_sequence .finish_reason ,
112-                 "generated_tokens" : len (best_sequence .tokens ),
113-                 "inputs" : request_output .input .input_text ,
114-                 "tokens" : request_output .get_tokens_as_dict (),
115-             }
116- 
117-             if  parameters .get ("decoder_input_details" ):
118-                 final_dict [
119-                     "prefill" ] =  request_output .get_prompt_tokens_as_dict ()
120-             details_str  =  f"\" details\" : { json .dumps (final_dict , ensure_ascii = False )}  
121-             json_encoded_str  =  f"{ json_encoded_str } \" , { details_str }  
122-         elif  best_sequence .finish_reason  ==  "error" :
123-             final_dict  =  {"finish_reason" : best_sequence .finish_reason }
124-             details_str  =  f"\" details\" : { json .dumps (final_dict , ensure_ascii = False )}  
112+         details_dict  =  get_details_dict (request_output , include_tokens = True )
113+         if  details_dict :
114+             details_str  =  f"\" details\" : { json .dumps (details_dict , ensure_ascii = False )}  
125115            json_encoded_str  =  f"{ json_encoded_str } \" , { details_str }  
126116        else :
127117            json_encoded_str  =  f"{ json_encoded_str } \" }}" 
128118        if  tgi_compat :
129119            json_encoded_str  =  f"{ json_encoded_str }  
130- 
131120    return  json_encoded_str 
132121
133122
123+ def  get_details_dict (request_output : RequestOutput ,
124+                      include_tokens : bool  =  True ) ->  Optional [Dict ]:
125+     parameters  =  request_output .input .parameters 
126+     best_sequence  =  request_output .sequences [
127+         request_output .best_sequence_index ]
128+     if  parameters .get ("details" , request_output .input .tgi_compat ):
129+         final_dict  =  {
130+             "finish_reason" : best_sequence .finish_reason ,
131+             "generated_tokens" : len (best_sequence .tokens ),
132+             "inputs" : request_output .input .input_text ,
133+         }
134+ 
135+         if  include_tokens :
136+             final_dict ["tokens" ] =  request_output .get_tokens_as_dict ()
137+ 
138+         if  parameters .get ("decoder_input_details" ):
139+             final_dict ["prefill" ] =  request_output .get_prompt_tokens_as_dict ()
140+         if  parameters .get ("top_n_tokens" , 0 ) >  0 :
141+             final_dict ["top_tokens" ] =  request_output .get_top_tokens_as_dict (
142+                 request_output .best_sequence_index )
143+ 
144+         return  final_dict 
145+     elif  best_sequence .finish_reason  ==  "error" :
146+         return  {"finish_reason" : best_sequence .finish_reason }
147+     else :
148+         return  None 
149+ 
150+ 
134151def  _jsonlines_output_formatter (request_output : RequestOutput ):
135152    """ 
136153    jsonlines output formatter 
@@ -148,19 +165,9 @@ def _jsonlines_output_formatter(request_output: RequestOutput):
148165    if  last_token :
149166        generated_text  =  get_generated_text (best_sequence , request_output )
150167        final_dict ["generated_text" ] =  generated_text 
151-         if  parameters .get ("details" , tgi_compat ):
152-             final_dict ["details" ] =  {
153-                 "finish_reason" : best_sequence .finish_reason ,
154-                 "generated_tokens" : len (best_sequence .tokens ),
155-                 "inputs" : request_output .input .input_text ,
156-             }
157-             if  parameters .get ("decoder_input_details" ):
158-                 final_dict ["details" ][
159-                     "prefill" ] =  request_output .get_prompt_tokens_as_dict ()
160-         elif  best_sequence .finish_reason  ==  "error" :
161-             final_dict ["details" ] =  {
162-                 "finish_reason" : best_sequence .finish_reason 
163-             }
168+         details_dict  =  get_details_dict (request_output , include_tokens = False )
169+         if  details_dict :
170+             final_dict ["details" ] =  details_dict 
164171    json_encoded_str  =  json .dumps (final_dict , ensure_ascii = False ) +  "\n " 
165172    return  json_encoded_str 
166173
0 commit comments