From e80697503efccf1c0f08575b59eac4e2c677b224 Mon Sep 17 00:00:00 2001 From: Louis Mandel Date: Fri, 4 Apr 2025 13:55:15 -0400 Subject: [PATCH 1/6] feat: `message` blocks contribute the message instead of the content to the context Signed-off-by: Louis Mandel --- pdl-live-react/src/pdl_ast.d.ts | 2 +- src/pdl/pdl-schema.json | 4 ++-- src/pdl/pdl_ast.py | 2 +- src/pdl/pdl_interpreter.py | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pdl-live-react/src/pdl_ast.d.ts b/pdl-live-react/src/pdl_ast.d.ts index 45c3b24b8..208079390 100644 --- a/pdl-live-react/src/pdl_ast.d.ts +++ b/pdl-live-react/src/pdl_ast.d.ts @@ -716,7 +716,7 @@ export type Context5 = * */ export type PdlId5 = string | null -export type PdlIsLeaf5 = false +export type PdlIsLeaf5 = true export type Kind5 = "message" export type Content = | boolean diff --git a/src/pdl/pdl-schema.json b/src/pdl/pdl-schema.json index 334e18911..fddce06f5 100644 --- a/src/pdl/pdl-schema.json +++ b/src/pdl/pdl-schema.json @@ -8048,8 +8048,8 @@ "default": null }, "pdl__is_leaf": { - "const": false, - "default": false, + "const": true, + "default": true, "title": "Pdl Is Leaf", "type": "boolean" }, diff --git a/src/pdl/pdl_ast.py b/src/pdl/pdl_ast.py index 27b4f95c3..670064a43 100644 --- a/src/pdl/pdl_ast.py +++ b/src/pdl/pdl_ast.py @@ -580,7 +580,7 @@ class ObjectBlock(StructuredBlock): object: dict[str, "BlockType"] | list["BlockType"] -class MessageBlock(StructuredBlock): +class MessageBlock(LeafBlock): """Create a message.""" kind: Literal[BlockKind.MESSAGE] = BlockKind.MESSAGE diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py index 973d9eed7..7d209300e 100644 --- a/src/pdl/pdl_interpreter.py +++ b/src/pdl/pdl_interpreter.py @@ -570,7 +570,7 @@ def process_block_body( if state.yield_result and not iteration_state.yield_result: yield_result(result, block.kind) case MessageBlock(): - content, background, scope, trace = process_block_of( + content, _, scope, trace = process_block_of( block, "content", state, @@ -592,6 +592,7 @@ def process_block_body( "defsite": block.pdl__id, } ) + background = PdlList([result]) case IfBlock(): b, if_trace = process_condition_of(block, "condition", scope, loc, "if") if b: From 6a004c6a996efee8189557ba6cc72d4313d294e0 Mon Sep 17 00:00:00 2001 From: Louis Mandel Date: Fri, 4 Apr 2025 14:21:41 -0400 Subject: [PATCH 2/6] `role` is optional in `message` blocks Signed-off-by: Louis Mandel --- pdl-live-react/src/pdl_ast.d.ts | 4 ++-- src/pdl/pdl-schema.json | 4 ++-- src/pdl/pdl_ast.py | 5 ----- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/pdl-live-react/src/pdl_ast.d.ts b/pdl-live-react/src/pdl_ast.d.ts index 208079390..a8d769932 100644 --- a/pdl-live-react/src/pdl_ast.d.ts +++ b/pdl-live-react/src/pdl_ast.d.ts @@ -697,7 +697,7 @@ export type Fallback5 = | EmptyBlock | null /** - * Role of associated to the message. + * Role associated to the block and sub-blocks. * Typical roles are `system`, `user`, and `assistant`, * but there may be other roles such as `available_tools`. */ @@ -3491,7 +3491,7 @@ export interface MessageBlock { contribute?: Contribute5 parser?: Parser5 fallback?: Fallback5 - role: Role5 + role?: Role5 context?: Context5 pdl__id?: PdlId5 pdl__result?: unknown diff --git a/src/pdl/pdl-schema.json b/src/pdl/pdl-schema.json index fddce06f5..d04826128 100644 --- a/src/pdl/pdl-schema.json +++ b/src/pdl/pdl-schema.json @@ -7981,7 +7981,8 @@ "type": "null" } ], - "description": "Role of associated to the message.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.", + "default": null, + "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.", "title": "Role" }, "context": { @@ -8176,7 +8177,6 @@ } }, "required": [ - "role", "content" ], "title": "MessageBlock", diff --git a/src/pdl/pdl_ast.py b/src/pdl/pdl_ast.py index 670064a43..481dba588 100644 --- a/src/pdl/pdl_ast.py +++ b/src/pdl/pdl_ast.py @@ -584,11 +584,6 @@ class MessageBlock(LeafBlock): """Create a message.""" kind: Literal[BlockKind.MESSAGE] = BlockKind.MESSAGE - role: RoleType # pyright: ignore - """Role of associated to the message. - Typical roles are `system`, `user`, and `assistant`, - but there may be other roles such as `available_tools`. - """ # pyright: ignore content: "BlockType" """Content of the message.""" name: Optional[ExpressionType[str]] = None From 2cbb420e81f941ed32dbbaa81faba7780b183b30 Mon Sep 17 00:00:00 2001 From: Louis Mandel Date: Fri, 4 Apr 2025 14:22:08 -0400 Subject: [PATCH 3/6] Add tests Signed-off-by: Louis Mandel --- src/pdl/pdl_interpreter.py | 27 ++++++-------- tests/test_messages.py | 75 +++++++++++++++++++++++++++++++++++--- 2 files changed, 82 insertions(+), 20 deletions(-) diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py index 7d209300e..f6bacc23b 100644 --- a/src/pdl/pdl_interpreter.py +++ b/src/pdl/pdl_interpreter.py @@ -577,21 +577,18 @@ def process_block_body( scope, loc, ) - name, block = process_expr_of( - block, "name", scope, loc # pyright: ignore - ) # pyright: ignore - tool_call_id, block = process_expr_of( - block, "tool_call_id", scope, loc # pyright: ignore - ) # pyright: ignore - result = PdlDict( - { - "role": state.role, - "content": content, - "name": name, - "tool_call_id": tool_call_id, - "defsite": block.pdl__id, - } - ) + d = { + "role": state.role, + "content": content, + "defsite": block.pdl__id, + } + if block.name is not None: + name, block = process_expr_of(block, "name", scope, loc) + d["name"] = name + if block.tool_call_id is not None: + tool_call_id, block = process_expr_of(block, "tool_call_id", scope, loc) + d["tool_call_id"] = tool_call_id + result = PdlDict(d) background = PdlList([result]) case IfBlock(): b, if_trace = process_condition_of(block, "condition", scope, loc, "if") diff --git a/tests/test_messages.py b/tests/test_messages.py index 828488435..1fbf7773e 100644 --- a/tests/test_messages.py +++ b/tests/test_messages.py @@ -1,7 +1,7 @@ from pdl.pdl import exec_str -def test_messages1(): +def test_message1(): prog_str = """ description: Messages block array: @@ -17,15 +17,11 @@ def test_messages1(): "role": "system", "content": "You are a helpful software engineer. You write clear, concise, well-commented code.", "defsite": "array.0.message", - "name": None, - "tool_call_id": None, }, { "role": "user", "content": "Write a Python function that implement merge sort.", "defsite": "array.1.message", - "name": None, - "tool_call_id": None, }, ] assert context == [ @@ -40,3 +36,72 @@ def test_messages1(): "defsite": "array.1.message", }, ] + + +def test_message2(): + prog_str = """ +description: Messages block +role: user +content: + array: + - Hello + - Bye +""" + result = exec_str(prog_str, output="all") + context = result["scope"]["pdl_context"] + assert result["result"] == { + "role": "user", + "content": ["Hello", "Bye"], + "defsite": "message", + } + assert context == [ + { + "role": "user", + "content": ["Hello", "Bye"], + "defsite": "message", + }, + ] + + +def test_message3(): + prog_str = """ +description: Messages block +content: + data: {"a": 1} +""" + result = exec_str(prog_str, output="all") + context = result["scope"]["pdl_context"] + assert result["result"] == { + "role": "user", + "content": {"a": 1}, + "defsite": "message", + }, f"Actual result: {result["result"]}" + assert context == [ + { + "role": "user", + "content": {"a": 1}, + "defsite": "message", + }, + ] + +def test_message4(): + prog_str = """ +description: Messages block +content: + text: + data: {"a": 1} +""" + result = exec_str(prog_str, output="all") + context = result["scope"]["pdl_context"] + assert result["result"] == { + "role": "user", + "content": '{"a": 1}', + "defsite": "message", + }, f"Actual result: {result["result"]}" + assert context == [ + { + "role": "user", + "content": '{"a": 1}', + "defsite": "message", + }, + ] From 9f84d9c30815d0d157561c383f8ca7c52e7d1c5e Mon Sep 17 00:00:00 2001 From: Louis Mandel Date: Fri, 4 Apr 2025 14:31:02 -0400 Subject: [PATCH 4/6] Formatting Signed-off-by: Louis Mandel --- tests/test_messages.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/tests/test_messages.py b/tests/test_messages.py index 1fbf7773e..61d142c7e 100644 --- a/tests/test_messages.py +++ b/tests/test_messages.py @@ -50,10 +50,10 @@ def test_message2(): result = exec_str(prog_str, output="all") context = result["scope"]["pdl_context"] assert result["result"] == { - "role": "user", - "content": ["Hello", "Bye"], - "defsite": "message", - } + "role": "user", + "content": ["Hello", "Bye"], + "defsite": "message", + } assert context == [ { "role": "user", @@ -72,10 +72,10 @@ def test_message3(): result = exec_str(prog_str, output="all") context = result["scope"]["pdl_context"] assert result["result"] == { - "role": "user", - "content": {"a": 1}, - "defsite": "message", - }, f"Actual result: {result["result"]}" + "role": "user", + "content": {"a": 1}, + "defsite": "message", + }, f"Actual result: {result["result"]}" assert context == [ { "role": "user", @@ -84,6 +84,7 @@ def test_message3(): }, ] + def test_message4(): prog_str = """ description: Messages block @@ -94,10 +95,10 @@ def test_message4(): result = exec_str(prog_str, output="all") context = result["scope"]["pdl_context"] assert result["result"] == { - "role": "user", - "content": '{"a": 1}', - "defsite": "message", - }, f"Actual result: {result["result"]}" + "role": "user", + "content": '{"a": 1}', + "defsite": "message", + }, f"Actual result: {result["result"]}" assert context == [ { "role": "user", From ccd5666f6acfc779bf7ef4ad5ecf6de83500f366 Mon Sep 17 00:00:00 2001 From: Louis Mandel Date: Fri, 4 Apr 2025 14:38:56 -0400 Subject: [PATCH 5/6] Fix Signed-off-by: Louis Mandel --- tests/test_messages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_messages.py b/tests/test_messages.py index 61d142c7e..2c3c559fc 100644 --- a/tests/test_messages.py +++ b/tests/test_messages.py @@ -75,7 +75,7 @@ def test_message3(): "role": "user", "content": {"a": 1}, "defsite": "message", - }, f"Actual result: {result["result"]}" + } assert context == [ { "role": "user", From abcb7fe68c01e28922764ab9ce729ede9f89e126 Mon Sep 17 00:00:00 2001 From: Louis Mandel Date: Fri, 4 Apr 2025 14:43:22 -0400 Subject: [PATCH 6/6] Fix Signed-off-by: Louis Mandel --- tests/test_messages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_messages.py b/tests/test_messages.py index 2c3c559fc..b02badf82 100644 --- a/tests/test_messages.py +++ b/tests/test_messages.py @@ -98,7 +98,7 @@ def test_message4(): "role": "user", "content": '{"a": 1}', "defsite": "message", - }, f"Actual result: {result["result"]}" + } assert context == [ { "role": "user",