11from functools import wraps
2+ import inspect
23from agents .run import set_default_agent_runner
34from azure .durable_functions .models .DurableOrchestrationContext import DurableOrchestrationContext
45from durable_openai_runner import DurableOpenAIRunner
@@ -15,13 +16,47 @@ def wrapper(durable_orchestration_context: DurableOrchestrationContext):
1516 durable_openai_runner = DurableOpenAIRunner (context = durable_ai_agent_context )
1617 set_default_agent_runner (durable_openai_runner )
1718
18- try :
19- result = func (durable_ai_agent_context )
20- return result
21- except YieldException as e :
22- yield from durable_ai_agent_context .yield_and_clear_tasks ()
23- yield e .task
24- finally :
25- yield from durable_ai_agent_context .yield_and_clear_tasks ()
19+ if inspect .isgeneratorfunction (func ):
20+ gen = iter (func (durable_ai_agent_context ))
21+ try :
22+ # prime the subiterator
23+ value = next (gen )
24+ yield from durable_ai_agent_context .yield_and_clear_tasks ()
25+ while True :
26+ try :
27+ # send whatever was sent into us down to the subgenerator
28+ sent = yield value
29+ except GeneratorExit :
30+ # ensure the subgenerator is closed
31+ if hasattr (gen , "close" ):
32+ gen .close ()
33+ raise
34+ except BaseException as exc :
35+ # forward thrown exceptions if possible
36+ if hasattr (gen , "throw" ):
37+ value = gen .throw (type (exc ), exc , exc .__traceback__ )
38+ else :
39+ raise
40+ else :
41+ # normal path: forward .send (or .__next__)
42+ if hasattr (gen , "send" ):
43+ value = gen .send (sent )
44+ else :
45+ value = next (gen )
46+ except StopIteration as e :
47+ yield from durable_ai_agent_context .yield_and_clear_tasks ()
48+ return e .value
49+ except YieldException as e :
50+ yield from durable_ai_agent_context .yield_and_clear_tasks ()
51+ yield e .task
52+ else :
53+ try :
54+ result = func (durable_ai_agent_context )
55+ return result
56+ except YieldException as e :
57+ yield from durable_ai_agent_context .yield_and_clear_tasks ()
58+ yield e .task
59+ finally :
60+ yield from durable_ai_agent_context .yield_and_clear_tasks ()
2661
2762 return wrapper
0 commit comments