diff --git a/packages/agentic-workflows/src/zeroshot_agentic_workflows/decorators.py b/packages/agentic-workflows/src/zeroshot_agentic_workflows/decorators.py index de6d1a2..4efc41d 100644 --- a/packages/agentic-workflows/src/zeroshot_agentic_workflows/decorators.py +++ b/packages/agentic-workflows/src/zeroshot_agentic_workflows/decorators.py @@ -88,8 +88,17 @@ async def wrapper(self: Any, *args: Any, **kwargs: Any) -> AgentRunResult[Any]: if tools_ref: instructions = tools_ref + "\n" + instructions - # Map parameters - all_args = args + # Map parameters — merge kwargs into positional order + if kwargs: + import inspect as _inspect + + sig = _inspect.signature(fn) + params = [p for p in sig.parameters if p != "self"] + all_args = tuple( + kwargs.get(p, args[i] if i < len(args) else None) for i, p in enumerate(params) + ) + else: + all_args = args mapped = mapper.map_arguments(all_args) session = mapper.find_session(all_args) @@ -183,8 +192,19 @@ async def wrapper(self: Any, *args: Any, **kwargs: Any) -> ConsensusRunResult[An if tools_ref: instructions = tools_ref + "\n" + instructions - mapped = mapper.map_arguments(args) - session = mapper.find_session(args) + # Map parameters — merge kwargs into positional order + if kwargs: + import inspect as _inspect + + sig = _inspect.signature(fn) + params = [p for p in sig.parameters if p != "self"] + all_args = tuple( + kwargs.get(p, args[i] if i < len(args) else None) for i, p in enumerate(params) + ) + else: + all_args = args + mapped = mapper.map_arguments(all_args) + session = mapper.find_session(all_args) agent_name = name or f"{self.__class__.__name__}:{fn.__name__}" effective_max_turns = max_turns or (8 if resolved_tools else 1) diff --git a/packages/agentic-workflows/tests/unit/test_decorators.py b/packages/agentic-workflows/tests/unit/test_decorators.py index e504dde..dd9804d 100644 --- a/packages/agentic-workflows/tests/unit/test_decorators.py +++ b/packages/agentic-workflows/tests/unit/test_decorators.py @@ -146,6 +146,28 @@ async def spy(config: AgentConfig[str], run_config: AgentRunConfig) -> AgentRunR assert "session" not in input_json assert input_json["input_text"] == "some text" + async def test_kwargs_are_mapped_to_input_json(self, prompts_dir: str) -> None: + """When the decorated method is called with keyword arguments, they + should still appear in the input JSON sent to the agent service.""" + Cls = _make_workflow_class(prompts_dir) + service = AiAgentServiceLocal.get_instance() + + captured: list[AgentRunConfig] = [] + original = service.create_and_run + + async def spy(config: AgentConfig[str], run_config: AgentRunConfig) -> AgentRunResult[str]: + captured.append(run_config) + return await original(config, run_config) + + service.create_and_run = spy # type: ignore[assignment] + + wf = Cls(service) + await wf.test_method(input_text="kwarg value") + + assert len(captured) == 1 + input_json = json.loads(captured[0].input) + assert input_json["input_text"] == "kwarg value" + async def test_passes_model_override(self, prompts_dir: str) -> None: Cls = _make_workflow_class(prompts_dir) service = AiAgentServiceLocal.get_instance() diff --git a/uv.lock b/uv.lock index b6b4cbe..57edc2b 100644 --- a/uv.lock +++ b/uv.lock @@ -101,7 +101,7 @@ wheels = [ [[package]] name = "buildkit-python-workspace" -version = "0.1.6" +version = "0.1.7" source = { virtual = "." } [package.dev-dependencies] @@ -1641,7 +1641,7 @@ wheels = [ [[package]] name = "zeroshot-agent-experiments" -version = "0.1.6" +version = "0.1.7" source = { editable = "packages/agent-experiments" } dependencies = [ { name = "fpdf2" }, @@ -1664,7 +1664,7 @@ requires-dist = [ [[package]] name = "zeroshot-agentic-workflows" -version = "0.1.6" +version = "0.1.7" source = { editable = "packages/agentic-workflows" } dependencies = [ { name = "openai-agents" }, @@ -1681,7 +1681,7 @@ requires-dist = [ [[package]] name = "zeroshot-commons" -version = "0.1.6" +version = "0.1.7" source = { editable = "packages/commons" } dependencies = [ { name = "pyyaml" }, @@ -1696,7 +1696,7 @@ requires-dist = [ [[package]] name = "zeroshot-commons-injectors" -version = "0.1.6" +version = "0.1.7" source = { editable = "packages/commons-injectors" } dependencies = [ { name = "asyncpg" }, @@ -1717,7 +1717,7 @@ requires-dist = [ [[package]] name = "zeroshot-commons-testing" -version = "0.1.6" +version = "0.1.7" source = { editable = "packages/commons-testing" } dependencies = [ { name = "testcontainers", extra = ["redis"] }, @@ -1732,7 +1732,7 @@ requires-dist = [ [[package]] name = "zeroshot-openai-utils" -version = "0.1.6" +version = "0.1.7" source = { editable = "packages/openai-utils" } dependencies = [ { name = "dependency-injector" }, @@ -1749,7 +1749,7 @@ requires-dist = [ [[package]] name = "zeroshot-sql-decorators" -version = "0.1.6" +version = "0.1.7" source = { editable = "packages/sql-decorators" } dependencies = [ { name = "asyncpg" },