1717 DataBlock ,
1818 EmptyBlock ,
1919 ErrorBlock ,
20+ ExpressionType ,
2021 FunctionBlock ,
2122 GetBlock ,
2223 GraniteioModelBlock ,
2829 LastOfBlock ,
2930 LitellmModelBlock ,
3031 LitellmParameters ,
32+ LocalizedExpression ,
3133 MatchBlock ,
3234 MessageBlock ,
3335 ObjectBlock ,
@@ -110,27 +112,26 @@ def block_to_dict( # noqa: C901
110112 match block :
111113 case LitellmModelBlock ():
112114 d ["platform" ] = str (block .platform )
113- d ["model" ] = block .model
114- if block .input is not None :
115- d ["input" ] = block_to_dict (block .input , json_compatible )
115+ d ["model" ] = expr_to_dict (block .model , json_compatible )
116+ d ["input" ] = block_to_dict (block .input , json_compatible )
116117 if block .parameters is not None :
117118 if isinstance (block .parameters , LitellmParameters ):
118119 d ["parameters" ] = block .parameters .model_dump (
119120 exclude_unset = True , exclude_defaults = True
120121 )
121122 else :
122- d ["parameters" ] = block .parameters
123+ d ["parameters" ] = expr_to_dict ( block .parameters , json_compatible )
123124 if block .modelResponse is not None :
124125 d ["modelResponse" ] = block .modelResponse
125126 case GraniteioModelBlock ():
126- d ["model" ] = block .model
127+ d ["model" ] = expr_to_dict ( block .model , json_compatible )
127128 d ["platform" ] = str (block .platform )
128- d ["backend" ] = block .backend
129- d [ "processor" ] = block .processor
130- if block . input is not None :
131- d ["input" ] = block_to_dict (block .input , json_compatible )
129+ d ["backend" ] = expr_to_dict ( block .backend , json_compatible )
130+ if block .processor is not None :
131+ d [ "processor" ] = expr_to_dict ( block . processor , json_compatible )
132+ d ["input" ] = block_to_dict (block .input , json_compatible )
132133 if block .parameters is not None :
133- d ["parameters" ] = block .parameters
134+ d ["parameters" ] = expr_to_dict ( block .parameters , json_compatible )
134135 if block .modelResponse is not None :
135136 d ["modelResponse" ] = block .modelResponse
136137 case CodeBlock ():
@@ -139,7 +140,7 @@ def block_to_dict( # noqa: C901
139140 case GetBlock ():
140141 d ["get" ] = block .get
141142 case DataBlock ():
142- d ["data" ] = data_to_dict (block .data , json_compatible )
143+ d ["data" ] = expr_to_dict (block .data , json_compatible )
143144 if block .raw :
144145 d ["raw" ] = block .raw
145146 case TextBlock ():
@@ -163,7 +164,7 @@ def block_to_dict( # noqa: C901
163164 case MessageBlock ():
164165 d ["content" ] = block_to_dict (block .content , json_compatible )
165166 case ReadBlock ():
166- d ["read" ] = block .read
167+ d ["read" ] = expr_to_dict ( block .read , json_compatible )
167168 d ["message" ] = block .message
168169 d ["multiline" ] = block .multiline
169170 case IncludeBlock ():
@@ -175,18 +176,18 @@ def block_to_dict( # noqa: C901
175176 if block .pdl__trace :
176177 d ["pdl__trace" ] = block_to_dict (block .pdl__trace , json_compatible )
177178 case IfBlock ():
178- d ["if" ] = block .condition
179+ d ["if" ] = expr_to_dict ( block .condition , json_compatible )
179180 d ["then" ] = block_to_dict (block .then , json_compatible )
180181 if block .else_ is not None :
181182 d ["else" ] = block_to_dict (block .else_ , json_compatible )
182183 if block .if_result is not None :
183184 d ["if_result" ] = block .if_result
184185 case MatchBlock ():
185- d ["match" ] = block .match_
186+ d ["match" ] = expr_to_dict ( block .match_ , json_compatible )
186187 d ["with" ] = [
187188 {
188189 "case" : pattern_to_dict (match_case .case ),
189- "if" : match_case .if_ ,
190+ "if" : expr_to_dict ( match_case .if_ , json_compatible ) ,
190191 "then" : block_to_dict (match_case .then , json_compatible ),
191192 "pdl__case_result" : match_case .pdl__case_result ,
192193 "pdl__if_result" : match_case .pdl__if_result ,
@@ -195,11 +196,17 @@ def block_to_dict( # noqa: C901
195196 for match_case in block .with_
196197 ]
197198 case RepeatBlock ():
198- d ["for" ] = block .for_
199- d ["while" ] = block .while_
199+ if block .for_ is not None :
200+ d ["for" ] = expr_to_dict (block .for_ , json_compatible )
201+ if block .while_ is not None :
202+ d ["while" ] = expr_to_dict (block .while_ , json_compatible )
200203 d ["repeat" ] = block_to_dict (block .repeat , json_compatible )
201- d ["until" ] = block .until
202- d ["max_iterations" ] = block .max_iterations
204+ if block .until is not None :
205+ d ["until" ] = expr_to_dict (block .until , json_compatible )
206+ if block .max_iterations is not None :
207+ d ["max_iterations" ] = expr_to_dict (
208+ block .max_iterations , json_compatible
209+ )
203210 d ["join" ] = join_to_dict (block .join )
204211 if block .pdl__trace is not None :
205212 d ["pdl__trace" ] = [
@@ -211,8 +218,8 @@ def block_to_dict( # noqa: C901
211218 # if block.scope is not None:
212219 # d["scope"] = scope_to_dict(block.scope, json_compatible)
213220 case CallBlock ():
214- d ["call" ] = block .call
215- d ["args" ] = data_to_dict (block .args , json_compatible )
221+ d ["call" ] = expr_to_dict ( block .call , json_compatible )
222+ d ["args" ] = expr_to_dict (block .args , json_compatible )
216223 if block .pdl__trace is not None :
217224 d ["pdl__trace" ] = block_to_dict (
218225 block .pdl__trace , json_compatible
@@ -249,14 +256,24 @@ def block_to_dict( # noqa: C901
249256 return d
250257
251258
252- def data_to_dict (data : Any , json_compatible ):
259+ def data_to_dict (data : Any , json_compatible : bool ):
253260 if json_compatible :
254261 d = as_json (data )
255262 else :
256263 d = data
257264 return d
258265
259266
267+ def expr_to_dict (expr : ExpressionType , json_compatible : bool ):
268+ if isinstance (expr , LocalizedExpression ):
269+ d = {"expr" : data_to_dict (expr .expr , json_compatible )}
270+ if expr .pdl__result is not None :
271+ d ["pdl__result" ] = data_to_dict (expr .pdl__result , json_compatible )
272+ else :
273+ d = data_to_dict (expr , json_compatible )
274+ return d
275+
276+
260277def timing_to_dict (timing : PdlTiming ) -> dict :
261278 d : dict = {}
262279 if timing .start_nanos != 0 :
0 commit comments