Invocation timing

AreaInvokeTiming 意味
immediate この tick の直後にモデル呼び出しを要求します。
deferrable 他の Area が進行する間、モデル呼び出しの延期を許可します。

Area は自身の状態変化に合わせて invocation timing を変更できます。

immediate:前提となるタスクを完了する

A は、作業を続ける前にタスク E を完了する必要があると判断します。E は immediate を使って、そのタスクに取り組みます。

retain かつ deferrable の Area A、B、C、D を配置します。

from hydrangea.context.coop_context import AreaLane, AreaLayout, CoopContext


coop_context = CoopContext(context)
layout = AreaLayout([
    area_a,
    AreaLane(area_b, area_c),
    area_d,
])
coop_context.compose(layout)

overlay 前の tick() の順序は、area_a -> area_b -> area_c -> area_d です。

A が前提となるタスクの必要性を判断したら、unfold() の呼び出しの間に area_e を A の lane に overlay します。E は retain 状態で、invoke_timing は AreaInvokeTiming.immediate です。

handle = coop_context.fetch_handle(area_a)
assert handle is not None

coop_context.overlay(area_e, handle)

overlay 後、次のモデル呼び出しまでに tick するのは area_e だけです。E が retain かつ immediate の間はこれが続き、A が再び tick する前に E がタスクを完了できるようにします。

E は完了すると retire し、tick() の順序は area_a -> area_b -> area_c -> area_d に戻ります。回収後も結果を Context に残すため、E は promote() からその結果を返す必要があります。

deferrable:受信した情報を提供する

E はポートでメッセージを受信し、Context に渡します。tick() は受信済みのメッセージを返し、何も届いていなければ None を返します。deferrable を使うことで、E の情報と A の出力を同じモデル呼び出しに含められます。

retain かつ deferrable の Area A、B、C、D を配置します。

from hydrangea.context.coop_context import AreaLane, AreaLayout, CoopContext


coop_context = CoopContext(context)
layout = AreaLayout([
    area_a,
    AreaLane(area_b, area_c),
    area_d,
])
coop_context.compose(layout)

overlay 前の tick() の順序は、area_a -> area_b -> area_c -> area_d です。

unfold() の呼び出しの間に、area_e を A の lane に overlay します。E は retain 状態で、invoke_timing は AreaInvokeTiming.deferrable です。

handle = coop_context.fetch_handle(area_a)
assert handle is not None

coop_context.overlay(area_e, handle)

overlay 後の tick() の順序は、area_e -> area_a -> area_b -> area_c -> area_d です。

このターンでは、E のメッセージが A の出力より先に Context に追加されます。そのため、LLM は同じ呼び出しの中で E の情報を利用して A の出力を処理できます。