1
1
from functools import wraps
2
+ import inspect
2
3
from agents .run import set_default_agent_runner
3
4
from azure .durable_functions .models .DurableOrchestrationContext import DurableOrchestrationContext
4
5
from durable_openai_runner import DurableOpenAIRunner
@@ -15,13 +16,47 @@ def wrapper(durable_orchestration_context: DurableOrchestrationContext):
15
16
durable_openai_runner = DurableOpenAIRunner (context = durable_ai_agent_context )
16
17
set_default_agent_runner (durable_openai_runner )
17
18
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 ()
26
61
27
62
return wrapper
0 commit comments