Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
2041c8a
fix: optimize KernelArguments merge to avoid unnecessary dict copy
nimanikoo Feb 27, 2026
da0c622
Merge branch 'main' into fix/optimize-kernel-arguments-merge
nimanikoo Feb 27, 2026
574ab8e
Update python/tests/unit/functions/test_kernel_arguments_merge_optimi…
nimanikoo Mar 24, 2026
9f9fa02
Update python/semantic_kernel/functions/kernel_arguments.py
nimanikoo Mar 24, 2026
43bc49d
Update python/tests/unit/functions/test_kernel_arguments_merge_optimi…
nimanikoo Mar 24, 2026
b1374d6
Update python/semantic_kernel/functions/kernel_arguments.py
nimanikoo Mar 24, 2026
e2ed726
Merge branch 'main' into fix/optimize-kernel-arguments-merge
nimanikoo Mar 24, 2026
76c1c3b
Update python/semantic_kernel/functions/kernel_arguments.py
nimanikoo Apr 5, 2026
810cb92
Merge branch 'main' into fix/optimize-kernel-arguments-merge
nimanikoo Apr 5, 2026
b37a8cc
Update kernel_arguments.py
nimanikoo Apr 9, 2026
44250c7
Update kernel_arguments.py
nimanikoo Apr 12, 2026
dca2019
Merge branch 'main' into fix/optimize-kernel-arguments-merge
nimanikoo May 14, 2026
eb25bad
Python: Fix KernelArguments merge tests to use PromptExecutionSettings
nimanikoo May 14, 2026
53194ac
Python: Fix aliasing bug in KernelArguments constructor for dict sett…
nimanikoo May 14, 2026
d5a6c8d
Merge branch 'main' into fix/optimize-kernel-arguments-merge
nimanikoo Jul 6, 2026
0daf7f4
Merge branch 'main' into fix/optimize-kernel-arguments-merge
nimanikoo Jul 8, 2026
3d3819d
Merge branch 'main' into fix/optimize-kernel-arguments-merge
nimanikoo Jul 9, 2026
94b6e23
Merge branch 'main' into fix/optimize-kernel-arguments-merge
eavanvalkenburg Sep 28, 2026
d91979e
Merge branch 'main' into fix/optimize-kernel-arguments-merge
nimanikoo Sep 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 3 additions & 9 deletions python/semantic_kernel/functions/kernel_arguments.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def __init__(
if settings:
settings_dict = {}
if isinstance(settings, dict):
settings_dict = settings
settings_dict = dict(settings)
elif isinstance(settings, list):
Comment thread
nimanikoo marked this conversation as resolved.
settings_dict = {s.service_id or DEFAULT_SERVICE_NAME: s for s in settings}
else:
Expand All @@ -67,11 +67,9 @@ def __or__(self, value: dict) -> "KernelArguments":
f"TypeError: unsupported operand type(s) for |: '{type(self).__name__}' and '{type(value).__name__}'"
)

# Merge execution settings
new_execution_settings = (self.execution_settings or {}).copy()
if isinstance(value, KernelArguments) and value.execution_settings:
new_execution_settings |= value.execution_settings
# Create a new KernelArguments with merged dict values
new_execution_settings.update(value.execution_settings)
return KernelArguments(settings=new_execution_settings, **(dict(self) | dict(value)))

def __ror__(self, value: dict) -> "KernelArguments":
Expand All @@ -84,21 +82,17 @@ def __ror__(self, value: dict) -> "KernelArguments":
f"TypeError: unsupported operand type(s) for |: '{type(value).__name__}' and '{type(self).__name__}'"
)

# Merge execution settings
new_execution_settings = {}
if isinstance(value, KernelArguments) and value.execution_settings:
new_execution_settings = value.execution_settings.copy()
if self.execution_settings:
new_execution_settings |= self.execution_settings

# Create a new KernelArguments with merged dict values
new_execution_settings.update(self.execution_settings)
return KernelArguments(settings=new_execution_settings, **(dict(value) | dict(self)))

def __ior__(self, value: "SupportsKeysAndGetItem[Any, Any] | Iterable[tuple[Any, Any]]") -> "KernelArguments":
"""Merges into this KernelArguments with another KernelArguments or dict (in-place)."""
self.update(value)

