Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "1.16.0"
".": "1.17.0"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 109
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-b0d4f639559e78ee64d536a35464cff1ef1928e92c2a32a0384dc887da662ef3.yml
openapi_spec_hash: a822f02fec32ae89e2bc6a6f95b8845f
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-a1c7e69cbbf7a7cf63893358470cee52714633e6d31ce6dff2e7255c7445a1aa.yml
openapi_spec_hash: a0e88c05a9b74c2bc9192bd7d94de3c0
config_hash: ecb1ff09d29b565ed1452b5e0362e64d
27 changes: 27 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,32 @@
# Changelog

## 1.17.0 (2026-04-09)

Full Changelog: [v1.16.0...v1.17.0](https://github.com/runloopai/api-client-python/compare/v1.16.0...v1.17.0)

### Features

* Add protocol, launch etc arguments to attach axon grpc, persist them in the db ([#8564](https://github.com/runloopai/api-client-python/issues/8564)) ([76ad33d](https://github.com/runloopai/api-client-python/commit/76ad33d7da11f4324b576f4b03a5eab437eecd2f))
* **api:** add lifecycle configuration to launch parameters ([#8606](https://github.com/runloopai/api-client-python/issues/8606)) ([1dd716d](https://github.com/runloopai/api-client-python/commit/1dd716d820546f3d088ad61a714a0d5c219124f4))
* stream kernel messages (kmsg) to devbox logs ([#8588](https://github.com/runloopai/api-client-python/issues/8588)) ([8f0ad67](https://github.com/runloopai/api-client-python/commit/8f0ad674d85e44b02aa0d708fe2037dbce6d5fca))


### Bug Fixes

* **broker:** remove codex in favor of codex via acp ([#8602](https://github.com/runloopai/api-client-python/issues/8602)) ([118162e](https://github.com/runloopai/api-client-python/commit/118162e3b64d531c5e2b66f66d47724b01fefb1c))
* **client:** preserve hardcoded query params when merging with user params ([5ce9b5d](https://github.com/runloopai/api-client-python/commit/5ce9b5d4cb882a93b802275622471086530146f0))
* propagate git ref to maverick for git-based agents ([#8608](https://github.com/runloopai/api-client-python/issues/8608)) ([fc633d6](https://github.com/runloopai/api-client-python/commit/fc633d64b89ac81aa00cdf5f3528b7b9a2e61627))


### Chores

* Cleanup remaining junk left over from browser and computer use ([#8553](https://github.com/runloopai/api-client-python/issues/8553)) ([ddccee2](https://github.com/runloopai/api-client-python/commit/ddccee245aaea07df9d7b6a9b307cb9cd77878cb))


### Documentation

* fix typo, fix repoc/git-based agent mounts ignoring custom mount paths ([#8537](https://github.com/runloopai/api-client-python/issues/8537)) ([638bc7a](https://github.com/runloopai/api-client-python/commit/638bc7ac64b07b686d5ddbb6756ac9fabd42dc32))

## 1.16.0 (2026-04-03)

Full Changelog: [v1.15.0...v1.16.0](https://github.com/runloopai/api-client-python/compare/v1.15.0...v1.16.0)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "runloop_api_client"
version = "1.16.0"
version = "1.17.0"
description = "The official Python library for the runloop API"
dynamic = ["readme"]
license = "MIT"
Expand Down
4 changes: 4 additions & 0 deletions src/runloop_api_client/_base_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -540,6 +540,10 @@ def _build_request(
files = cast(HttpxRequestFiles, ForceMultipartDict())

prepared_url = self._prepare_url(options.url)
# preserve hard-coded query params from the url
if params and prepared_url.query:
params = {**dict(prepared_url.params.items()), **params}
prepared_url = prepared_url.copy_with(raw_path=prepared_url.raw_path.split(b"?", 1)[0])
if "_" in prepared_url.host:
# work around https://github.com/encode/httpx/discussions/2880
kwargs["extensions"] = {"sni_hostname": prepared_url.host.replace("_", "-")}
Expand Down
2 changes: 1 addition & 1 deletion src/runloop_api_client/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "runloop_api_client"
__version__ = "1.16.0" # x-release-please-version
__version__ = "1.17.0" # x-release-please-version
8 changes: 6 additions & 2 deletions src/runloop_api_client/resources/devboxes/devboxes.py
Original file line number Diff line number Diff line change
Expand Up @@ -761,7 +761,9 @@ def enable_tunnel(
policies, resetting the idle timer. Defaults to true if not specified.

wake_on_http: When true, HTTP traffic to a suspended devbox will automatically trigger a
resume. Defaults to false if not specified.
resume. Defaults to false if not specified. Prefer
lifecycle.resume_triggers.http on launch_parameters for new integrations. If
both are set, lifecycle.resume_triggers.http takes precedence.

extra_headers: Send extra headers

Expand Down Expand Up @@ -2394,7 +2396,9 @@ async def enable_tunnel(
policies, resetting the idle timer. Defaults to true if not specified.

wake_on_http: When true, HTTP traffic to a suspended devbox will automatically trigger a
resume. Defaults to false if not specified.
resume. Defaults to false if not specified. Prefer
lifecycle.resume_triggers.http on launch_parameters for new integrations. If
both are set, lifecycle.resume_triggers.http takes precedence.

extra_headers: Send extra headers

Expand Down
4 changes: 1 addition & 3 deletions src/runloop_api_client/types/blueprint_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,7 @@ class BlueprintView(BaseModel):
Services can be explicitly started when creating a Devbox.
"""

devbox_capabilities: Optional[List[Literal["unknown", "computer_usage", "browser_usage", "docker_in_docker"]]] = (
None
)
devbox_capabilities: Optional[List[Literal["unknown", "docker_in_docker"]]] = None
"""Capabilities that will be available on Devbox."""

failure_reason: Optional[Literal["out_of_memory", "out_of_disk", "build_failed"]] = None
Expand Down
4 changes: 3 additions & 1 deletion src/runloop_api_client/types/devbox_create_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,5 +153,7 @@ class Tunnel(TypedDict, total=False):
wake_on_http: Optional[bool]
"""
When true, HTTP traffic to a suspended devbox will automatically trigger a
resume. Defaults to false if not specified.
resume. Defaults to false if not specified. Prefer
lifecycle.resume_triggers.http on launch_parameters for new integrations. If
both are set, lifecycle.resume_triggers.http takes precedence.
"""
4 changes: 3 additions & 1 deletion src/runloop_api_client/types/devbox_enable_tunnel_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,7 @@ class DevboxEnableTunnelParams(TypedDict, total=False):
wake_on_http: Optional[bool]
"""
When true, HTTP traffic to a suspended devbox will automatically trigger a
resume. Defaults to false if not specified.
resume. Defaults to false if not specified. Prefer
lifecycle.resume_triggers.http on launch_parameters for new integrations. If
both are set, lifecycle.resume_triggers.http takes precedence.
"""
8 changes: 2 additions & 6 deletions src/runloop_api_client/types/devbox_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,8 @@ class DevboxView(BaseModel):
id: str
"""The ID of the Devbox."""

capabilities: List[Literal["unknown", "computer_usage", "browser_usage", "docker_in_docker"]]
"""A list of capability groups this devbox has access to.

This allows devboxes to be compatible with certain tools sets like computer
usage APIs.
"""
capabilities: List[Literal["unknown", "docker_in_docker"]]
"""A list of capability groups this devbox has access to."""

create_time_ms: int
"""Creation time of the Devbox (Unix timestamp milliseconds)."""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Log(BaseModel):
level: str
"""Log line severity level."""

source: Literal["setup_commands", "entrypoint", "exec", "files", "stats"]
source: Literal["setup_commands", "entrypoint", "exec", "files", "stats", "kmsg"]
"""The source of the log."""

timestamp_ms: int
Expand Down
12 changes: 9 additions & 3 deletions src/runloop_api_client/types/shared/broker_mount.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,16 @@ class BrokerMount(BaseModel):
type: Literal["broker_mount"]

agent_binary: Optional[str] = None
"""Binary to launch the agent (e.g., 'opencode'). Used by ACP broker."""
"""Binary to launch the agent (e.g., 'opencode').

Used by protocols that launch a subprocess (acp, claude_json).
"""

launch_args: Optional[List[str]] = None
"""Arguments to pass to the agent command (e.g., ['acp']). Used by ACP broker."""
"""Arguments to pass to the agent command (e.g., ['acp']).

Used by protocols that launch a subprocess (acp, claude_json).
"""

protocol: Optional[Literal["acp", "claude_json", "codex_app_server"]] = None
protocol: Optional[Literal["acp", "claude_json"]] = None
"""The protocol used by the broker to deliver events to the agent."""
8 changes: 7 additions & 1 deletion src/runloop_api_client/types/shared/code_mount_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class CodeMountParameters(BaseModel):
repo_name: str
"""The name of the repo to mount.

By default, code will be mounted at /home/user/{repo_name}s.
By default, code will be mounted at /home/user/{repo_name}.
"""

repo_owner: str
Expand All @@ -20,5 +20,11 @@ class CodeMountParameters(BaseModel):
token: Optional[str] = None
"""The authentication token necessary to pull repo."""

git_ref: Optional[str] = None
"""Optional git ref (branch, tag, or commit SHA) to checkout.

Defaults to the repository default branch.
"""

install_command: Optional[str] = None
"""Installation command to install and setup repository."""
38 changes: 36 additions & 2 deletions src/runloop_api_client/types/shared/launch_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,31 @@
from ..._models import BaseModel
from .after_idle import AfterIdle

__all__ = ["LaunchParameters", "UserParameters"]
__all__ = ["LaunchParameters", "Lifecycle", "LifecycleResumeTriggers", "UserParameters"]


class LifecycleResumeTriggers(BaseModel):
"""Triggers that can resume a suspended Devbox."""

http: Optional[bool] = None
"""When true, HTTP traffic to a suspended Devbox via tunnel will trigger a resume."""


class Lifecycle(BaseModel):
"""Lifecycle configuration for idle and resume behavior.

Configure idle policy via lifecycle.after_idle (if both this and the top-level after_idle are set, they must match) and resume triggers via lifecycle.resume_triggers.
"""

after_idle: Optional[AfterIdle] = None
"""Configure Devbox lifecycle based on idle activity.

If both this and the top-level after_idle are set, they must have the same
value. Prefer this field for new integrations.
"""

resume_triggers: Optional[LifecycleResumeTriggers] = None
"""Triggers that can resume a suspended Devbox."""


class UserParameters(BaseModel):
Expand All @@ -30,7 +54,9 @@ class LaunchParameters(BaseModel):
after_idle: Optional[AfterIdle] = None
"""Configure Devbox lifecycle based on idle activity.

If after_idle is set, Devbox will ignore keep_alive_time_seconds.
If after_idle is set, Devbox will ignore keep_alive_time_seconds. If both
after_idle and lifecycle.after_idle are set, they must have the same value. Use
lifecycle.after_idle instead.
"""

architecture: Optional[Literal["x86_64", "arm64"]] = None
Expand Down Expand Up @@ -60,6 +86,14 @@ class LaunchParameters(BaseModel):
launch_commands: Optional[List[str]] = None
"""Set of commands to be run at launch time, before the entrypoint process is run."""

lifecycle: Optional[Lifecycle] = None
"""Lifecycle configuration for idle and resume behavior.

Configure idle policy via lifecycle.after_idle (if both this and the top-level
after_idle are set, they must match) and resume triggers via
lifecycle.resume_triggers.
"""

network_policy_id: Optional[str] = None
"""
(Optional) ID of the network policy to apply to Devboxes launched with these
Expand Down
8 changes: 7 additions & 1 deletion src/runloop_api_client/types/shared/mount.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class CodeMount(BaseModel):
repo_name: str
"""The name of the repo to mount.

By default, code will be mounted at /home/user/{repo_name}s.
By default, code will be mounted at /home/user/{repo_name}.
"""

repo_owner: str
Expand All @@ -27,6 +27,12 @@ class CodeMount(BaseModel):
token: Optional[str] = None
"""The authentication token necessary to pull repo."""

git_ref: Optional[str] = None
"""Optional git ref (branch, tag, or commit SHA) to checkout.

Defaults to the repository default branch.
"""

install_command: Optional[str] = None
"""Installation command to install and setup repository."""

Expand Down
12 changes: 9 additions & 3 deletions src/runloop_api_client/types/shared_params/broker_mount.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,16 @@ class BrokerMount(TypedDict, total=False):
type: Required[Literal["broker_mount"]]

agent_binary: Optional[str]
"""Binary to launch the agent (e.g., 'opencode'). Used by ACP broker."""
"""Binary to launch the agent (e.g., 'opencode').

Used by protocols that launch a subprocess (acp, claude_json).
"""

launch_args: Optional[SequenceNotStr[str]]
"""Arguments to pass to the agent command (e.g., ['acp']). Used by ACP broker."""
"""Arguments to pass to the agent command (e.g., ['acp']).

Used by protocols that launch a subprocess (acp, claude_json).
"""

protocol: Optional[Literal["acp", "claude_json", "codex_app_server"]]
protocol: Optional[Literal["acp", "claude_json"]]
"""The protocol used by the broker to deliver events to the agent."""
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class CodeMountParameters(TypedDict, total=False):
repo_name: Required[str]
"""The name of the repo to mount.

By default, code will be mounted at /home/user/{repo_name}s.
By default, code will be mounted at /home/user/{repo_name}.
"""

repo_owner: Required[str]
Expand All @@ -21,5 +21,11 @@ class CodeMountParameters(TypedDict, total=False):
token: Optional[str]
"""The authentication token necessary to pull repo."""

git_ref: Optional[str]
"""Optional git ref (branch, tag, or commit SHA) to checkout.

Defaults to the repository default branch.
"""

install_command: Optional[str]
"""Installation command to install and setup repository."""
38 changes: 36 additions & 2 deletions src/runloop_api_client/types/shared_params/launch_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,31 @@
from ..._types import SequenceNotStr
from .after_idle import AfterIdle

__all__ = ["LaunchParameters", "UserParameters"]
__all__ = ["LaunchParameters", "Lifecycle", "LifecycleResumeTriggers", "UserParameters"]


class LifecycleResumeTriggers(TypedDict, total=False):
"""Triggers that can resume a suspended Devbox."""

http: Optional[bool]
"""When true, HTTP traffic to a suspended Devbox via tunnel will trigger a resume."""


class Lifecycle(TypedDict, total=False):
"""Lifecycle configuration for idle and resume behavior.

Configure idle policy via lifecycle.after_idle (if both this and the top-level after_idle are set, they must match) and resume triggers via lifecycle.resume_triggers.
"""

after_idle: Optional[AfterIdle]
"""Configure Devbox lifecycle based on idle activity.

If both this and the top-level after_idle are set, they must have the same
value. Prefer this field for new integrations.
"""

resume_triggers: Optional[LifecycleResumeTriggers]
"""Triggers that can resume a suspended Devbox."""


class UserParameters(TypedDict, total=False):
Expand All @@ -32,7 +56,9 @@ class LaunchParameters(TypedDict, total=False):
after_idle: Optional[AfterIdle]
"""Configure Devbox lifecycle based on idle activity.

If after_idle is set, Devbox will ignore keep_alive_time_seconds.
If after_idle is set, Devbox will ignore keep_alive_time_seconds. If both
after_idle and lifecycle.after_idle are set, they must have the same value. Use
lifecycle.after_idle instead.
"""

architecture: Optional[Literal["x86_64", "arm64"]]
Expand Down Expand Up @@ -62,6 +88,14 @@ class LaunchParameters(TypedDict, total=False):
launch_commands: Optional[SequenceNotStr[str]]
"""Set of commands to be run at launch time, before the entrypoint process is run."""

lifecycle: Optional[Lifecycle]
"""Lifecycle configuration for idle and resume behavior.

Configure idle policy via lifecycle.after_idle (if both this and the top-level
after_idle are set, they must match) and resume triggers via
lifecycle.resume_triggers.
"""

network_policy_id: Optional[str]
"""
(Optional) ID of the network policy to apply to Devboxes launched with these
Expand Down
8 changes: 7 additions & 1 deletion src/runloop_api_client/types/shared_params/mount.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class CodeMount(TypedDict, total=False):
repo_name: Required[str]
"""The name of the repo to mount.

By default, code will be mounted at /home/user/{repo_name}s.
By default, code will be mounted at /home/user/{repo_name}.
"""

repo_owner: Required[str]
Expand All @@ -27,6 +27,12 @@ class CodeMount(TypedDict, total=False):
token: Optional[str]
"""The authentication token necessary to pull repo."""

git_ref: Optional[str]
"""Optional git ref (branch, tag, or commit SHA) to checkout.

Defaults to the repository default branch.
"""

install_command: Optional[str]
"""Installation command to install and setup repository."""

Expand Down
Loading
Loading