From 68d0ee20c8aae8486045c82393e39a69871d7313 Mon Sep 17 00:00:00 2001 From: Mandana Vaziri Date: Wed, 26 Mar 2025 17:16:24 -0400 Subject: [PATCH 1/3] Bug fix for default parameter setting Signed-off-by: Mandana Vaziri --- src/pdl/pdl_interpreter.py | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py index fc748d5af..132a9264d 100644 --- a/src/pdl/pdl_interpreter.py +++ b/src/pdl/pdl_interpreter.py @@ -1277,16 +1277,7 @@ def process_call_model( _, concrete_block = process_expr_of( concrete_block, "parameters", scope, loc ) - - # Apply PDL defaults to model invocation - if concrete_block.parameters is None or isinstance( - concrete_block.parameters, dict - ): - concrete_block.parameters = apply_defaults( - str(model_id), - concrete_block.parameters or {}, - scope.get("pdl_model_default_parameters", []), - ) + case GraniteioModelBlock(): _, concrete_block = process_expr_of(concrete_block, "backend", scope, loc) if concrete_block.processor is not None: @@ -1339,7 +1330,7 @@ def get_transformed_inputs(kwargs): if getenv("OTEL_EXPORTER") and getenv("OTEL_ENDPOINT"): litellm.callbacks = ["otel"] - msg, raw_result = generate_client_response(state, concrete_block, model_input) + msg, raw_result = generate_client_response(state, scope, concrete_block, str(model_id), model_input) background: LazyMessages = PdlList([lazy_apply(lambda msg: msg | {"defsite": block.pdl__id}, msg)]) # type: ignore result = lazy_apply( lambda msg: "" if msg["content"] is None else msg["content"], msg @@ -1368,17 +1359,19 @@ def get_transformed_inputs(kwargs): def generate_client_response( state: InterpreterState, + scope: ScopeType, block: LitellmModelBlock | GraniteioModelBlock, + model_id: str, model_input: ModelInput, ) -> tuple[LazyMessage, PdlLazy[Any]]: match state.batch: case 0: model_output, raw_result = generate_client_response_streaming( - state, block, model_input + state, scope, block, model_id, model_input ) case 1: model_output, raw_result = generate_client_response_single( - state, block, model_input + state, scope, block, model_id, model_input ) case _: assert False @@ -1387,19 +1380,28 @@ def generate_client_response( def generate_client_response_streaming( state: InterpreterState, + scope: ScopeType, block: LitellmModelBlock | GraniteioModelBlock, + model_id: str, model_input: ModelInput, ) -> tuple[LazyMessage, PdlLazy[Any]]: msg_stream: Generator[dict[str, Any], Any, Any] match block: case LitellmModelBlock(): - if block.parameters is None: + if block.parameters is None: parameters = None else: parameters = value_of_expr(block.parameters) # pyright: ignore assert parameters is None or isinstance( parameters, dict ) # block is a "concrete block" + # Apply PDL defaults to model invocation + + parameters = apply_defaults( + model_id, + parameters or {}, + scope.get("pdl_model_default_parameters", []), + ) msg_stream = LitellmModel.generate_text_stream( model_id=value_of_expr(block.model), messages=model_input, @@ -1465,7 +1467,9 @@ def litellm_parameters_to_dict( def generate_client_response_single( state: InterpreterState, + scope: ScopeType, block: LitellmModelBlock | GraniteioModelBlock, + model_id: str, model_input: ModelInput, ) -> tuple[LazyMessage, PdlLazy[Any]]: if block.parameters is None: @@ -1475,6 +1479,11 @@ def generate_client_response_single( assert parameters is None or isinstance( parameters, dict ) # block is a "concrete block" + parameters = apply_defaults( + model_id, + parameters or {}, + scope.get("pdl_model_default_parameters", []), + ) block.pdl__usage = PdlUsage() match block: case LitellmModelBlock(): From 54c8982030b0c9ebf1ba8c7ac2e743e7778de4c0 Mon Sep 17 00:00:00 2001 From: Mandana Vaziri Date: Wed, 26 Mar 2025 17:23:53 -0400 Subject: [PATCH 2/3] Bug fix for default parameters in sdk Signed-off-by: Mandana Vaziri --- src/pdl/pdl.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pdl/pdl.py b/src/pdl/pdl.py index bf39ec31f..8baca2bf9 100644 --- a/src/pdl/pdl.py +++ b/src/pdl/pdl.py @@ -70,7 +70,8 @@ def exec_program( if not isinstance(scope, PdlDict): scope = PdlDict(scope or {}) loc = loc or empty_block_location - future_result, _, future_scope, trace = process_prog(state, scope, prog, loc) + initial_scope = {"pdl_model_default_parameters": get_default_model_parameters()} + future_result, _, future_scope, trace = process_prog(state, scope | initial_scope, prog, loc) result = future_result.result() match output: case "result": From 1c708672fbb5570a7445a139d91f205d8cb6e0f1 Mon Sep 17 00:00:00 2001 From: Mandana Vaziri Date: Wed, 26 Mar 2025 17:45:18 -0400 Subject: [PATCH 3/3] cleanup Signed-off-by: Mandana Vaziri --- src/pdl/pdl.py | 4 +++- src/pdl/pdl_interpreter.py | 22 +++++++++++++--------- tests/test_var.py | 8 ++++---- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/pdl/pdl.py b/src/pdl/pdl.py index 8baca2bf9..09d752d2f 100644 --- a/src/pdl/pdl.py +++ b/src/pdl/pdl.py @@ -71,7 +71,9 @@ def exec_program( scope = PdlDict(scope or {}) loc = loc or empty_block_location initial_scope = {"pdl_model_default_parameters": get_default_model_parameters()} - future_result, _, future_scope, trace = process_prog(state, scope | initial_scope, prog, loc) + future_result, _, future_scope, trace = process_prog( + state, scope | initial_scope, prog, loc + ) result = future_result.result() match output: case "result": diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py index 132a9264d..973d9eed7 100644 --- a/src/pdl/pdl_interpreter.py +++ b/src/pdl/pdl_interpreter.py @@ -1277,7 +1277,7 @@ def process_call_model( _, concrete_block = process_expr_of( concrete_block, "parameters", scope, loc ) - + case GraniteioModelBlock(): _, concrete_block = process_expr_of(concrete_block, "backend", scope, loc) if concrete_block.processor is not None: @@ -1330,7 +1330,9 @@ def get_transformed_inputs(kwargs): if getenv("OTEL_EXPORTER") and getenv("OTEL_ENDPOINT"): litellm.callbacks = ["otel"] - msg, raw_result = generate_client_response(state, scope, concrete_block, str(model_id), model_input) + msg, raw_result = generate_client_response( + state, scope, concrete_block, str(model_id), model_input + ) background: LazyMessages = PdlList([lazy_apply(lambda msg: msg | {"defsite": block.pdl__id}, msg)]) # type: ignore result = lazy_apply( lambda msg: "" if msg["content"] is None else msg["content"], msg @@ -1388,7 +1390,7 @@ def generate_client_response_streaming( msg_stream: Generator[dict[str, Any], Any, Any] match block: case LitellmModelBlock(): - if block.parameters is None: + if block.parameters is None: parameters = None else: parameters = value_of_expr(block.parameters) # pyright: ignore @@ -1396,7 +1398,7 @@ def generate_client_response_streaming( parameters, dict ) # block is a "concrete block" # Apply PDL defaults to model invocation - + parameters = apply_defaults( model_id, parameters or {}, @@ -1410,7 +1412,9 @@ def generate_client_response_streaming( ) case GraniteioModelBlock(): # TODO: curently fallback to the non-streaming interface - return generate_client_response_single(state, block, model_input) + return generate_client_response_single( + state, scope, block, model_id, model_input + ) case _: assert False complete_msg: Optional[dict[str, Any]] = None @@ -1480,10 +1484,10 @@ def generate_client_response_single( parameters, dict ) # block is a "concrete block" parameters = apply_defaults( - model_id, - parameters or {}, - scope.get("pdl_model_default_parameters", []), - ) + model_id, + parameters or {}, + scope.get("pdl_model_default_parameters", []), + ) block.pdl__usage = PdlUsage() match block: case LitellmModelBlock(): diff --git a/tests/test_var.py b/tests/test_var.py index 9325847c9..b74c47799 100644 --- a/tests/test_var.py +++ b/tests/test_var.py @@ -112,10 +112,10 @@ def test_code_var(): result = exec_dict(code_var_data, output="all") text = result["result"] scope = result["scope"] - assert scope == { - "pdl_context": [{"role": "user", "content": text, "defsite": "text.0.code"}], - "I": 0, - } + assert scope["pdl_context"] == [ + {"role": "user", "content": text, "defsite": "text.0.code"} + ] + assert scope["I"] == 0 assert text == "0"