# In-place merge execution settings
if isinstance(value, KernelArguments) and value.execution_settings:
if self.execution_settings:
self.execution_settings.update(value.execution_settings)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# Copyright (c) Microsoft. All rights reserved.

"""Tests for KernelArguments merge operator behavior."""

import pytest

from semantic_kernel.connectors.ai.prompt_execution_settings import PromptExecutionSettings
from semantic_kernel.functions.kernel_arguments import KernelArguments


@pytest.fixture
def settings_svc1():
return PromptExecutionSettings(service_id="service1")


@pytest.fixture
def settings_svc2():
return PromptExecutionSettings(service_id="service2")


@pytest.fixture
def settings_default():
return PromptExecutionSettings(service_id="default")


class TestKernelArgumentsMergeOptimization:
"""Test suite for KernelArguments merge operator behavior."""

def test_or_operator_no_execution_settings(self):
"""Test that | operator works when execution_settings is None."""
args = KernelArguments(a=1, b=2)

result = args | {"c": 3}

assert result["a"] == 1
assert result["b"] == 2
assert result["c"] == 3
Comment thread
nimanikoo marked this conversation as resolved.

def test_or_operator_merges_settings_by_service_id(self, settings_svc1, settings_svc2):
"""Test | merges execution_settings keyed by service_id."""
args1 = KernelArguments(a=1, settings=settings_svc1)
args2 = KernelArguments(b=2, settings=settings_svc2)

result = args1 | args2

assert result["a"] == 1
assert result["b"] == 2
assert result.execution_settings["service1"] is settings_svc1
assert result.execution_settings["service2"] is settings_svc2

def test_or_operator_right_side_wins_on_same_service_id(self, settings_default):
"""Test | overwrites execution_settings when both sides share a service_id."""
settings_override = PromptExecutionSettings(service_id="default")
args1 = KernelArguments(a=1, settings=settings_default)
args2 = KernelArguments(b=2, settings=settings_override)

result = args1 | args2

assert result.execution_settings["default"] is settings_override

def test_ror_operator_merges_plain_dict_with_kernel_arguments(self, settings_svc1):
"""Test reverse | operator merges a plain dict with KernelArguments."""
args = KernelArguments(a=1, settings=settings_svc1)

result = {"b": 2} | args

assert result["a"] == 1
assert result["b"] == 2
assert result.execution_settings["service1"] is settings_svc1

Comment thread
nimanikoo marked this conversation as resolved.
def test_ior_operator_merges_settings_in_place(self, settings_svc1, settings_svc2):
"""Test |= merges execution_settings into the existing dict in-place."""
args1 = KernelArguments(a=1, settings=settings_svc1)
original_dict = args1.execution_settings

args2 = KernelArguments(b=2, settings=settings_svc2)
args1 |= args2

assert args1["a"] == 1
assert args1["b"] == 2
assert args1.execution_settings is original_dict
assert args1.execution_settings["service1"] is settings_svc1
assert args1.execution_settings["service2"] is settings_svc2

def test_ior_operator_copies_settings_when_target_has_none(self, settings_svc1):
"""Test |= creates a copy of execution_settings when target has none."""
args1 = KernelArguments(a=1)
assert args1.execution_settings is None

args2 = KernelArguments(b=2, settings=settings_svc1)
args1 |= args2

assert args1.execution_settings is not None
assert args1.execution_settings["service1"] is settings_svc1
assert args1.execution_settings is not args2.execution_settings

def test_or_operator_does_not_mutate_original_settings(self, settings_svc1, settings_svc2):
"""Test that | does not mutate the original execution_settings."""
args1 = KernelArguments(a=1, settings=settings_svc1)
args2 = KernelArguments(b=2, settings=settings_svc2)
original_settings = args1.execution_settings

result = args1 | args2
Comment thread
nimanikoo marked this conversation as resolved.

assert args1.execution_settings is original_settings
assert "service2" not in args1.execution_settings
assert "service2" in result.execution_settings

def test_ior_operator_right_side_wins_on_same_service_id(self, settings_default):
"""Test |= overwrites existing settings entry when service_id matches."""
settings_override = PromptExecutionSettings(service_id="default")
args1 = KernelArguments(a=1, settings=settings_default)
args2 = KernelArguments(b=2, settings=settings_override)

args1 |= args2

assert args1.execution_settings["default"] is settings_override
Loading