diff --git a/src/runloop_api_client/sdk/async_.py b/src/runloop_api_client/sdk/async_.py index 4bcd08fc1..6bbac2631 100644 --- a/src/runloop_api_client/sdk/async_.py +++ b/src/runloop_api_client/sdk/async_.py @@ -599,7 +599,6 @@ async def create_from_npm( self, *, package_name: str, - npm_version: Optional[str] = None, registry_url: Optional[str] = None, agent_setup: Optional[list[str]] = None, **params: Unpack[SDKAgentCreateParams], @@ -608,8 +607,6 @@ async def create_from_npm( :param package_name: NPM package name :type package_name: str - :param npm_version: NPM version constraint, defaults to None - :type npm_version: Optional[str], optional :param registry_url: NPM registry URL, defaults to None :type registry_url: Optional[str], optional :param agent_setup: Setup commands to run after installation, defaults to None @@ -625,8 +622,6 @@ async def create_from_npm( ) npm_config: Npm = {"package_name": package_name} - if npm_version is not None: - npm_config["npm_version"] = npm_version if registry_url is not None: npm_config["registry_url"] = registry_url if agent_setup is not None: @@ -639,7 +634,6 @@ async def create_from_pip( self, *, package_name: str, - pip_version: Optional[str] = None, registry_url: Optional[str] = None, agent_setup: Optional[list[str]] = None, **params: Unpack[SDKAgentCreateParams], @@ -648,8 +642,6 @@ async def create_from_pip( :param package_name: Pip package name :type package_name: str - :param pip_version: Pip version constraint, defaults to None - :type pip_version: Optional[str], optional :param registry_url: Pip registry URL, defaults to None :type registry_url: Optional[str], optional :param agent_setup: Setup commands to run after installation, defaults to None @@ -665,8 +657,6 @@ async def create_from_pip( ) pip_config: Pip = {"package_name": package_name} - if pip_version is not None: - pip_config["pip_version"] = pip_version if registry_url is not None: pip_config["registry_url"] = registry_url if agent_setup is not None: diff --git a/src/runloop_api_client/sdk/sync.py b/src/runloop_api_client/sdk/sync.py index f215c8116..f831fafd7 100644 --- a/src/runloop_api_client/sdk/sync.py +++ b/src/runloop_api_client/sdk/sync.py @@ -594,7 +594,6 @@ def create_from_npm( self, *, package_name: str, - npm_version: Optional[str] = None, registry_url: Optional[str] = None, agent_setup: Optional[list[str]] = None, **params: Unpack[SDKAgentCreateParams], @@ -603,13 +602,11 @@ def create_from_npm( Example: >>> agent = runloop.agent.create_from_npm( - ... name="my-npm-agent", package_name="@runloop/example-agent", npm_version="^1.0.0" + ... name="my-npm-agent", package_name="@runloop/example-agent", version="1.0.0" ... ) :param package_name: NPM package name :type package_name: str - :param npm_version: NPM version constraint, defaults to None - :type npm_version: Optional[str], optional :param registry_url: NPM registry URL, defaults to None :type registry_url: Optional[str], optional :param agent_setup: Setup commands to run after installation, defaults to None @@ -625,8 +622,6 @@ def create_from_npm( ) npm_config: Npm = {"package_name": package_name} - if npm_version is not None: - npm_config["npm_version"] = npm_version if registry_url is not None: npm_config["registry_url"] = registry_url if agent_setup is not None: @@ -639,7 +634,6 @@ def create_from_pip( self, *, package_name: str, - pip_version: Optional[str] = None, registry_url: Optional[str] = None, agent_setup: Optional[list[str]] = None, **params: Unpack[SDKAgentCreateParams], @@ -648,13 +642,11 @@ def create_from_pip( Example: >>> agent = runloop.agent.create_from_pip( - ... name="my-pip-agent", package_name="runloop-example-agent", pip_version=">=1.0.0" + ... name="my-pip-agent", package_name="runloop-example-agent", version="1.0.0" ... ) :param package_name: Pip package name :type package_name: str - :param pip_version: Pip version constraint, defaults to None - :type pip_version: Optional[str], optional :param registry_url: Pip registry URL, defaults to None :type registry_url: Optional[str], optional :param agent_setup: Setup commands to run after installation, defaults to None @@ -670,8 +662,6 @@ def create_from_pip( ) pip_config: Pip = {"package_name": package_name} - if pip_version is not None: - pip_config["pip_version"] = pip_version if registry_url is not None: pip_config["registry_url"] = registry_url if agent_setup is not None: @@ -696,6 +686,7 @@ def create_from_git( ... repository="https://github.com/user/agent-repo", ... ref="main", ... agent_setup=["npm install", "npm run build"], + ... version="1.0.0", ... ) :param repository: Git repository URL @@ -737,7 +728,10 @@ def create_from_object( >>> obj = runloop.storage_object.upload_from_dir("./my-agent") >>> # Then create agent from the object >>> agent = runloop.agent.create_from_object( - ... name="my-object-agent", object_id=obj.id, agent_setup=["chmod +x setup.sh", "./setup.sh"] + ... name="my-object-agent", + ... object_id=obj.id, + ... agent_setup=["chmod +x setup.sh", "./setup.sh"], + ... version="1.0.0", ... ) :param object_id: Storage object ID diff --git a/tests/sdk/test_async_ops.py b/tests/sdk/test_async_ops.py index f8a16e1c0..5a7cd2a75 100644 --- a/tests/sdk/test_async_ops.py +++ b/tests/sdk/test_async_ops.py @@ -793,6 +793,7 @@ async def test_create(self, mock_async_client: AsyncMock, agent_view: MockAgentV client = AsyncAgentOps(mock_async_client) agent = await client.create( name="test-agent", + version="1.2.3", ) assert isinstance(agent, AsyncAgent) @@ -901,6 +902,7 @@ async def test_create_from_npm(self, mock_async_client: AsyncMock, agent_view: M agent = await client.create_from_npm( name="test-agent", package_name="@runloop/example-agent", + version="1.2.3", ) assert isinstance(agent, AsyncAgent) @@ -913,6 +915,7 @@ async def test_create_from_npm(self, mock_async_client: AsyncMock, agent_view: M }, }, name="test-agent", + version="1.2.3", ) @pytest.mark.asyncio @@ -926,9 +929,9 @@ async def test_create_from_npm_with_all_options( agent = await client.create_from_npm( name="test-agent", package_name="@runloop/example-agent", - npm_version="1.2.3", registry_url="https://registry.example.com", agent_setup=["npm install", "npm run setup"], + version="1.2.3", extra_headers={"X-Custom": "header"}, ) @@ -939,12 +942,12 @@ async def test_create_from_npm_with_all_options( "type": "npm", "npm": { "package_name": "@runloop/example-agent", - "npm_version": "1.2.3", "registry_url": "https://registry.example.com", "agent_setup": ["npm install", "npm run setup"], }, }, name="test-agent", + version="1.2.3", extra_headers={"X-Custom": "header"}, ) @@ -957,6 +960,7 @@ async def test_create_from_npm_raises_when_source_provided(self, mock_async_clie await client.create_from_npm( name="test-agent", package_name="@runloop/example-agent", + version="1.2.3", source={"type": "git", "git": {"repository": "https://github.com/example/repo"}}, ) @@ -969,6 +973,7 @@ async def test_create_from_pip(self, mock_async_client: AsyncMock, agent_view: M agent = await client.create_from_pip( name="test-agent", package_name="runloop-example-agent", + version="1.2.3", ) assert isinstance(agent, AsyncAgent) @@ -981,6 +986,7 @@ async def test_create_from_pip(self, mock_async_client: AsyncMock, agent_view: M }, }, name="test-agent", + version="1.2.3", ) @pytest.mark.asyncio @@ -994,9 +1000,9 @@ async def test_create_from_pip_with_all_options( agent = await client.create_from_pip( name="test-agent", package_name="runloop-example-agent", - pip_version="1.2.3", registry_url="https://pypi.example.com", agent_setup=["pip install extra-deps"], + version="1.2.3", ) assert isinstance(agent, AsyncAgent) @@ -1006,12 +1012,12 @@ async def test_create_from_pip_with_all_options( "type": "pip", "pip": { "package_name": "runloop-example-agent", - "pip_version": "1.2.3", "registry_url": "https://pypi.example.com", "agent_setup": ["pip install extra-deps"], }, }, name="test-agent", + version="1.2.3", ) @pytest.mark.asyncio @@ -1023,6 +1029,7 @@ async def test_create_from_git(self, mock_async_client: AsyncMock, agent_view: M agent = await client.create_from_git( name="test-agent", repository="https://github.com/example/agent-repo", + version="1.2.3", ) assert isinstance(agent, AsyncAgent) @@ -1035,6 +1042,7 @@ async def test_create_from_git(self, mock_async_client: AsyncMock, agent_view: M }, }, name="test-agent", + version="1.2.3", ) @pytest.mark.asyncio @@ -1050,6 +1058,7 @@ async def test_create_from_git_with_all_options( repository="https://github.com/example/agent-repo", ref="develop", agent_setup=["npm install", "npm run build"], + version="1.2.3", ) assert isinstance(agent, AsyncAgent) @@ -1064,6 +1073,7 @@ async def test_create_from_git_with_all_options( }, }, name="test-agent", + version="1.2.3", ) @pytest.mark.asyncio @@ -1075,6 +1085,7 @@ async def test_create_from_object(self, mock_async_client: AsyncMock, agent_view agent = await client.create_from_object( name="test-agent", object_id="obj_123", + version="1.2.3", ) assert isinstance(agent, AsyncAgent) @@ -1087,6 +1098,7 @@ async def test_create_from_object(self, mock_async_client: AsyncMock, agent_view }, }, name="test-agent", + version="1.2.3", ) @pytest.mark.asyncio @@ -1101,6 +1113,7 @@ async def test_create_from_object_with_agent_setup( name="test-agent", object_id="obj_123", agent_setup=["chmod +x setup.sh", "./setup.sh"], + version="1.2.3", ) assert isinstance(agent, AsyncAgent) @@ -1114,6 +1127,7 @@ async def test_create_from_object_with_agent_setup( }, }, name="test-agent", + version="1.2.3", ) diff --git a/tests/sdk/test_ops.py b/tests/sdk/test_ops.py index 7ac503933..e66c7f097 100644 --- a/tests/sdk/test_ops.py +++ b/tests/sdk/test_ops.py @@ -723,6 +723,7 @@ def test_create(self, mock_client: Mock, agent_view: MockAgentView) -> None: client = AgentOps(mock_client) agent = client.create( name="test-agent", + version="1.2.3", ) assert isinstance(agent, Agent) @@ -817,6 +818,7 @@ def test_create_from_npm(self, mock_client: Mock, agent_view: MockAgentView) -> agent = client.create_from_npm( name="test-agent", package_name="@runloop/example-agent", + version="1.2.3", ) assert isinstance(agent, Agent) @@ -829,6 +831,7 @@ def test_create_from_npm(self, mock_client: Mock, agent_view: MockAgentView) -> }, }, name="test-agent", + version="1.2.3", ) def test_create_from_npm_with_all_options(self, mock_client: Mock, agent_view: MockAgentView) -> None: @@ -838,10 +841,10 @@ def test_create_from_npm_with_all_options(self, mock_client: Mock, agent_view: M client = AgentOps(mock_client) agent = client.create_from_npm( package_name="@runloop/example-agent", - npm_version="1.2.3", registry_url="https://registry.example.com", agent_setup=["npm install", "npm run setup"], name="test-agent", + version="1.2.3", extra_headers={"X-Custom": "header"}, ) @@ -852,12 +855,12 @@ def test_create_from_npm_with_all_options(self, mock_client: Mock, agent_view: M "type": "npm", "npm": { "package_name": "@runloop/example-agent", - "npm_version": "1.2.3", "registry_url": "https://registry.example.com", "agent_setup": ["npm install", "npm run setup"], }, }, name="test-agent", + version="1.2.3", extra_headers={"X-Custom": "header"}, ) @@ -869,6 +872,7 @@ def test_create_from_npm_raises_when_source_provided(self, mock_client: Mock) -> client.create_from_npm( package_name="@runloop/example-agent", name="test-agent", + version="1.2.3", source={"type": "git", "git": {"repository": "https://github.com/example/repo"}}, ) @@ -880,6 +884,7 @@ def test_create_from_pip(self, mock_client: Mock, agent_view: MockAgentView) -> agent = client.create_from_pip( package_name="runloop-example-agent", name="test-agent", + version="1.2.3", ) assert isinstance(agent, Agent) @@ -892,6 +897,7 @@ def test_create_from_pip(self, mock_client: Mock, agent_view: MockAgentView) -> }, }, name="test-agent", + version="1.2.3", ) def test_create_from_pip_with_all_options(self, mock_client: Mock, agent_view: MockAgentView) -> None: @@ -901,10 +907,10 @@ def test_create_from_pip_with_all_options(self, mock_client: Mock, agent_view: M client = AgentOps(mock_client) agent = client.create_from_pip( package_name="runloop-example-agent", - pip_version="1.2.3", registry_url="https://pypi.example.com", agent_setup=["pip install extra-deps"], name="test-agent", + version="1.2.3", ) assert isinstance(agent, Agent) @@ -914,12 +920,12 @@ def test_create_from_pip_with_all_options(self, mock_client: Mock, agent_view: M "type": "pip", "pip": { "package_name": "runloop-example-agent", - "pip_version": "1.2.3", "registry_url": "https://pypi.example.com", "agent_setup": ["pip install extra-deps"], }, }, name="test-agent", + version="1.2.3", ) def test_create_from_git(self, mock_client: Mock, agent_view: MockAgentView) -> None: @@ -930,6 +936,7 @@ def test_create_from_git(self, mock_client: Mock, agent_view: MockAgentView) -> agent = client.create_from_git( repository="https://github.com/example/agent-repo", name="test-agent", + version="1.2.3", ) assert isinstance(agent, Agent) @@ -942,6 +949,7 @@ def test_create_from_git(self, mock_client: Mock, agent_view: MockAgentView) -> }, }, name="test-agent", + version="1.2.3", ) def test_create_from_git_with_all_options(self, mock_client: Mock, agent_view: MockAgentView) -> None: @@ -954,6 +962,7 @@ def test_create_from_git_with_all_options(self, mock_client: Mock, agent_view: M ref="develop", agent_setup=["npm install", "npm run build"], name="test-agent", + version="1.2.3", ) assert isinstance(agent, Agent) @@ -968,6 +977,7 @@ def test_create_from_git_with_all_options(self, mock_client: Mock, agent_view: M }, }, name="test-agent", + version="1.2.3", ) def test_create_from_object(self, mock_client: Mock, agent_view: MockAgentView) -> None: @@ -978,6 +988,7 @@ def test_create_from_object(self, mock_client: Mock, agent_view: MockAgentView) agent = client.create_from_object( object_id="obj_123", name="test-agent", + version="1.2.3", ) assert isinstance(agent, Agent) @@ -990,6 +1001,7 @@ def test_create_from_object(self, mock_client: Mock, agent_view: MockAgentView) }, }, name="test-agent", + version="1.2.3", ) def test_create_from_object_with_agent_setup(self, mock_client: Mock, agent_view: MockAgentView) -> None: @@ -1001,6 +1013,7 @@ def test_create_from_object_with_agent_setup(self, mock_client: Mock, agent_view object_id="obj_123", agent_setup=["chmod +x setup.sh", "./setup.sh"], name="test-agent", + version="1.2.3", ) assert isinstance(agent, Agent) @@ -1014,6 +1027,7 @@ def test_create_from_object_with_agent_setup(self, mock_client: Mock, agent_view }, }, name="test-agent", + version="1.2.3", ) diff --git a/tests/smoketests/sdk/test_agent.py b/tests/smoketests/sdk/test_agent.py index deb659087..7ddfb6f70 100644 --- a/tests/smoketests/sdk/test_agent.py +++ b/tests/smoketests/sdk/test_agent.py @@ -12,6 +12,7 @@ THIRTY_SECOND_TIMEOUT = 30 TWO_MINUTE_TIMEOUT = 120 +AGENT_VERSION = "1.2.3" class TestAgentLifecycle: @@ -23,6 +24,7 @@ def test_agent_create_basic(self, sdk_client: RunloopSDK) -> None: name = unique_name("sdk-agent-test-basic") agent = sdk_client.agent.create( name=name, + version=AGENT_VERSION, source={ "type": "npm", "npm": { @@ -52,6 +54,7 @@ def test_agent_get_info(self, sdk_client: RunloopSDK) -> None: name = unique_name("sdk-agent-test-info") agent = sdk_client.agent.create( name=name, + version=AGENT_VERSION, source={ "type": "npm", "npm": { @@ -90,6 +93,7 @@ def test_get_agent_by_id(self, sdk_client: RunloopSDK) -> None: # Create an agent created = sdk_client.agent.create( name=unique_name("sdk-agent-test-retrieve"), + version=AGENT_VERSION, source={ "type": "npm", "npm": { @@ -121,9 +125,15 @@ def test_list_multiple_agents(self, sdk_client: RunloopSDK) -> None: } # Create multiple agents - agent1 = sdk_client.agent.create(name=unique_name("sdk-agent-test-list-1"), source=source_config) - agent2 = sdk_client.agent.create(name=unique_name("sdk-agent-test-list-2"), source=source_config) - agent3 = sdk_client.agent.create(name=unique_name("sdk-agent-test-list-3"), source=source_config) + agent1 = sdk_client.agent.create( + name=unique_name("sdk-agent-test-list-1"), source=source_config, version=AGENT_VERSION + ) + agent2 = sdk_client.agent.create( + name=unique_name("sdk-agent-test-list-2"), source=source_config, version=AGENT_VERSION + ) + agent3 = sdk_client.agent.create( + name=unique_name("sdk-agent-test-list-3"), source=source_config, version=AGENT_VERSION + ) try: # List agents @@ -153,6 +163,7 @@ def test_agent_with_source_npm(self, sdk_client: RunloopSDK) -> None: agent = sdk_client.agent.create( name=name, + version=AGENT_VERSION, source={ "type": "npm", "npm": { @@ -178,6 +189,7 @@ def test_agent_with_source_git(self, sdk_client: RunloopSDK) -> None: agent = sdk_client.agent.create( name=name, + version=AGENT_VERSION, source={ "type": "git", "git": { diff --git a/tests/smoketests/sdk/test_async_agent.py b/tests/smoketests/sdk/test_async_agent.py index fb9d17b42..36129605f 100644 --- a/tests/smoketests/sdk/test_async_agent.py +++ b/tests/smoketests/sdk/test_async_agent.py @@ -12,6 +12,7 @@ THIRTY_SECOND_TIMEOUT = 30 TWO_MINUTE_TIMEOUT = 120 +AGENT_VERSION = "1.2.3" class TestAsyncAgentLifecycle: @@ -23,6 +24,7 @@ async def test_agent_create_basic(self, async_sdk_client: AsyncRunloopSDK) -> No name = unique_name("sdk-async-agent-test-basic") agent = await async_sdk_client.agent.create( name=name, + version=AGENT_VERSION, source={ "type": "npm", "npm": { @@ -52,6 +54,7 @@ async def test_agent_get_info(self, async_sdk_client: AsyncRunloopSDK) -> None: name = unique_name("sdk-async-agent-test-info") agent = await async_sdk_client.agent.create( name=name, + version=AGENT_VERSION, source={ "type": "npm", "npm": { @@ -90,6 +93,7 @@ async def test_get_agent_by_id(self, async_sdk_client: AsyncRunloopSDK) -> None: # Create an agent created = await async_sdk_client.agent.create( name=unique_name("sdk-async-agent-test-retrieve"), + version=AGENT_VERSION, source={ "type": "npm", "npm": { @@ -122,13 +126,13 @@ async def test_list_multiple_agents(self, async_sdk_client: AsyncRunloopSDK) -> # Create multiple agents agent1 = await async_sdk_client.agent.create( - name=unique_name("sdk-async-agent-test-list-1"), source=source_config + name=unique_name("sdk-async-agent-test-list-1"), source=source_config, version=AGENT_VERSION ) agent2 = await async_sdk_client.agent.create( - name=unique_name("sdk-async-agent-test-list-2"), source=source_config + name=unique_name("sdk-async-agent-test-list-2"), source=source_config, version=AGENT_VERSION ) agent3 = await async_sdk_client.agent.create( - name=unique_name("sdk-async-agent-test-list-3"), source=source_config + name=unique_name("sdk-async-agent-test-list-3"), source=source_config, version=AGENT_VERSION ) try: @@ -159,6 +163,7 @@ async def test_agent_with_source_npm(self, async_sdk_client: AsyncRunloopSDK) -> agent = await async_sdk_client.agent.create( name=name, + version=AGENT_VERSION, source={ "type": "npm", "npm": { @@ -184,6 +189,7 @@ async def test_agent_with_source_git(self, async_sdk_client: AsyncRunloopSDK) -> agent = await async_sdk_client.agent.create( name=name, + version=AGENT_VERSION, source={ "type": "git", "git": { diff --git a/tests/smoketests/test_snapshots.py b/tests/smoketests/test_snapshots.py index 71b592320..0fc43ca23 100644 --- a/tests/smoketests/test_snapshots.py +++ b/tests/smoketests/test_snapshots.py @@ -31,7 +31,7 @@ def _cleanup(client: Runloop) -> Iterator[None]: # pyright: ignore[reportUnused _snapshot_id = None -@pytest.mark.timeout(30) +@pytest.mark.timeout(120) def test_snapshot_devbox(client: Runloop) -> None: global _devbox_id, _snapshot_id created = client.devboxes.create_and_await_running(