Skip to content

Commit 7d35caf

Browse files
authored
Handle proxy error (onlook-dev#1757)
1 parent f83aff9 commit 7d35caf

File tree

2 files changed

+22
-34
lines changed

2 files changed

+22
-34
lines changed

apps/studio/electron/main/chat/index.ts

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
import { MainChannels } from '@onlook/models/constants';
1414
import {
1515
generateObject,
16+
RetryError,
1617
streamText,
1718
type CoreMessage,
1819
type CoreSystemMessage,
@@ -86,10 +87,6 @@ class LlmManager {
8687
model,
8788
messages,
8889
abortSignal: this.abortController?.signal,
89-
onError: (error) => {
90-
console.error('Error', JSON.stringify(error, null, 2));
91-
throw error;
92-
},
9390
maxSteps: 10,
9491
tools: chatToolSet,
9592
maxTokens: 64000,
@@ -101,6 +98,9 @@ class LlmManager {
10198
this.emitMessagePart(toolResult);
10299
}
103100
},
101+
onError: (error) => {
102+
throw error;
103+
},
104104
});
105105
const streamParts: TextStreamPart<ToolSet>[] = [];
106106
for await (const partialStream of fullStream) {
@@ -115,7 +115,6 @@ class LlmManager {
115115
};
116116
} catch (error: any) {
117117
try {
118-
console.error('Error', error);
119118
if (error?.error?.statusCode) {
120119
if (error?.error?.statusCode === 403) {
121120
const rateLimitError = JSON.parse(
@@ -125,21 +124,26 @@ class LlmManager {
125124
type: 'rate-limited',
126125
rateLimitResult: rateLimitError,
127126
};
128-
} else {
129-
return {
130-
type: 'error',
131-
message: error.error.responseBody,
132-
};
133127
}
134128
}
135-
const errorMessage = this.getErrorMessage(error);
136-
return { message: errorMessage, type: 'error' };
137-
} catch (error) {
138-
console.error('Error parsing error', error);
139-
return { message: 'An unknown error occurred', type: 'error' };
140-
} finally {
141-
this.abortController = null;
129+
130+
if (RetryError.isInstance(error.error)) {
131+
const parsed = JSON.parse(error.error.lastError.responseBody);
132+
return { message: parsed.error.message, type: 'error' };
133+
}
134+
135+
if (error.error instanceof DOMException) {
136+
return { message: 'Request aborted', type: 'error' };
137+
}
138+
139+
return { message: JSON.stringify(error), type: 'error' };
140+
} catch (parseError) {
141+
console.error('Error parsing error', parseError);
142+
return { message: JSON.stringify(parseError), type: 'error' };
142143
}
144+
} finally {
145+
this.abortController?.abort();
146+
this.abortController = null;
143147
}
144148
}
145149

@@ -159,22 +163,6 @@ class LlmManager {
159163
mainWindow?.webContents.send(MainChannels.CHAT_STREAM_PARTIAL, res);
160164
}
161165

162-
private getErrorMessage(error: unknown): string {
163-
if (error instanceof Error) {
164-
return error.message;
165-
}
166-
if (typeof error === 'string') {
167-
return error;
168-
}
169-
if (error instanceof Response) {
170-
return error.statusText;
171-
}
172-
if (error && typeof error === 'object' && 'message' in error) {
173-
return String(error.message);
174-
}
175-
return 'An unknown chat error occurred';
176-
}
177-
178166
public async generateSuggestions(messages: CoreMessage[]): Promise<ChatSuggestion[]> {
179167
try {
180168
const model = await initModel(LLMProvider.ANTHROPIC, CLAUDE_MODELS.HAIKU, {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"dev:studio": "bun --filter @onlook/studio dev",
2828
"build": "bun --filter '!@onlook/web' build",
2929
"ci:build": "bun run build:foundation && bun --filter '!@onlook/web' build",
30-
"dev": "bun --filter '!@onlook/web' dev",
30+
"dev": "bun --elide-lines=0 --filter '!@onlook/web' dev",
3131
"dev:web": "bun --filter @onlook/web dev",
3232
"test": "bun --filter '*' test",
3333
"format": "bun --filter '*' format",

0 commit comments

Comments
 (0)