Skip to content

Commit fd5a535

Browse files
committed
improve token error handling; remove old tokens
1 parent 3d3e23c commit fd5a535

File tree

3 files changed

+32
-11
lines changed

3 files changed

+32
-11
lines changed

src/lib/state/token.svelte.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class Token {
1818
const parsed = safeParse(storedHfToken ?? "");
1919
const storedToken = typia.is<string>(parsed) ? parsed : "";
2020

21-
if (storedToken) {
21+
if (storedToken && storedToken.startsWith("hf_jwt")) {
2222
this.#value = storedToken;
2323
} else {
2424
this.requestTokenFromParent();
@@ -36,18 +36,23 @@ class Token {
3636
this.#value = token;
3737
}
3838

39-
requestTokenFromParent = (): Promise<void> => {
40-
if (typeof window === "undefined") return Promise.resolve();
39+
requestTokenFromParent = (): Promise<boolean> => {
40+
if (typeof window === "undefined") return Promise.resolve(false);
4141

4242
return new Promise(resolve => {
43+
const timeout = window.setTimeout(() => {
44+
window.removeEventListener("message", handleMessage);
45+
resolve(false);
46+
}, 5000);
47+
4348
const handleMessage = (event: MessageEvent) => {
4449
if (event.data.type === "INFERENCE_JWT_RESPONSE") {
4550
const token = event.data.token;
46-
if (token && typeof token === "string") {
47-
this.value = token;
48-
window.removeEventListener("message", handleMessage);
49-
resolve();
50-
}
51+
if (!token || typeof token !== "string") return resolve(false);
52+
this.value = token;
53+
window.removeEventListener("message", handleMessage);
54+
resolve(true);
55+
window.clearTimeout(timeout);
5156
}
5257
};
5358

src/lib/utils/business.svelte.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import { mcpServers } from "$lib/state/mcps.svelte.js";
3232
import { modifySnippet } from "$lib/utils/snippets.js";
3333
import { models } from "$lib/state/models.svelte";
3434
import { StreamReader } from "$lib/utils/stream.js";
35+
import { dev } from "$app/environment";
3536

3637
type ChatCompletionInputMessageChunk =
3738
NonNullable<ChatCompletionInputMessage["content"]> extends string | (infer U)[] ? U : never;
@@ -118,6 +119,10 @@ function getResponseFormatObj(conversation: ConversationClass | Conversation) {
118119
}
119120
}
120121

122+
const tokenErrMessage = dev
123+
? "Please set your Hugging Face token in the .env file"
124+
: "Failed to connect to inference providers. Are you logged in?";
125+
121126
export async function handleStreamingResponse(
122127
conversation: ConversationClass | Conversation,
123128
onChunk: (content: string) => void,
@@ -171,7 +176,8 @@ export async function handleStreamingResponse(
171176
}
172177
} catch (error) {
173178
if (error instanceof Error && error.message.includes("401") && retryCount === 0) {
174-
await token.requestTokenFromParent();
179+
const ok = await token.requestTokenFromParent();
180+
if (!ok) throw new Error(tokenErrMessage);
175181
return handleStreamingResponse(conversation, onChunk, abortController, retryCount + 1);
176182
}
177183
throw error;
@@ -218,7 +224,8 @@ export async function handleNonStreamingResponse(
218224

219225
if (!response.ok) {
220226
if (response.status === 401 && retryCount === 0) {
221-
await token.requestTokenFromParent();
227+
const ok = await token.requestTokenFromParent();
228+
if (!ok) throw new Error(tokenErrMessage);
222229
return handleNonStreamingResponse(conversation, retryCount + 1);
223230
}
224231
const error = await response.json();

src/routes/api/generate/+server.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,16 @@ export const POST: RequestHandler = async ({ request }) => {
144144
}
145145
} catch (error) {
146146
console.error("stream error", error);
147-
writer.error(error instanceof Error ? error : new Error(String(error)));
147+
148+
let status = 500;
149+
if (error instanceof InferenceClientProviderApiError || error instanceof InferenceClientHubApiError) {
150+
status = error.httpResponse.status;
151+
}
152+
153+
const errorMessage = error instanceof Error ? error.message : String(error);
154+
const errorWithStatus = new Error(status === 401 ? "401 Unauthorized" : errorMessage);
155+
156+
writer.error(errorWithStatus);
148157
res.finish_reason = "stop";
149158
return res;
150159
}

0 commit comments

Comments
 (0)