1313from askui .utils .api_utils import ListQuery , ListResponse
1414
1515from .dependencies import RunServiceDep
16- from .models import Run
16+ from .models import Run , ThreadAndRunCreateParams
1717from .service import RunService
1818
19- router = APIRouter (prefix = "/threads/{thread_id}/runs" , tags = ["runs" ])
19+ router = APIRouter (tags = ["runs" ])
2020
2121
22- @router .post ("" )
22+ @router .post ("/threads/{thread_id}/runs " )
2323async def create_run (
2424 thread_id : Annotated [ThreadId , Path (...)],
2525 params : RunCreateParams ,
@@ -53,7 +53,40 @@ async def _run_async_generator() -> None:
5353 return JSONResponse (status_code = status .HTTP_201_CREATED , content = run .model_dump ())
5454
5555
56- @router .get ("/{run_id}" )
56+ @router .post ("/runs" )
57+ async def create_thread_and_run (
58+ params : ThreadAndRunCreateParams ,
59+ background_tasks : BackgroundTasks ,
60+ thread_facade : ThreadFacade = ThreadFacadeDep ,
61+ ) -> Response :
62+ stream = params .stream
63+ run , async_generator = await thread_facade .create_thread_and_run (params )
64+ if stream :
65+
66+ async def sse_event_stream () -> AsyncGenerator [str , None ]:
67+ async for event in async_generator :
68+ data = (
69+ event .data .model_dump_json ()
70+ if isinstance (event .data , BaseModel )
71+ else event .data
72+ )
73+ yield f"event: { event .event } \n data: { data } \n \n "
74+
75+ return StreamingResponse (
76+ status_code = status .HTTP_201_CREATED ,
77+ content = sse_event_stream (),
78+ media_type = "text/event-stream" ,
79+ )
80+
81+ async def _run_async_generator () -> None :
82+ async for _ in async_generator :
83+ pass
84+
85+ background_tasks .add_task (_run_async_generator )
86+ return JSONResponse (status_code = status .HTTP_201_CREATED , content = run .model_dump ())
87+
88+
89+ @router .get ("/threads/{thread_id}/runs/{run_id}" )
5790def retrieve_run (
5891 thread_id : Annotated [ThreadId , Path (...)],
5992 run_id : Annotated [RunId , Path (...)],
@@ -62,7 +95,7 @@ def retrieve_run(
6295 return run_service .retrieve (thread_id , run_id )
6396
6497
65- @router .get ("" )
98+ @router .get ("/threads/{thread_id}/runs " )
6699def list_runs (
67100 thread_id : Annotated [ThreadId , Path (...)],
68101 query : ListQuery = ListQueryDep ,
@@ -71,7 +104,7 @@ def list_runs(
71104 return thread_facade .list_runs (thread_id , query = query )
72105
73106
74- @router .post ("/{run_id}/cancel" )
107+ @router .post ("/threads/{thread_id}/runs/ {run_id}/cancel" )
75108def cancel_run (
76109 thread_id : Annotated [ThreadId , Path (...)],
77110 run_id : Annotated [RunId , Path (...)],
0 commit comments