Skip to content

Commit 6b7c7cb

Browse files
authored
OpenAI SSE demo (#103)
1 parent 4575a5b commit 6b7c7cb

File tree

3 files changed

+403
-22
lines changed

3 files changed

+403
-22
lines changed

demo/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from .db import create_db
1515
from .forms import router as forms_router
1616
from .main import router as main_router
17+
from .sse import router as sse_router
1718
from .tables import router as table_router
1819

1920

@@ -33,6 +34,7 @@ async def lifespan(app_: FastAPI):
3334
app = FastAPI(lifespan=lifespan)
3435

3536
app.include_router(components_router, prefix='/api/components')
37+
app.include_router(sse_router, prefix='/api/components')
3638
app.include_router(table_router, prefix='/api/table')
3739
app.include_router(forms_router, prefix='/api/forms')
3840
app.include_router(auth_router, prefix='/api/auth')

demo/components_list.py

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
from __future__ import annotations as _annotations
22

33
import asyncio
4-
from datetime import datetime
5-
from typing import AsyncIterable
64

75
from fastapi import APIRouter
8-
from fastapi.responses import StreamingResponse
96
from fastui import AnyComponent, FastUI
107
from fastui import components as c
118
from fastui.events import GoToEvent, PageEvent
@@ -144,7 +141,12 @@ class Delivery(BaseModel):
144141
c.Div(
145142
components=[
146143
c.Heading(text='Server Load SSE', level=2),
147-
c.Markdown(text='`ServerLoad` can also be used to load content from an SSE stream.'),
144+
c.Markdown(
145+
text=(
146+
'`ServerLoad` can also be used to load content from an SSE stream.\n\n'
147+
"Here the response is the streamed output from OpenAI's GPT-4 chat model."
148+
)
149+
),
148150
c.Button(text='Load SSE content', on_click=PageEvent(name='server-load-sse')),
149151
c.Div(
150152
components=[
@@ -219,21 +221,3 @@ class Delivery(BaseModel):
219221
async def modal_view() -> list[AnyComponent]:
220222
await asyncio.sleep(0.5)
221223
return [c.Paragraph(text='This is some dynamic content. Open devtools to see me being fetched from the server.')]
222-
223-
224-
async def sse_generator() -> AsyncIterable[str]:
225-
while True:
226-
d = datetime.now()
227-
m = FastUI(
228-
root=[
229-
c.Div(components=[c.Text(text=f'Time {d:%H:%M:%S}')], class_name='font-monospace'),
230-
c.Paragraph(text='This content is updated every second using an SSE stream.'),
231-
]
232-
)
233-
yield f'data: {m.model_dump_json(by_alias=True)}\n\n'
234-
await asyncio.sleep(1)
235-
236-
237-
@router.get('/sse')
238-
async def sse_experiment() -> StreamingResponse:
239-
return StreamingResponse(sse_generator(), media_type='text/event-stream')

0 commit comments

Comments
 (0)