import asyncio
import time
from upsonic import Agent, Task
from upsonic.tools import tool
from upsonic.db.database import SqliteDatabase
from upsonic.run.base import RunStatus
from upsonic.run.cancel import cancel_run
@tool
def long_running_task(seconds: int) -> str:
"""A task that takes time to complete."""
time.sleep(seconds)
return f"Completed after {seconds} seconds"
async def cancel_and_resume_new_agent():
db = SqliteDatabase(db_file="cancel.db", session_id="session_1", user_id="user_1")
agent = Agent("openai/gpt-4o-mini", db=db)
task = Task(
description="Call long_running_task with 10 seconds.",
tools=[long_running_task]
)
async def cancel_after_delay():
await asyncio.sleep(2)
if agent.run_id:
cancel_run(agent.run_id)
asyncio.create_task(cancel_after_delay())
output = await agent.do_async(task, return_output=True)
run_id = output.run_id
if output.status == RunStatus.cancelled:
# Create NEW agent instance to resume
new_db = SqliteDatabase(db_file="cancel.db", session_id="session_1", user_id="user_1")
new_agent = Agent("openai/gpt-4o-mini", db=new_db)
result = await new_agent.continue_run_async(run_id=run_id, return_output=True)
return result
return output
asyncio.run(cancel_and_resume_new_agent())