1 changed files with 47 additions and 0 deletions
@ -0,0 +1,47 @@ |
|||
""" |
|||
Streaming inference example using StreamingResponse. |
|||
|
|||
This pattern is useful for long-running workloads such as machine learning |
|||
or large language model inference, where returning partial results improves |
|||
latency and user experience. |
|||
""" |
|||
|
|||
import time |
|||
from typing import Generator |
|||
|
|||
from fastapi import FastAPI |
|||
from fastapi.responses import StreamingResponse |
|||
|
|||
app = FastAPI() |
|||
|
|||
|
|||
def fake_model_inference(prompt: str) -> Generator[str, None, None]: |
|||
""" |
|||
Simulates token-by-token inference. |
|||
|
|||
In a real application, this could wrap a machine learning model that |
|||
yields partial outputs as they are generated. |
|||
""" |
|||
try: |
|||
for i in range(10): |
|||
# Simulate computation time (e.g. model forward pass) |
|||
time.sleep(0.2) |
|||
yield f"token_{i} for prompt='{prompt}'\n" |
|||
except GeneratorExit: |
|||
# This is triggered when the client disconnects early. |
|||
# Cleanup logic for model inference can be placed here. |
|||
print("Client disconnected, stopping inference") |
|||
|
|||
|
|||
@app.get("/stream") |
|||
def stream(prompt: str) -> StreamingResponse: |
|||
""" |
|||
Stream inference results incrementally to the client. |
|||
|
|||
This endpoint returns partial results as they become available instead |
|||
of waiting for the full inference to complete, making the user experience better. |
|||
""" |
|||
return StreamingResponse( |
|||
fake_model_inference(prompt), |
|||
media_type="text/plain", |
|||
) |
|||
Loading…
Reference in new issue