<@ULVA73B9P> If inside flow A I called flow B: ```...
# ask-marvin
t
@Marvin If inside flow A I called flow B:
Copy code
@flow
def A(): 
    ...
    ret = B()
would B be treated like a subflow?
m
thought for 297.1 seconds
Yes. In Prefect 3.x, calling one flow from inside another (e.g.,
ret = B()
inside
A
) creates a subflow run. What that means: - Execution: Runs in-process with the parent flow, synchronously.
A
will wait for
B()
to finish and
ret
is the return value of
B
. - UI/lineage: You’ll see a nested “subflow” under the parent flow run in the Prefect UI (the child run has the parent’s run ID). - Errors: Unhandled exceptions in
B
propagate to
A
and can fail the parent run. - Parameters: Pass arguments to
B
like a normal Python function; Prefect records them for the subflow run. If you want
B
to run as an independent flow run (e.g., on different infrastructure or not nested in the UI), deploy
B
and trigger it via
run_deployment
. By default,
run_deployment(..., as_subflow=True)
will still nest under the caller; set
as_subflow=False
to decouple. Example:
Copy code
from prefect import flow
from prefect.deployments.flow_runs import run_deployment

@flow
def B(x: int = 1) -> int:
    return x + 1

@flow
def A():
    # Subflow (in-process, nested in UI)
    r1 = B(2)

    # Separate deployment run (still nested by default)
    child = run_deployment(
        name="B/my-deployment",
        parameters={"x": 3},
        as_subflow=True,  # set to False to make it a top-level run
    )
    return r1
Docs: - Running deployments (includes
as_subflow
): Run deployments - Creating deployments: Create deployments