75 lines
1.1 KiB
Python
75 lines
1.1 KiB
Python
# mypy: ignore-errors
|
|
# ruff: noqa
|
|
import asyncio
|
|
import pickle
|
|
from types import coroutine
|
|
|
|
from livekit import durable
|
|
|
|
|
|
@coroutine
|
|
@durable.durable
|
|
def yields(n):
|
|
return (yield n)
|
|
|
|
|
|
class EffectCall:
|
|
def __init__(self, external_coro) -> None:
|
|
self._c = external_coro
|
|
|
|
def __await__(self):
|
|
return yields(self)
|
|
|
|
def __reduce_ex__(self, protocol):
|
|
return (type(self), (None,))
|
|
|
|
def __repr__(self) -> None:
|
|
return "EffectCall"
|
|
|
|
|
|
async def my_network_call() -> None:
|
|
# some request here
|
|
pass
|
|
|
|
|
|
@durable.durable
|
|
async def my_function_tool() -> None:
|
|
result = await EffectCall(my_network_call)
|
|
|
|
await EffectCall(asyncio.sleep(5))
|
|
await MyAgentTask()
|
|
|
|
|
|
g = my_function_tool().__await__()
|
|
|
|
pickle.dumps(g)
|
|
|
|
my_effect = next(g)
|
|
print(my_effect)
|
|
assert isinstance(my_effect, EffectCall)
|
|
|
|
pickle.dumps(g)
|
|
|
|
|
|
import pickle
|
|
|
|
from livekit import durable
|
|
|
|
|
|
@durable.durable
|
|
def my_generator():
|
|
for i in range(3):
|
|
yield i
|
|
|
|
|
|
g = my_generator()
|
|
print(next(g)) # 0
|
|
|
|
b = pickle.dumps(g)
|
|
g2 = pickle.loads(b)
|
|
print(next(g2)) # 1
|
|
print(next(g2)) # 2
|
|
|
|
print(next(g)) # 1
|
|
print(next(g)) # 2
|