Skip to content

Backend portability: Synchronous execution has no parameter-binding contract #590

Description

@emmanuelmathot

Gap 3 — Synchronous execution has no parameter-binding contract

The /result request body schema includes process_graph_with_metadata, which allows declaring parameters alongside process_graph. The Defining Processes section specifies the resolution rule:

In case a parameter value is not available, the most unspecific default value from the process graph parameter definitions are used.

In practice:

  1. At least one backend (Copernicus Data Space) rejects graphs that contain unresolved {"from_parameter": "<name>"} references at POST /result, even when the parameter has a default declared in the same request body.
  2. The openEO Python client's Connection.download() / Connection.execute() do not forward the parameters array at all — see _build_request_with_process_graph() in the client source. So even if a backend tried to honour default-based resolution, the client strips the declaration first.

The net effect is that a graph that is valid as a UDP cannot be executed synchronously for a preview — the same graph has to be materialised into a parameter-free copy before POST /result. We shipped a client-side walker that substitutes {"from_parameter": name} with the declared default before download ([link to our implementation omitted]). That's a workable workaround but it duplicates logic the spec already describes for UDP resolution.

Suggested direction. Clarify in the /result section of the spec:

  • Whether backends MUST resolve {"from_parameter": ...} nodes using declared defaults when no value is provided (the current language can be read either way).
  • Whether backends MAY accept a runtime-value-binding mechanism at /result (e.g. a "parameter_values": {"bounding_box": {...}} sibling of "process_graph") to let the same graph run with different inputs without re-uploading it. This would close the gap with /services and UDP invocation.

If either behaviour is already intended, a one-line clarification plus a conformance test would be enough. If it's deliberately out of scope for synchronous execution, saying so explicitly would save the next person from building what we just built.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions