| title | API Reference |
|---|---|
| sidebar_position | 10 |
The core public surface of the Python SDK. Constructor options and environment variables are on Configuration; exceptions on Error Handling.
| Method | Signature | Returns | Description |
|---|---|---|---|
attach |
async def attach(self, uri: Optional[str] = None, *, timeout: Optional[float] = None) -> None |
- | Opens the WebSocket without authenticating. If uri is provided and differs from the current URI, detaches first; if already attached to the same URI, this is a no-op. |
detach |
async def detach(self) -> None |
- | Closes the transport and leaves the client detached. |
is_attached |
def is_attached(self) -> bool |
bool |
Whether the WebSocket transport is open, regardless of authentication. |
login |
async def login(self, credential: Optional[str] = None, *, uri: Optional[str] = None, timeout: Optional[float] = None) -> ConnectResult |
ConnectResult |
Authenticates over an attached transport (attaching first if needed). A differing uri detaches and re-attaches; a differing credential logs out (best-effort) before logging in; logging in again with the same credential is a no-op. |
logout |
async def logout(self) -> None |
- | Deauthenticates (sends deauth) and clears client auth state while keeping the attachment. |
is_authenticated |
def is_authenticated(self) -> bool |
bool |
Whether the auth handshake has succeeded on the current connection. |
connect |
async def connect(self, credential: Optional[str] = None, *, timeout: Optional[float] = None) -> ConnectResult |
ConnectResult |
Opens the WebSocket and performs DAP auth. Optional credential overrides the constructor auth for this connection attempt. Optional timeout (ms) bounds the connect + auth handshake (non-persist only). In persist mode, on failure the client calls on_connect_error and retries; on auth failure it does not retry. |
disconnect |
async def disconnect(self) -> None |
- | Closes the connection and cancels reconnection. |
is_connected |
def is_connected(self) -> bool |
bool |
Backward-compatible alias for is_attached() — True when the WebSocket is open; does not imply authentication. |
get_connection_info |
def get_connection_info(self) -> dict |
dict |
Returns { 'connected': bool, 'transport': str, 'uri': str }. |
get_apikey |
def get_apikey(self) -> Optional[str] |
str | None |
The API key in use. For debugging only; avoid logging in production. |
set_env |
def set_env(self, env: Dict[str, str]) -> None |
- | Replaces the client's environment map, used for ${ROCKETRIDE_*} substitution and credential lookup. |
Context manager: async with RocketRideClient(...) as client: — entering calls
connect(), exiting calls disconnect().
| Method | Signature | Returns | Description |
|---|---|---|---|
use |
async def use(self, *, token: str = None, filepath: str = None, pipeline: PipelineConfig = None, source: str = None, threads: int = None, use_existing: bool = None, args: List[str] = None, ttl: int = None, pipelineTraceLevel: str = None, name: str = None, env: Dict[str, str] = None) -> dict |
dict |
Starts a pipeline. Requires filepath or pipeline. pipelineTraceLevel sets run-log trace verbosity, name a task display name, env per-run variable overrides. Returns a dict with at least 'token', plus 'reused': True when use_existing handed back an already-running instance instead of starting this pipeline. |
terminate |
async def terminate(self, token: str) -> None |
- | Stops the pipeline and frees server resources. |
get_task_status |
async def get_task_status(self, token: str) -> dict |
dict |
Current task status (completedCount, totalCount, completed, state, exitCode, …). |
| Method | Signature | Returns | Description |
|---|---|---|---|
pipe |
async def pipe(self, token: str, objinfo: dict = None, mime_type: str = None, provider: str = None, on_sse=None) -> DataPipe |
DataPipe |
Creates a streaming pipe: open, then one or more writes, then close. Default MIME: 'application/octet-stream'. on_sse receives server-sent events. |
send |
async def send(self, token: str, data: str | bytes, objinfo: dict = None, mimetype: str = None, on_sse=None) -> PIPELINE_RESULT |
PIPELINE_RESULT |
Sends data in one shot (open, write once, close). No MIME auto-detection — default is 'application/octet-stream'. |
send_files |
async def send_files(self, files: List[str | Tuple[str, dict] | Tuple[str, dict, str]], token: str) -> List[UPLOAD_RESULT] |
List[UPLOAD_RESULT] |
Uploads files concurrently (unbounded asyncio.gather). Requires an API key (RuntimeError without one); a missing file raises ValueError. Progress via on_event as apaevt_status_upload. |
| Method | Signature | Returns | Description |
|---|---|---|---|
add_monitor |
async def add_monitor(self, key: Dict[str, Any], types: List[str]) -> None |
- | Adds a reference-counted monitor subscription; events are delivered to on_event. Key: {'token': ...} or {'project_id': ..., 'source': ...} (+ optional 'pipe_id', 'team_id'). |
remove_monitor |
async def remove_monitor(self, key: Dict[str, Any], types: List[str]) -> None |
- | Removes a monitor subscription; a type unsubscribes from the server only when its reference count reaches zero. |
set_events |
async def set_events(self, token: str, event_types: List[str], pipe_id: int = None) -> None |
- | Deprecated — use add_monitor/remove_monitor. Subscribes the task to the given event types. |
| Method | Signature | Returns | Description |
|---|---|---|---|
get_services |
async def get_services(self) -> dict |
dict |
Lightweight summaries of every service, plus a deduplicated icons table and the server version. Full definitions come from get_service. |
get_service |
async def get_service(self, service: str) -> dict |
dict |
One service's full definition (config schema included). Raises ValueError (empty name) or RuntimeError (unknown service); never returns None. |
validate |
async def validate(self, pipeline: PipelineConfig, *, source: str = None) -> dict |
dict |
Validates a pipeline configuration without starting it; returns errors and warnings. |
ping |
async def ping(self) -> None |
- | Liveness check; raises on failure. (A legacy token argument is accepted but not sent.) |
| Method | Signature | Returns | Description |
|---|---|---|---|
chat |
async def chat(self, *, token: str, question: Question, on_sse=None) -> PIPELINE_RESULT |
PIPELINE_RESULT |
Sends the Question to the pipeline and returns the result. on_sse streams server-sent events (e.g. token-by-token output). See Chat. |
Paths are relative to the store root; absolute-like paths are rejected. See File Storage for the workflow.
| Method | Signature | Returns | Description |
|---|---|---|---|
fs_open |
async def fs_open(self, path: str, mode: str = 'r') -> dict |
dict |
Open a handle. Returns {'handle': str}; read mode also includes 'size' (int). |
fs_read |
async def fs_read(self, handle: str, offset: int = 0, length: int = 4_194_304) -> bytes |
bytes |
Read up to length bytes (default 4 MB) from offset. Empty bytes = EOF. |
fs_write |
async def fs_write(self, handle: str, data: bytes) -> int |
int |
Write raw bytes to a write handle. Returns the number of bytes written. |
fs_close |
async def fs_close(self, handle: str, mode: str = 'r') -> None |
- | Close a handle. mode must match the mode passed to fs_open. |
fs_read_string |
async def fs_read_string(self, path: str, encoding: str = 'utf-8') -> str |
str |
Read an entire file as a decoded string. |
fs_write_string |
async def fs_write_string(self, path: str, text: str, encoding: str = 'utf-8') -> None |
- | Write a string to a file (overwrites). |
fs_read_json |
async def fs_read_json(self, path: str) -> Any |
Any |
Read and parse a JSON file. |
fs_write_json |
async def fs_write_json(self, path: str, obj: Any) -> None |
- | Serialize an object to JSON and write it. |
fs_list_dir |
async def fs_list_dir(self, path: str = '') -> dict |
dict |
List immediate children: {entries: [{name, type, size?, modified?}], count}. |
fs_stat |
async def fs_stat(self, path: str) -> dict |
dict |
Metadata: {exists, type, size, modified} (size/modified for files only). |
fs_mkdir |
async def fs_mkdir(self, path: str) -> None |
- | Create a directory. |
fs_rmdir |
async def fs_rmdir(self, path: str, *, recursive: bool = False) -> None |
- | Remove a directory. recursive=True deletes contents. |
fs_rename |
async def fs_rename(self, old_path: str, new_path: str) -> None |
- | Rename or move a file/directory (copy+delete on object stores; recursive for directories). |
fs_delete |
async def fs_delete(self, path: str) -> None |
- | Delete a file. |
fs_get_url |
async def fs_get_url(self, path: str, expires_in: int = 3600, download_name: str = None) -> str |
str |
Time-limited HTTP(S) URL for direct browser access; inline by default, download_name forces Content-Disposition: attachment. |
fs_read_many |
async def fs_read_many(self, paths: List[str]) -> List[Dict[str, Any]] |
List[Dict] |
Batch-read many small files in one round trip (max 256 paths / 32 MiB total). Per-entry failures (ok: False + error), request order, data as bytes. |
Raw SQL through a pipeline database node (requires allow_execute: true on the
node). The TypeScript SDK additionally offers a Drizzle ORM driver over this
surface (rocketride/drizzle), plus a deprecated Sequelize binding.
| Method | Signature | Description |
|---|---|---|
database.query |
async def query(*, token, sql, node_id='', session_id='', params=None) -> dict |
Execute raw SQL or Cypher through the pipeline's execute tool function; params is a positional list for SQL nodes, or a dict keyed by placeholder name for the rocketride_graph node (graph_neo4j / graph_falkordb reject params); returns {rows, affected_rows}. |
database.begin_transaction |
async def begin_transaction(*, token, node_id='') -> dict |
Open a transaction (begin tool function); returns {session_id}. |
database.commit |
async def commit(*, token, session_id, node_id='') -> dict |
Commit the open transaction. |
database.rollback |
async def rollback(*, token, session_id, node_id='') -> dict |
Roll back the open transaction. |
database.dialect |
async def dialect(*, token, node_id='') -> DatabaseDialect |
The target node's SQL dialect. |
See Deployments for the model.
| Method | Signature | Returns |
|---|---|---|
deploy.add |
async def add(self, pipeline=None, *, kind='pipe', data=None, metadata=None, comment=None, deploy_to=None) -> PublishResult |
PublishResult |
deploy.add_app |
async def add_app(self, app_root, *, workspace_root=None, comment=None, metadata=None, on_progress=None) -> PublishResult |
PublishResult |
deploy.create_app |
async def create_app(self, slug, *, workspace_root=None, template='Blank', display_name=None, developer_id=None, sidebar=False, status_footer=True, doc_tabs=False, install=True, server_base_url=None, on_progress=None) -> dict |
{appId, folder, files, vendored, installed} |
deploy.verify_app |
async def verify_app(self, app_root, *, workspace_root=None) -> AppVerifyReport |
AppVerifyReport |
deploy.deploy |
async def deploy(self, project_id, version, team_id) -> Deployment |
Deployment |
deploy.list |
async def list(self, *, team_id=None, page=None, page_size=None, search=None, filters=None, sort=None) -> DeployListResult |
DeployListResult |
deploy.get |
async def get(self, project_id, team_id) -> Deployment |
Deployment |
deploy.versions |
async def versions(self, project_id, *, page=None, ...) -> DeployVersionsResult |
DeployVersionsResult |
deploy.history |
async def history(self, project_id, *, team_id=None, page=None, ...) -> DeployHistoryResult |
DeployHistoryResult |
deploy.disable |
async def disable(self, project_id, team_id) -> Deployment |
Deployment |
deploy.enable |
async def enable(self, project_id, team_id) -> Deployment |
Deployment |
deploy.remove |
async def remove(self, project_id, team_id) -> Deployment |
Deployment |
deploy.set_schedule |
async def set_schedule(self, project_id, source_id, schedule, team_id, *, ttl=None) -> Deployment |
Deployment |
deploy.pause_schedule |
async def pause_schedule(self, project_id, source_id, team_id) -> Deployment |
Deployment |
deploy.resume_schedule |
async def resume_schedule(self, project_id, source_id, team_id) -> Deployment |
Deployment |
deploy.set_source_config |
async def set_source_config(self, project_id, source_id, team_id, ...) -> Deployment |
Deployment |
deploy.run |
async def run(self, project_id, source_id, team_id) -> dict |
{token, version} |
deploy.artifact |
async def artifact(self, project_id, version) -> PipelineConfig |
PipelineConfig |
deploy.preview |
async def preview(self, schedule, count=None) -> SchedulePreview |
SchedulePreview |
See Deployments for the model.
The deploy.-prefixed verbs below (add, add_app, create_app, verify_app)
live on client.deploy; the unprefixed verbs are methods on the client itself
(client.publish_app(...)).
| Method | Signature | Description |
|---|---|---|
deploy.add |
async def add(self, pipeline=None, *, kind='pipe', data=None, metadata=None, comment=None, deploy_to=None) -> PublishResult |
The ONE rail door (on the client.deploy namespace): deploy any kind of object as the next immutable registry version. kind='pipe' (default) takes a pipeline dict; kind='app' takes ONE data zip of the app's SOURCE (the server performs the build; client-produced binaries are never trusted), retained and unpacked at receipt, born deployment-state private. The app id must be inside your developer namespace. |
deploy.add_app |
async def add_app(self, app_root, *, workspace_root=None, comment=None, metadata=None, on_progress=None) -> PublishResult |
Pack an app folder's source and deploy it as the next registry version — the one call behind the App Builder's Deploy button and CI scripts. Packs by the App Builder rules (workspace-rooted zip, appManifest.include, hierarchical gitignore + the hard node_modules/dist/.git baseline, symlink containment, 50MB zipped / 512MB uncompressed caps); on_progress narrates one line per step. Deploying activates nothing — bind an audience with publish_app afterwards. |
deploy.create_app |
async def create_app(self, slug, *, workspace_root=None, template='Blank', display_name=None, developer_id=None, sidebar=False, status_footer=True, doc_tabs=False, install=True, server_base_url=None, on_progress=None) -> dict |
Scaffold a new app in the workspace — the programmatic twin of the App Builder's New App wizard, rendering the identical templates. Writes ./apps/<slug>, vendors the connected server's shell + client packages, and runs the workspace install. The id becomes <developerId>.<slug>. Scaffolding only — the lifecycle (verify_app → add_app → publish_app) follows. Returns the TypeScript CreatedApp keys (appId, folder, files, vendored, installed). |
deploy.verify_app |
async def verify_app(self, app_root, *, workspace_root=None) -> AppVerifyReport |
The no-side-effect precheck for add_app — purely local, no server call: manifest shape and id grammar, declared icon/README assets, appManifest.include entries, and a pack dry run against the size caps. Server-side concerns (the build, store review) are out of scope. |
list_deployments |
async def list_deployments(self, app_id) -> list[dict] |
The version rail, newest first — the developer org sees its FULL rail (published or not), other callers only their visible versions. Each entry (registryVersion, appVersion, sha256, publishedAt, author, message, state, buildStatus, buildPhase, buildEndedAt, rungs) carries its deployment state, its build lifecycle (buildStatus — 'ok' = servable — plus the buildPhase it reached and buildEndedAt, which is always present: epoch seconds, or None until the build ends), and the rungs naming the audiences bound to it. No error text rides the rail: read it with build_log. |
submit_app |
async def submit_app(self, app_id, registry_version) -> dict |
Submit a deployed version for review — flips the deployment private → submit. |
withdraw_app |
async def withdraw_app(self, app_id, registry_version) -> dict |
Withdraw a pending review — the developer's own cancel: flips the deployment submit → private, the version leaves the admin queue and history records withdrawn. Only a version in submit withdraws. Developer-org + namespace gated, like submit. |
reply_app |
async def reply_app(self, app_id, message, registry_version=None) -> dict |
Append a developer message to the app's review thread — rides deployment_history as a reply row (side 'developer'), the same stream deploy.history() reads. Developer-org + namespace gated, like submit. |
build_log |
async def build_log(self, app_id, registry_version) -> dict |
One version's durable server build log — the full phase-by-phase output stored beside the version's artifacts (no error text rides the rail rows). Long logs serve their tail; empty log = none. Developer-org gated. |
publish_app |
async def publish_app(self, app_id, registry_version, target) -> dict |
Bind a deployment to '@me', '@team/', or '@public' ('@user' = legacy input alias). The binding is a pure pointer born 'enabled'. '@public' requires the deployment be ready; '@me'/'@team' accept any non-failed deployment. Pinning ANOTHER org's public app to '@me'/'@team' is the version selector; publishing your own app requires the id to be in your namespace. |
remove_app_publish |
async def remove_app_publish(self, app_id, target) -> dict |
Remove an audience binding — the app stops serving to that audience and the row leaves the where-live listing. SOFT: registry versions and audit history survive; publishing to the audience again revives it. Returns the final publish binding row (state removed). |
disable_app_publish |
async def disable_app_publish(self, app_id, target) -> dict |
Disable an audience binding — serving stops, but the row STAYS in the where-live listing marked disabled (a visible off switch), unlike remove_app_publish. Publishing any version to that audience re-enables it. Returns the publish binding row (state disabled). |
where_app |
async def where_app(self, app_id) -> list[dict] |
The reverse index: {rung, handle, version, appVersion, state, deployedAt} per audience — state is the bound deployment's review state. |
Serving needs no verb: a version's bundle loads from the stable
/apps/<app_id>/v<N>/remoteEntry.js URL constructed from its registry
version number, with entitlement enforced by the serve route on every
request (registry ints ONLY — semver is display).
Two raw DAP commands carry this surface (call via
client.call("<command>", {"subcommand": ...})):
rrext_deploy_app— the developer-account + review verbs (claiming a developerId is a deploy PREREQUISITE, not a marketplace action): thedeveloper_*family,submit, andregister_dev.rrext_app— the pure marketplace: browse (list/get/list_mine), install (desktop_add/desktop_remove), admin review (admin_*), and pricing (pricing_*).
Grouped families (the developer_*/submit/register_dev rows are on
rrext_deploy_app; the rest on rrext_app):
| Subcommand family | Subcommands | Guard | Purpose |
|---|---|---|---|
| developer_* | developer_register · developer_stripe · developer_dashboard · developer_status |
org.admin (register) | Claim the org's developer id slug + Stripe Connect onboarding. |
| submit | submit |
developer org + namespace | Submit a deployed version for review — flips the DEPLOYMENT private → submit. |
| register_dev | register_dev |
self | Per-user live dev overlay (App Builder hot-reload); OSS-capable. |
| catalog | list · get · list_mine · desktop_add · desktop_remove |
authenticated | Browse reachable apps, the developer's own rail view, and desktop membership. |
| admin_* | admin_queue · admin_approve · admin_reject · admin_reply · admin_reseed |
sys.admin | Store review over the DEPLOYMENTS: the queue is deployments in submit; admin_approve(appId, version) → ready, admin_reject(appId, version) → rejected. |
| pricing_* | pricing_list · pricing_create · pricing_delete |
developer org | Manage Stripe price tiers for a monetized app. |
Review model. The review state lives on the DEPLOYMENT. Going public is a
three-step flow: submit (deployment → submit, enters the admin queue) →
admin_approve (→ ready) → publish_app @public (point the public binding at
the ready version). A reject flips the deployment rejected; the developer
fixes and deploys a NEW version. @me/@team bindings need no approval.
See Run Logs for the continuum model and the DVR session.
Returned by await client.pipe(...). One streaming upload: open → write (one or
more) → close. Also an async context manager: entering calls open(), exiting
calls close().
| Property | Type | Description |
|---|---|---|
is_opened |
bool |
Whether the pipe is open. |
pipe_id |
int | None |
Server-assigned pipe ID after open(). |
| Method | Signature | Returns | Description |
|---|---|---|---|
open |
async def open(self) -> DataPipe |
self |
Opens the pipe; required before write(). |
write |
async def write(self, buffer: bytes) -> None |
- | Writes a chunk. Pipe must be open; payload must be bytes. |
close |
async def close(self) -> PIPELINE_RESULT |
PIPELINE_RESULT |
Closes the pipe and returns the processing result. |
tool |
async def tool(self, *, tool: str, node_id: str = '', input: dict = None) -> Any |
Any |
Invokes a pipeline tool function through the pipe. |
open() retries once automatically if it hits a transient "Connect call
failed" while the pipeline's data listener is still starting up (worst case
adds ~1.75s); a PipeException from open() means it kept failing past that
retry budget.
From rocketride.schema. Build a question for
client.chat(token=..., question=question).
Question(
type: QuestionType = QuestionType.QUESTION,
filter: DocFilter = None,
expectJson: bool = False,
cachePrefix: bool = False,
role: str = '',
)QuestionType: QUESTION, SEMANTIC, KEYWORD, GET, PROMPT.
| Method | Signature | Description |
|---|---|---|
addInstruction |
addInstruction(self, title: str, instruction: str) |
Adds an instruction (e.g. "Use bullet points"). |
addExample |
addExample(self, given: str, result: dict | list | str) |
Adds an example input/output; result can be dict/list (JSON-serialized). |
addContext |
addContext(self, context: str | dict | List[str] | List[dict]) |
Adds context. |
addHistory |
addHistory(self, item: QuestionHistory) |
Adds a history item for multi-turn chat. |
addQuestion |
addQuestion(self, question: str) |
Appends the question text. |
addDocuments |
addDocuments(self, documents: Doc | List[Doc]) |
Adds documents for the AI to reference. |
addGoal |
addGoal(self, goal: str) |
Adds a goal statement for the AI. |
getPrompt |
getPrompt(self, has_previous_json_failed: bool = False) -> str |
Returns the full prompt (internal). |
cachePrefix |
field, default False |
Set to True when the question will be sent again with only its context, documents, goals or questions changed (an agent loop). A provider with prompt caching (the Anthropic node, and Claude models on the Bedrock node) may then cache the unchanging start of the prompt: role, instructions, examples and history. Other providers ignore it. |
From rocketride.schema. Parses chat response content — see
Chat for semantics.
| Member | Signature | Description |
|---|---|---|
setAnswer |
setAnswer(self, value: str | dict | list) |
Stores the response value, validating/parsing it as JSON when expectJson is True. |
getText |
getText(self) -> str |
The answer as plain text. |
getJson |
getJson(self) -> Optional[dict] |
The parsed JSON. Returns None only when no answer has been set; raises ValueError on invalid JSON. |
isJson |
isJson(self) -> bool |
Returns the expectJson flag (does not inspect content). |
parsePython |
parsePython(self, value: str) -> Any |
Extracts Python code from a code block in the response. |
tokens |
field | Turn-total LLM token usage reported by the server. The TypeScript Answer carries no usage field. |
- PIPELINE_RESULT: TypedDict with
name,path,objectId, optionalresult_types, and dynamic fields. - UPLOAD_RESULT: Per-file result with
action,filepath,error?,result?,upload_time?, etc. - TASK_STATUS: Task status with
completedCount,totalCount,completed,state,exitCode, and many more fields. - ConnectResult: Identity payload returned by
connect()/login()—userToken,userId,displayName, organizations, apps, teams (all optional). - DAPMessage: Dict with
type,seq, and optionalcommand,arguments,body,success,message,event,token, etc. - PipelineConfig: Pipeline definition with
name,description,version,components,source,project_id. - QuestionHistory:
{ 'role': str, 'content': str }. - QuestionExample:
{ 'given': str, 'result': str }. - QuestionType / QuestionText: question kind enum and text wrapper from
rocketride.schema. - Deploy types:
DeployArtifact,Deployment,DeploymentSchedule,DeployActor,DeployHistoryEntry,PublishResult,DeployListResult,DeployVersionsResult,DeployHistoryResult,SchedulePreview,AppVerifyReport,AppVerifyCheck(fromrocketride.types).
Further public methods, present in both SDKs, in brief:
| Area | Methods |
|---|---|
| Generic invoke | call(command, ...) — any DAP command; tool(...) — invoke a pipeline tool function |
| Task helpers | get_task_token, get_task_pipeline, restart |
| Identity | get_account_info; static get_server_info, normalize_uri |
| Monitors | clear_all_monitors, identify (plus add_monitor/remove_monitor above) |
| Template storage | save_template, get_template, delete_template, get_all_templates |
| Log storage | save_log, get_log, delete_log, list_logs |
| Dashboard | get_dashboard, list_connections, list_tasks |
| Profiling | cprofile_start, cprofile_stop, cprofile_status, cprofile_report, cprofile_report_tree, cprofile_threads |
| Namespaces | client.account, client.billing (account and billing APIs) |
For commands not covered by the typed surface.
| Method | Signature | Returns | Description |
|---|---|---|---|
build_request |
def build_request(self, command: str, *, token: str = None, arguments: dict = None, data: bytes | str = None) -> dict |
dict |
Builds a DAP request message. |
request |
async def request(self, request: dict, timeout: float = None) -> dict |
dict |
Sends the request and returns the response. timeout in ms overrides the default for this call. Use did_fail(response) before trusting body. |
dap_request |
async def dap_request(self, command: str, arguments: dict = None, token: str = None, timeout: float = None) -> dict |
dict |
Shorthand: builds and sends in one call. Python-only — in TypeScript, compose buildRequest() + request(). |
did_fail |
def did_fail(self, request: dict) -> bool |
bool |
True when the response indicates failure (success === False). |
# Two-step (build then request)
req = client.build_request('rrext_monitor', token=token, arguments={'types': ['apaevt_status_upload']})
res = await client.request(req, timeout=5000)
# One-step with dap_request
res = await client.dap_request('rrext_services', {}, timeout=5000)
if client.did_fail(res):
raise RuntimeError(res.get('message', 'Request failed'))