Skip to content

Commit 95a387f

Browse files
drdrew42moonbox3
andauthored
Python: [python] Bug fix 10340 (#10341)
### Motivation and Context See #10340 ### Description Implement a similar approach as is done in `process_step_edge_builder.py`, which supports function_name when building the target function. ### Contribution Checklist - [X] The code builds clean without any errors or warnings - [X] The PR follows the [SK Contribution Guidelines](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md) and the [pre-submission formatting script](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md#development-scripts) raises no violations - [X] All unit tests pass, and I have added new tests where possible - [X] I didn't break anyone 😄 (well, we're still passing/xpass/xfail the same as main is) --------- Co-authored-by: Evan Mattson <[email protected]>
1 parent 605db09 commit 95a387f

File tree

2 files changed

+51
-4
lines changed

2 files changed

+51
-4
lines changed

python/semantic_kernel/processes/process_edge_builder.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ def send_event_to(
3232
raise TypeError("Target cannot be None")
3333

3434
if isinstance(target, ProcessStepBuilder):
35-
target = ProcessFunctionTargetBuilder(step=target, parameter_name=kwargs.get("parameter_name"))
35+
target = ProcessFunctionTargetBuilder(
36+
step=target, parameter_name=kwargs.get("parameter_name"), function_name=kwargs.get("function_name")
37+
)
3638

3739
self.target = target
3840
edge_builder = ProcessStepEdgeBuilder(source=self.source, event_id=self.event_id)

python/tests/unit/processes/test_process_edge_builder.py

+48-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77

88
from semantic_kernel.processes.process_builder import ProcessBuilder
99
from semantic_kernel.processes.process_edge_builder import ProcessEdgeBuilder
10-
from semantic_kernel.processes.process_function_target_builder import ProcessFunctionTargetBuilder
10+
from semantic_kernel.processes.process_function_target_builder import (
11+
ProcessFunctionTargetBuilder,
12+
)
1113
from semantic_kernel.processes.process_step_builder import ProcessStepBuilder
1214
from semantic_kernel.processes.process_step_edge_builder import ProcessStepEdgeBuilder
1315

@@ -88,12 +90,55 @@ def test_send_event_to_with_step_builder():
8890
assert linked_edge_builder.target == edge_builder.target
8991

9092

93+
def test_send_event_to_step_with_multiple_functions():
94+
from semantic_kernel.functions.kernel_function_metadata import (
95+
KernelFunctionMetadata,
96+
) # noqa: F401
97+
98+
# Arrange
99+
source = MagicMock(spec=ProcessBuilder)
100+
source.link_to = MagicMock()
101+
102+
target_step = ProcessStepBuilder(name="test_step")
103+
target_step.functions_dict = {
104+
"func_1": MagicMock(spec=KernelFunctionMetadata),
105+
"func_2": MagicMock(spec=KernelFunctionMetadata),
106+
}
107+
108+
event_id = "event_004"
109+
edge_builder = ProcessEdgeBuilder(source=source, event_id=event_id)
110+
111+
# Act - Create edges to both functions in the step
112+
result1 = edge_builder.send_event_to(target_step, function_name="func_1", parameter_name="input_param1")
113+
result2 = edge_builder.send_event_to(target_step, function_name="func_2", parameter_name="input_param2")
114+
115+
# Assert
116+
# Verify both edges were created
117+
assert len(source.link_to.call_args_list) == 2
118+
119+
# Check first edge
120+
first_edge = source.link_to.call_args_list[0][0][1]
121+
assert isinstance(first_edge, ProcessStepEdgeBuilder)
122+
assert first_edge.target.function_name == "func_1"
123+
assert first_edge.target.parameter_name == "input_param1"
124+
assert first_edge.target.step == target_step
125+
assert isinstance(result1, ProcessEdgeBuilder)
126+
127+
# Check second edge
128+
second_edge = source.link_to.call_args_list[1][0][1]
129+
assert isinstance(second_edge, ProcessStepEdgeBuilder)
130+
assert second_edge.target.function_name == "func_2"
131+
assert second_edge.target.parameter_name == "input_param2"
132+
assert second_edge.target.step == target_step
133+
assert isinstance(result2, ProcessEdgeBuilder)
134+
135+
91136
def test_send_event_to_creates_step_edge():
92137
# Arrange
93138
source = MagicMock(spec=ProcessBuilder)
94139
source.link_to = MagicMock()
95140
target = MagicMock(spec=ProcessFunctionTargetBuilder)
96-
event_id = "event_004"
141+
event_id = "event_005"
97142
edge_builder = ProcessEdgeBuilder(source=source, event_id=event_id)
98143

99144
# Act
@@ -110,7 +155,7 @@ def test_send_event_to_creates_step_edge():
110155
def test_send_event_to_raises_error_on_invalid_target():
111156
# Arrange
112157
source = MagicMock(spec=ProcessBuilder)
113-
event_id = "event_005"
158+
event_id = "event_006"
114159
edge_builder = ProcessEdgeBuilder(source=source, event_id=event_id)
115160

116161
# Act & Assert

0 commit comments

Comments
 (0)