@@ -752,6 +752,213 @@ def test_list(self, mock_client: Mock) -> None:
752752
753753 mock_client .agents .list .assert_called_once ()
754754
755+ def test_create_from_npm (self , mock_client : Mock , agent_view : MockAgentView ) -> None :
756+ """Test create_from_npm factory method."""
757+ mock_client .agents .create .return_value = agent_view
758+
759+ client = AgentOps (mock_client )
760+ agent = client .create_from_npm (
761+ name = "test-agent" ,
762+ package_name = "@runloop/example-agent" ,
763+ )
764+
765+ assert isinstance (agent , Agent )
766+ assert agent .id == "agent_123"
767+ mock_client .agents .create .assert_called_once_with (
768+ source = {
769+ "type" : "npm" ,
770+ "npm" : {
771+ "package_name" : "@runloop/example-agent" ,
772+ },
773+ },
774+ name = "test-agent" ,
775+ )
776+
777+ def test_create_from_npm_with_all_options (self , mock_client : Mock , agent_view : MockAgentView ) -> None :
778+ """Test create_from_npm factory method with all optional parameters."""
779+ mock_client .agents .create .return_value = agent_view
780+
781+ client = AgentOps (mock_client )
782+ agent = client .create_from_npm (
783+ package_name = "@runloop/example-agent" ,
784+ npm_version = "1.2.3" ,
785+ registry_url = "https://registry.example.com" ,
786+ agent_setup = ["npm install" , "npm run setup" ],
787+ name = "test-agent" ,
788+ extra_headers = {"X-Custom" : "header" },
789+ )
790+
791+ assert isinstance (agent , Agent )
792+ assert agent .id == "agent_123"
793+ mock_client .agents .create .assert_called_once_with (
794+ source = {
795+ "type" : "npm" ,
796+ "npm" : {
797+ "package_name" : "@runloop/example-agent" ,
798+ "npm_version" : "1.2.3" ,
799+ "registry_url" : "https://registry.example.com" ,
800+ "agent_setup" : ["npm install" , "npm run setup" ],
801+ },
802+ },
803+ name = "test-agent" ,
804+ extra_headers = {"X-Custom" : "header" },
805+ )
806+
807+ def test_create_from_npm_raises_when_source_provided (self , mock_client : Mock ) -> None :
808+ """Test create_from_npm raises ValueError when source is provided in params."""
809+ client = AgentOps (mock_client )
810+
811+ with pytest .raises (ValueError , match = "Cannot specify 'source' when using create_from_npm" ):
812+ client .create_from_npm (
813+ package_name = "@runloop/example-agent" ,
814+ name = "test-agent" ,
815+ source = {"type" : "git" , "git" : {"repository" : "https://github.com/example/repo" }},
816+ )
817+
818+ def test_create_from_pip (self , mock_client : Mock , agent_view : MockAgentView ) -> None :
819+ """Test create_from_pip factory method."""
820+ mock_client .agents .create .return_value = agent_view
821+
822+ client = AgentOps (mock_client )
823+ agent = client .create_from_pip (
824+ package_name = "runloop-example-agent" ,
825+ name = "test-agent" ,
826+ )
827+
828+ assert isinstance (agent , Agent )
829+ assert agent .id == "agent_123"
830+ mock_client .agents .create .assert_called_once_with (
831+ source = {
832+ "type" : "pip" ,
833+ "pip" : {
834+ "package_name" : "runloop-example-agent" ,
835+ },
836+ },
837+ name = "test-agent" ,
838+ )
839+
840+ def test_create_from_pip_with_all_options (self , mock_client : Mock , agent_view : MockAgentView ) -> None :
841+ """Test create_from_pip factory method with all optional parameters."""
842+ mock_client .agents .create .return_value = agent_view
843+
844+ client = AgentOps (mock_client )
845+ agent = client .create_from_pip (
846+ package_name = "runloop-example-agent" ,
847+ pip_version = "1.2.3" ,
848+ registry_url = "https://pypi.example.com" ,
849+ agent_setup = ["pip install extra-deps" ],
850+ name = "test-agent" ,
851+ )
852+
853+ assert isinstance (agent , Agent )
854+ assert agent .id == "agent_123"
855+ mock_client .agents .create .assert_called_once_with (
856+ source = {
857+ "type" : "pip" ,
858+ "pip" : {
859+ "package_name" : "runloop-example-agent" ,
860+ "pip_version" : "1.2.3" ,
861+ "registry_url" : "https://pypi.example.com" ,
862+ "agent_setup" : ["pip install extra-deps" ],
863+ },
864+ },
865+ name = "test-agent" ,
866+ )
867+
868+ def test_create_from_git (self , mock_client : Mock , agent_view : MockAgentView ) -> None :
869+ """Test create_from_git factory method."""
870+ mock_client .agents .create .return_value = agent_view
871+
872+ client = AgentOps (mock_client )
873+ agent = client .create_from_git (
874+ repository = "https://github.com/example/agent-repo" ,
875+ name = "test-agent" ,
876+ )
877+
878+ assert isinstance (agent , Agent )
879+ assert agent .id == "agent_123"
880+ mock_client .agents .create .assert_called_once_with (
881+ source = {
882+ "type" : "git" ,
883+ "git" : {
884+ "repository" : "https://github.com/example/agent-repo" ,
885+ },
886+ },
887+ name = "test-agent" ,
888+ )
889+
890+ def test_create_from_git_with_all_options (self , mock_client : Mock , agent_view : MockAgentView ) -> None :
891+ """Test create_from_git factory method with all optional parameters."""
892+ mock_client .agents .create .return_value = agent_view
893+
894+ client = AgentOps (mock_client )
895+ agent = client .create_from_git (
896+ repository = "https://github.com/example/agent-repo" ,
897+ ref = "develop" ,
898+ agent_setup = ["npm install" , "npm run build" ],
899+ name = "test-agent" ,
900+ )
901+
902+ assert isinstance (agent , Agent )
903+ assert agent .id == "agent_123"
904+ mock_client .agents .create .assert_called_once_with (
905+ source = {
906+ "type" : "git" ,
907+ "git" : {
908+ "repository" : "https://github.com/example/agent-repo" ,
909+ "ref" : "develop" ,
910+ "agent_setup" : ["npm install" , "npm run build" ],
911+ },
912+ },
913+ name = "test-agent" ,
914+ )
915+
916+ def test_create_from_object (self , mock_client : Mock , agent_view : MockAgentView ) -> None :
917+ """Test create_from_object factory method."""
918+ mock_client .agents .create .return_value = agent_view
919+
920+ client = AgentOps (mock_client )
921+ agent = client .create_from_object (
922+ object_id = "obj_123" ,
923+ name = "test-agent" ,
924+ )
925+
926+ assert isinstance (agent , Agent )
927+ assert agent .id == "agent_123"
928+ mock_client .agents .create .assert_called_once_with (
929+ source = {
930+ "type" : "object" ,
931+ "object" : {
932+ "object_id" : "obj_123" ,
933+ },
934+ },
935+ name = "test-agent" ,
936+ )
937+
938+ def test_create_from_object_with_agent_setup (self , mock_client : Mock , agent_view : MockAgentView ) -> None :
939+ """Test create_from_object factory method with agent_setup."""
940+ mock_client .agents .create .return_value = agent_view
941+
942+ client = AgentOps (mock_client )
943+ agent = client .create_from_object (
944+ object_id = "obj_123" ,
945+ agent_setup = ["chmod +x setup.sh" , "./setup.sh" ],
946+ name = "test-agent" ,
947+ )
948+
949+ assert isinstance (agent , Agent )
950+ assert agent .id == "agent_123"
951+ mock_client .agents .create .assert_called_once_with (
952+ source = {
953+ "type" : "object" ,
954+ "object" : {
955+ "object_id" : "obj_123" ,
956+ "agent_setup" : ["chmod +x setup.sh" , "./setup.sh" ],
957+ },
958+ },
959+ name = "test-agent" ,
960+ )
961+
755962
756963class TestRunloopSDK :
757964 """Tests for RunloopSDK class."""
0 commit comments