symfonic.agent.recursion_exhausted¶
recursion_exhausted ¶
The one exception the migrated run raises that legacy also raised.
An exhausted round budget is the only failure whose type an adopter's code
already keys on: the legacy body lets LangGraph's GraphRecursionError
propagate out of SymfonicAgent.run, so except GraphRecursionError is
documented, working adopter code today. A cutover that swapped it for a
SymfonicAgentError would keep "parity of kind" — both still fail loudly —
while breaking the observable the except clause actually reads, and the
turn would sail past the handler into the caller's top-level catch.
So the migrated path raises a type that is both. The ancestry is a widening,
never a rename: except GraphRecursionError catches exactly what it caught
before the flip, except SymfonicAgentError (and except SymfonicError)
catch it too, and the message says which budget ran out.
The native response projection raises it for the compatibility HTTP routes;
:mod:symfonic.agent.cutover.errors re-exports the same class.
RecursionExhaustedError ¶
Bases: GraphRecursionError, SymfonicAgentError
The invocation used every model round its budget allows.
Inherits from both hierarchies on purpose — see the module docstring. The
LangGraph base comes first so GraphRecursionError's own args
handling wins, and SymfonicAgentError.__init__ still supplies the
optional code.