@@ -911,6 +911,87 @@ async def test_update_task_by_name_endpoint_success(
911911 assert response_data ["task_metadata" ]["configuration" ]["version" ] == "2.0.0"
912912 assert response_data ["task_metadata" ]["metrics" ]["complexity_score" ] == 75
913913
914+ async def test_update_task_by_name_forwards_merge_params (
915+ self , isolated_client , isolated_repositories
916+ ):
917+ """PUT /tasks/name/{task_name} must forward merge_params, not drop it."""
918+ # Given - a task with existing params
919+ agent_repo = isolated_repositories ["agent_repository" ]
920+ agent = AgentEntity (
921+ id = orm_id (),
922+ name = "merge-params-by-name-agent" ,
923+ description = "Agent for merge_params by name testing" ,
924+ acp_url = "http://test-acp:8000" ,
925+ acp_type = ACPType .SYNC ,
926+ )
927+ await agent_repo .create (agent )
928+
929+ task_repo = isolated_repositories ["task_repository" ]
930+ task = TaskEntity (
931+ id = orm_id (),
932+ name = "task-for-merge-params-by-name" ,
933+ status = TaskStatus .RUNNING ,
934+ status_reason = "Test task for merge_params by name endpoint" ,
935+ params = {"model" : "gpt-4" , "temperature" : 0.2 },
936+ )
937+ created_task = await task_repo .create (agent_id = agent .id , task = task )
938+
939+ # When - update by name supplying only merge_params
940+ update_payload = {"merge_params" : {"temperature" : 0.9 , "max_tokens" : 1024 }}
941+ response = await isolated_client .put (
942+ f"/tasks/name/{ created_task .name } " , json = update_payload
943+ )
944+
945+ # Then - the patch is shallow-merged into the existing params
946+ assert response .status_code == 200
947+ response_data = response .json ()
948+ assert response_data ["params" ] == {
949+ "model" : "gpt-4" ,
950+ "temperature" : 0.9 ,
951+ "max_tokens" : 1024 ,
952+ }
953+
954+ async def test_update_task_metadata_and_merge_params_together (
955+ self , isolated_client , isolated_repositories
956+ ):
957+ """Supplying both task_metadata and merge_params must persist both."""
958+ # Given - a task with existing params and metadata
959+ agent_repo = isolated_repositories ["agent_repository" ]
960+ agent = AgentEntity (
961+ id = orm_id (),
962+ name = "merge-params-and-metadata-agent" ,
963+ description = "Agent for combined update testing" ,
964+ acp_url = "http://test-acp:8000" ,
965+ acp_type = ACPType .SYNC ,
966+ )
967+ await agent_repo .create (agent )
968+
969+ task_repo = isolated_repositories ["task_repository" ]
970+ task = TaskEntity (
971+ id = orm_id (),
972+ name = "task-for-combined-update" ,
973+ status = TaskStatus .RUNNING ,
974+ status_reason = "Test task for combined update endpoint" ,
975+ params = {"model" : "gpt-4" },
976+ task_metadata = {"initial" : "metadata" },
977+ )
978+ created_task = await task_repo .create (agent_id = agent .id , task = task )
979+
980+ # When - update by id supplying both fields at once
981+ update_payload = {
982+ "task_metadata" : {"stage" : "tuned" },
983+ "merge_params" : {"temperature" : 0.7 },
984+ }
985+ response = await isolated_client .put (
986+ f"/tasks/{ created_task .id } " , json = update_payload
987+ )
988+
989+ # Then - neither field is silently discarded
990+ assert response .status_code == 200
991+ response_data = response .json ()
992+ assert response_data ["task_metadata" ] == {"stage" : "tuned" }
993+ assert response_data ["params" ] == {"model" : "gpt-4" , "temperature" : 0.7 }
994+
914995 async def test_list_tasks_includes_task_metadata_field (
915996 self , isolated_client , isolated_repositories
916997 ):
0 commit comments