Skip to content

Commit 9466f67

Browse files
Update the timeout value on all stream-timeout providers: (#4412)
- OpenRouter - Novita - CometAPI updated to 3,000ms default with 500ms min
1 parent 1209606 commit 9466f67

File tree

6 files changed

+35
-13
lines changed

6 files changed

+35
-13
lines changed

frontend/src/components/LLMSelection/CometApiLLMOptions/index.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ function AdvancedControls({ settings }) {
5959
name="CometApiLLMTimeout"
6060
className="border-none bg-theme-settings-input-bg text-theme-text-primary placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5"
6161
placeholder="Timeout value between token responses to auto-timeout the stream"
62-
defaultValue={settings?.CometApiLLMTimeout ?? 500}
62+
defaultValue={settings?.CometApiLLMTimeout ?? 3_000}
6363
autoComplete="off"
6464
onScroll={(e) => e.target.blur()}
6565
min={500}

frontend/src/components/LLMSelection/NovitaLLMOptions/index.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ function AdvancedControls({ settings }) {
5959
name="NovitaLLMTimeout"
6060
className="border-none bg-theme-settings-input-bg text-theme-text-primary placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5"
6161
placeholder="Timeout value between token responses to auto-timeout the stream"
62-
defaultValue={settings?.NovitaLLMTimeout ?? 500}
62+
defaultValue={settings?.NovitaLLMTimeout ?? 3_000}
6363
autoComplete="off"
6464
onScroll={(e) => e.target.blur()}
6565
min={500}

frontend/src/components/LLMSelection/OpenRouterOptions/index.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ function AdvancedControls({ settings }) {
5757
name="OpenRouterTimeout"
5858
className="border-none bg-theme-settings-input-bg text-white placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5"
5959
placeholder="Timeout value between token responses to auto-timeout the stream"
60-
defaultValue={settings?.OpenRouterTimeout ?? 500}
60+
defaultValue={settings?.OpenRouterTimeout ?? 3_000}
6161
autoComplete="off"
6262
onScroll={(e) => e.target.blur()}
6363
min={500}

server/utils/AiProviders/cometapi/index.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const cacheFolder = path.resolve(
1919
);
2020

2121
class CometApiLLM {
22+
defaultTimeout = 3_000;
2223
constructor(embedder = null, modelPreference = null) {
2324
if (!process.env.COMETAPI_LLM_API_KEY)
2425
throw new Error("No CometAPI API key was set.");
@@ -61,10 +62,14 @@ class CometApiLLM {
6162
* CometAPI has various models that never return `finish_reasons` and thus leave the stream open
6263
* which causes issues in subsequent messages. This timeout value forces us to close the stream after
6364
* x milliseconds. This is a configurable value via the COMETAPI_LLM_TIMEOUT_MS value
64-
* @returns {number} The timeout value in milliseconds (default: 500)
65+
* @returns {number} The timeout value in milliseconds (default: 3_000)
6566
*/
6667
#parseTimeout() {
67-
if (isNaN(Number(process.env.COMETAPI_LLM_TIMEOUT_MS))) return 500;
68+
this.log(
69+
`CometAPI timeout is set to ${process.env.COMETAPI_LLM_TIMEOUT_MS ?? this.defaultTimeout}ms`
70+
);
71+
if (isNaN(Number(process.env.COMETAPI_LLM_TIMEOUT_MS)))
72+
return this.defaultTimeout;
6873
const setValue = Number(process.env.COMETAPI_LLM_TIMEOUT_MS);
6974
if (setValue < 500) return 500;
7075
return setValue;

server/utils/AiProviders/novita/index.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ const cacheFolder = path.resolve(
1818
);
1919

2020
class NovitaLLM {
21+
defaultTimeout = 3_000;
22+
2123
constructor(embedder = null, modelPreference = null) {
2224
if (!process.env.NOVITA_LLM_API_KEY)
2325
throw new Error("No Novita API key was set.");
@@ -62,12 +64,16 @@ class NovitaLLM {
6264
* Novita has various models that never return `finish_reasons` and thus leave the stream open
6365
* which causes issues in subsequent messages. This timeout value forces us to close the stream after
6466
* x milliseconds. This is a configurable value via the NOVITA_LLM_TIMEOUT_MS value
65-
* @returns {number} The timeout value in milliseconds (default: 500)
67+
* @returns {number} The timeout value in milliseconds (default: 3_000)
6668
*/
6769
#parseTimeout() {
68-
if (isNaN(Number(process.env.NOVITA_LLM_TIMEOUT_MS))) return 500;
70+
this.log(
71+
`Novita timeout is set to ${process.env.NOVITA_LLM_TIMEOUT_MS ?? this.defaultTimeout}ms`
72+
);
73+
if (isNaN(Number(process.env.NOVITA_LLM_TIMEOUT_MS)))
74+
return this.defaultTimeout;
6975
const setValue = Number(process.env.NOVITA_LLM_TIMEOUT_MS);
70-
if (setValue < 500) return 500;
76+
if (setValue < 500) return 500; // 500ms is the minimum timeout
7177
return setValue;
7278
}
7379

@@ -318,7 +324,7 @@ class NovitaLLM {
318324
});
319325
}
320326

321-
if (message.finish_reason !== null) {
327+
if (message?.finish_reason !== null) {
322328
writeResponseChunk(response, {
323329
uuid,
324330
sources,

server/utils/AiProviders/openRouter/index.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ const cacheFolder = path.resolve(
1818
);
1919

2020
class OpenRouterLLM {
21+
/**
22+
* Some openrouter models never send a finish_reason and thus leave the stream open in the UI.
23+
* However, because OR is a middleware it can also wait an inordinately long time between chunks so we need
24+
* to ensure that we dont accidentally close the stream too early. If the time between chunks is greater than this timeout
25+
* we will close the stream and assume it to be complete. This is common for free models or slow providers they can
26+
* possibly delegate to during invocation.
27+
* @type {number}
28+
*/
29+
defaultTimeout = 3_000;
30+
2131
constructor(embedder = null, modelPreference = null) {
2232
if (!process.env.OPENROUTER_API_KEY)
2333
throw new Error("No OpenRouter API key was set.");
@@ -85,15 +95,16 @@ class OpenRouterLLM {
8595
* OpenRouter has various models that never return `finish_reasons` and thus leave the stream open
8696
* which causes issues in subsequent messages. This timeout value forces us to close the stream after
8797
* x milliseconds. This is a configurable value via the OPENROUTER_TIMEOUT_MS value
88-
* @returns {number} The timeout value in milliseconds (default: 500)
98+
* @returns {number} The timeout value in milliseconds (default: 3_000)
8999
*/
90100
#parseTimeout() {
91101
this.log(
92-
`OpenRouter timeout is set to ${process.env.OPENROUTER_TIMEOUT_MS ?? 500}ms`
102+
`OpenRouter timeout is set to ${process.env.OPENROUTER_TIMEOUT_MS ?? this.defaultTimeout}ms`
93103
);
94-
if (isNaN(Number(process.env.OPENROUTER_TIMEOUT_MS))) return 500;
104+
if (isNaN(Number(process.env.OPENROUTER_TIMEOUT_MS)))
105+
return this.defaultTimeout;
95106
const setValue = Number(process.env.OPENROUTER_TIMEOUT_MS);
96-
if (setValue < 500) return 500;
107+
if (setValue < 500) return 500; // 500ms is the minimum timeout
97108
return setValue;
98109
}
99110

0 commit comments

Comments
 (0)