Skip to content

Commit beaf4b4

Browse files
committed
add timeout for streaming
1 parent c24e60a commit beaf4b4

File tree

5 files changed

+37
-8
lines changed

5 files changed

+37
-8
lines changed

helpers/env-variables.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,12 @@ const getEngineEnvs = (): EnvVar[] => {
276276
"The number of similar embeddings to return when retrieving documents.",
277277
value: "3",
278278
},
279+
{
280+
name: "STREAM_TIMEOUT",
281+
description:
282+
"The time in milliseconds to wait for the stream to return a response.",
283+
value: "60000",
284+
},
279285
];
280286
};
281287

templates/types/streaming/express/src/controllers/chat.controller.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ import {
77
LlamaIndexStream,
88
convertMessageContent,
99
} from "./llamaindex-stream";
10-
import { createCallbackManager } from "./stream-helper";
10+
import { createCallbackManager, createStreamTimeout } from "./stream-helper";
1111

1212
export const chat = async (req: Request, res: Response) => {
13+
// Init Vercel AI StreamData and timeout
14+
const vercelStreamData = new StreamData();
15+
const streamTimeout = createStreamTimeout(vercelStreamData);
1316
try {
1417
const {
1518
messages,
@@ -28,9 +31,6 @@ export const chat = async (req: Request, res: Response) => {
2831
// Convert message content from Vercel/AI format to LlamaIndex/OpenAI format
2932
const userMessageContent = convertMessageContent(userMessage.content, data);
3033

31-
// Init Vercel AI StreamData
32-
const vercelStreamData = new StreamData();
33-
3434
// Setup callbacks
3535
const callbackManager = createCallbackManager(vercelStreamData);
3636

@@ -57,5 +57,7 @@ export const chat = async (req: Request, res: Response) => {
5757
return res.status(500).json({
5858
detail: (error as Error).message,
5959
});
60+
} finally {
61+
clearTimeout(streamTimeout);
6062
}
6163
};

templates/types/streaming/express/src/controllers/stream-helper.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,15 @@ export function appendToolData(
7575
});
7676
}
7777

78+
export function createStreamTimeout(stream: StreamData) {
79+
const timeout = Number(process.env.STREAM_TIMEOUT ?? 1000 * 60 * 5); // default to 5 minutes
80+
const t = setTimeout(() => {
81+
appendEventData(stream, `Stream timed out after ${timeout / 1000} seconds`);
82+
stream.close();
83+
}, timeout);
84+
return t;
85+
}
86+
7887
export function createCallbackManager(stream: StreamData) {
7988
const callbackManager = new CallbackManager();
8089

templates/types/streaming/nextjs/app/api/chat/route.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
LlamaIndexStream,
1010
convertMessageContent,
1111
} from "./llamaindex-stream";
12-
import { createCallbackManager } from "./stream-helper";
12+
import { createCallbackManager, createStreamTimeout } from "./stream-helper";
1313

1414
initObservability();
1515
initSettings();
@@ -18,6 +18,10 @@ export const runtime = "nodejs";
1818
export const dynamic = "force-dynamic";
1919

2020
export async function POST(request: NextRequest) {
21+
// Init Vercel AI StreamData and timeout
22+
const vercelStreamData = new StreamData();
23+
const streamTimeout = createStreamTimeout(vercelStreamData);
24+
2125
try {
2226
const body = await request.json();
2327
const {
@@ -40,9 +44,6 @@ export async function POST(request: NextRequest) {
4044
// Convert message content from Vercel/AI format to LlamaIndex/OpenAI format
4145
const userMessageContent = convertMessageContent(userMessage.content, data);
4246

43-
// Init Vercel AI StreamData
44-
const vercelStreamData = new StreamData();
45-
4647
// Setup callbacks
4748
const callbackManager = createCallbackManager(vercelStreamData);
4849

@@ -75,5 +76,7 @@ export async function POST(request: NextRequest) {
7576
status: 500,
7677
},
7778
);
79+
} finally {
80+
clearTimeout(streamTimeout);
7881
}
7982
}

templates/types/streaming/nextjs/app/api/chat/stream-helper.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,15 @@ export function appendToolData(
7575
});
7676
}
7777

78+
export function createStreamTimeout(stream: StreamData) {
79+
const timeout = Number(process.env.STREAM_TIMEOUT ?? 1000 * 60 * 5); // default to 5 minutes
80+
const t = setTimeout(() => {
81+
appendEventData(stream, `Stream timed out after ${timeout / 1000} seconds`);
82+
stream.close();
83+
}, timeout);
84+
return t;
85+
}
86+
7887
export function createCallbackManager(stream: StreamData) {
7988
const callbackManager = new CallbackManager();
8089

0 commit comments

Comments
 (0)