Skip to main content

Runlayer Hooks Python SDK

Python SDK companion to @runlayer/hooks-sdk.

Configure

export RUNLAYER_BASE_URL="https://your-runlayer-instance.com"
export RUNLAYER_API_KEY="rl_..."

For cloud installations that authenticate with a shared organization API key (rl_org_...), also name the Runlayer user the deployment runs as so sessions and enforcement are attributed to it:

export RUNLAYER_API_KEY="rl_org_..."
export RUNLAYER_USER_EMAIL="svc-my-agent@your-company.com"

The identity can be a service user provisioned just for the deployment; events sent before that user exists in the workspace are buffered and replayed once it does. The organization key must carry the AI Watch scan role. user_email is also available as a RunlayerClient constructor option; it applies only to API key auth (agent accounts express the acting user via subject_token).

Agent account auth is also supported:

export RUNLAYER_BASE_URL="https://your-runlayer-instance.com"
export RUNLAYER_AGENT_CLIENT_ID="client_..."
export RUNLAYER_AGENT_CLIENT_SECRET="..."

Optional OBO subject fields:

export RUNLAYER_AGENT_SUBJECT_TOKEN="user@example.com"
export RUNLAYER_AGENT_SUBJECT_TOKEN_TYPE="urn:runlayer:token-type:user-email"

Optional runtime controls:

Variable Purpose
RUNLAYER_HOOK_TIMEOUT_MS Hook request timeout. Defaults to 10000.
RUNLAYER_HOOK_MAX_TOOL_OUTPUT_BYTES Maximum serialized tool output sent to Runlayer. Defaults to 65536.
RUNLAYER_HOOK_ENFORCEMENT_FAILURE_MODE Defaults to closed; set to open only if tool calls should continue when Runlayer is unreachable.
RUNLAYER_ALLOW_INSECURE_TRANSPORT=1 Allow non-HTTPS RUNLAYER_BASE_URL for local development.

Usage

from runlayer_sdk import RunlayerClient

runlayer = RunlayerClient.from_env(client_version="my-agent/1.0.0")


def run_local_tool(tool_input: dict[str, object]) -> str:
    return "tool output"


output = runlayer.run_tool(
    execute=run_local_tool,
    session_id="session-id",
    tool_input={"command": "cat README.md"},
    tool_name="Bash",
    tool_type="shell",
)

Use tool_enforcement to skip Runlayer-owned MCP tools or proxy URLs:

runlayer = RunlayerClient.from_env(
    tool_enforcement={
        "ignored_mcp_server_names": ["github-preview"],
        "skip_runlayer_mcp_proxy_urls": True,
    }
)

RunlayerClient exposes:

  • emit_event
  • before_tool
  • after_tool
  • run_tool
  • should_enforce_tool

The package also exports send_runlayer_preflight.

Troubleshooting: sessions not appearing

Lifecycle hooks send events best-effort and do not raise on their own. If the server accepts an event but does not record it, it responds with status: "ignored" and a reason. The client logs a one-time warning to stderr for the actionable reasons so a misconfiguration is not silent:

  • client_not_enabled — the SDK session-monitoring client is off for this workspace. Enable the client (and any required SDK toggle) in Runlayer settings. This is a separate switch from tool enforcement, so both must be on to get full session + tool telemetry.
  • actor_unresolved — the request authenticated but Runlayer could not map it to a user/agent. With an organization API key, set RUNLAYER_USER_EMAIL (or the user_email client option) to the Runlayer user the deployment runs as; events are buffered until that user exists in the workspace. Otherwise use a personal API key (RUNLAYER_API_KEY) or agent-account credentials (RUNLAYER_AGENT_CLIENT_ID / RUNLAYER_AGENT_CLIENT_SECRET).

Set RUNLAYER_HOOK_DEBUG=1 to also log transient ignore reasons and network failures. Run send_runlayer_preflight() for an explicit check.

Framework tool adapters

Dependency-free adapters wrap common tool dictionary shapes:

  • with_runlayer_vercel_ai_tool
  • with_runlayer_vercel_ai_tools
  • with_runlayer_openai_agents_tool
  • with_runlayer_google_adk_tool
  • run_runlayer_adapter_tool

Claude Agent SDK hooks

Use the adapter helpers when a Python agent runtime wants the same Claude Agent SDK hook output shapes as the Hooks TypeScript SDK:

from runlayer_sdk import RunlayerClient, create_claude_agent_sdk_hooks

runlayer = RunlayerClient.from_env()
hooks = create_claude_agent_sdk_hooks(runlayer, include_stop=False)

The adapter exports:

  • create_claude_agent_sdk_hooks
  • emit_claude_agent_sdk_transcript_stop
  • claude_agent_sdk_assistant_message_to_transcript_line
  • tool_type_from_name

TypeScript-style camelCase aliases are also available for SDK parity.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

runlayer_hooks_sdk-0.2.0.tar.gz (42.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

runlayer_hooks_sdk-0.2.0-py3-none-any.whl (26.6 kB view details)

Uploaded Python 3

File details

Details for the file runlayer_hooks_sdk-0.2.0.tar.gz.

File metadata

  • Download URL: runlayer_hooks_sdk-0.2.0.tar.gz
  • Upload date:
  • Size: 42.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for runlayer_hooks_sdk-0.2.0.tar.gz
Algorithm Hash digest
SHA256 e0c872f83aad191afbf9696723664ab29e76847017ee88bd2f20bcfa8119be82
MD5 297d77d18e6870f91bdc5d6d941b3333
BLAKE2b-256 187f766bb56b9b7d4bd804f24630e89ef2aae1e9aec14cd5abd3fc86fa079a4e

See more details on using hashes here.

File details

Details for the file runlayer_hooks_sdk-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: runlayer_hooks_sdk-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 26.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for runlayer_hooks_sdk-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5d93c6ff01d06182c78e5350ec85b2c918bbe0284d4e7e9237f8b391947e9de3
MD5 add94ef652ac94036c9fa3682f253a08
BLAKE2b-256 dfa6895616ce569273a3a179437636457851c7f033b44b7b447589d0cb557fec

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page