Conversation
LawlAoux
force-pushed
the
CORE-45-inline-eager-async-node-execution
branch
from
August 12, 2026 13:18
bb3c2ca to
05a6a9b
Compare
Async-region nodes were each wrapped in asyncio.create_task -- ~24k tasks per turn on large bots, none of which start executing until the whole topological loop finishes (the first await is the final gather). Now a node whose dependencies are already available resolves them inline and runs with no task at all; a node blocked on a genuinely pending dependency falls back to the task path, created with eager_start=True (Python 3.14) so it runs at creation and suspends only on real I/O -- network calls fire mid-traversal. Input-option priority, pruning, and exception semantics are unchanged: node_to_input_inline mirrors node_to_input_async, returning _PENDING to route to the task path. get_deps_and_await is dead in the new model and removed. bon_secours_voice (45,540 nodes): CG framework overhead per turn 493-504ms -> 364ms (-26%); tasks/turn 24,183 -> ~100 when nothing truly suspends; network-free turn walls -9..-12%. Bot responses byte-identical across the old and new runners. Rebased onto sync-chain fusion (#85). The two compose: the suite passes with COMPUTATION_GRAPH_SYNC_FUSION both on and off, and a battery of graph shapes (skips, handled and unhandled exceptions, priority fallback, reconvergence through async, genuinely suspending nodes) yields identical results under master-unfused, master-fused, inline-unfused and inline-fused. One fusion test had to change: its unfused branch asserted that each chain node gets its own Task, which is exactly what inline execution removes, so both tests now discriminate on the dedicated chain Task versus the ambient one.
LawlAoux
force-pushed
the
CORE-45-inline-eager-async-node-execution
branch
from
September 22, 2026 15:52
05a6a9b to
0fe81b3
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
asyncio.create_task(~24k tasks/turn on large voice bots, none of which start executing until the topological loop ends); a node blocked on a genuinely pending dependency falls back to a task created with Python 3.14'seager_start=True, so it runs at creation and network calls fire mid-traversal.node_to_input_inlinemirrorsnode_to_input_async, returning_PENDINGto route to the task path.get_deps_and_awaitis dead in the new model and removed.Rebase onto master 78 (22 Sep)
run.pymerged cleanly; version 79,uv.lockre-locked.gc.collect(0)drops from 12–37ms to under 1ms on connect/greet turns and to ~3ms on embed turns, since 24k fewer Task objects are created per turn. Bot responses byte-identical on all three bots, zero errors.Jira
https://hyro-ai.atlassian.net/browse/CORE-45