Thomas G. Lopes commited on
Commit
fd5a535
·
1 Parent(s): 3d3e23c

improve token error handling; remove old tokens

Browse files
src/lib/state/token.svelte.ts CHANGED
@@ -18,7 +18,7 @@ class Token {
18
  const parsed = safeParse(storedHfToken ?? "");
19
  const storedToken = typia.is<string>(parsed) ? parsed : "";
20
 
21
- if (storedToken) {
22
  this.#value = storedToken;
23
  } else {
24
  this.requestTokenFromParent();
@@ -36,18 +36,23 @@ class Token {
36
  this.#value = token;
37
  }
38
 
39
- requestTokenFromParent = (): Promise<void> => {
40
- if (typeof window === "undefined") return Promise.resolve();
41
 
42
  return new Promise(resolve => {
 
 
 
 
 
43
  const handleMessage = (event: MessageEvent) => {
44
  if (event.data.type === "INFERENCE_JWT_RESPONSE") {
45
  const token = event.data.token;
46
- if (token && typeof token === "string") {
47
- this.value = token;
48
- window.removeEventListener("message", handleMessage);
49
- resolve();
50
- }
51
  }
52
  };
53
 
 
18
  const parsed = safeParse(storedHfToken ?? "");
19
  const storedToken = typia.is<string>(parsed) ? parsed : "";
20
 
21
+ if (storedToken && storedToken.startsWith("hf_jwt")) {
22
  this.#value = storedToken;
23
  } else {
24
  this.requestTokenFromParent();
 
36
  this.#value = token;
37
  }
38
 
39
+ requestTokenFromParent = (): Promise<boolean> => {
40
+ if (typeof window === "undefined") return Promise.resolve(false);
41
 
42
  return new Promise(resolve => {
43
+ const timeout = window.setTimeout(() => {
44
+ window.removeEventListener("message", handleMessage);
45
+ resolve(false);
46
+ }, 5000);
47
+
48
  const handleMessage = (event: MessageEvent) => {
49
  if (event.data.type === "INFERENCE_JWT_RESPONSE") {
50
  const token = event.data.token;
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);
56
  }
57
  };
58
 
src/lib/utils/business.svelte.ts CHANGED
@@ -32,6 +32,7 @@ import { mcpServers } from "$lib/state/mcps.svelte.js";
32
  import { modifySnippet } from "$lib/utils/snippets.js";
33
  import { models } from "$lib/state/models.svelte";
34
  import { StreamReader } from "$lib/utils/stream.js";
 
35
 
36
  type ChatCompletionInputMessageChunk =
37
  NonNullable<ChatCompletionInputMessage["content"]> extends string | (infer U)[] ? U : never;
@@ -118,6 +119,10 @@ function getResponseFormatObj(conversation: ConversationClass | Conversation) {
118
  }
119
  }
120
 
 
 
 
 
121
  export async function handleStreamingResponse(
122
  conversation: ConversationClass | Conversation,
123
  onChunk: (content: string) => void,
@@ -171,7 +176,8 @@ export async function handleStreamingResponse(
171
  }
172
  } catch (error) {
173
  if (error instanceof Error && error.message.includes("401") && retryCount === 0) {
174
- await token.requestTokenFromParent();
 
175
  return handleStreamingResponse(conversation, onChunk, abortController, retryCount + 1);
176
  }
177
  throw error;
@@ -218,7 +224,8 @@ export async function handleNonStreamingResponse(
218
 
219
  if (!response.ok) {
220
  if (response.status === 401 && retryCount === 0) {
221
- await token.requestTokenFromParent();
 
222
  return handleNonStreamingResponse(conversation, retryCount + 1);
223
  }
224
  const error = await response.json();
 
32
  import { modifySnippet } from "$lib/utils/snippets.js";
33
  import { models } from "$lib/state/models.svelte";
34
  import { StreamReader } from "$lib/utils/stream.js";
35
+ import { dev } from "$app/environment";
36
 
37
  type ChatCompletionInputMessageChunk =
38
  NonNullable<ChatCompletionInputMessage["content"]> extends string | (infer U)[] ? U : never;
 
119
  }
120
  }
121
 
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
+
126
  export async function handleStreamingResponse(
127
  conversation: ConversationClass | Conversation,
128
  onChunk: (content: string) => void,
 
176
  }
177
  } catch (error) {
178
  if (error instanceof Error && error.message.includes("401") && retryCount === 0) {
179
+ const ok = await token.requestTokenFromParent();
180
+ if (!ok) throw new Error(tokenErrMessage);
181
  return handleStreamingResponse(conversation, onChunk, abortController, retryCount + 1);
182
  }
183
  throw error;
 
224
 
225
  if (!response.ok) {
226
  if (response.status === 401 && retryCount === 0) {
227
+ const ok = await token.requestTokenFromParent();
228
+ if (!ok) throw new Error(tokenErrMessage);
229
  return handleNonStreamingResponse(conversation, retryCount + 1);
230
  }
231
  const error = await response.json();
src/routes/api/generate/+server.ts CHANGED
@@ -144,7 +144,16 @@ export const POST: RequestHandler = async ({ request }) => {
144
  }
145
  } catch (error) {
146
  console.error("stream error", error);
147
- writer.error(error instanceof Error ? error : new Error(String(error)));
 
 
 
 
 
 
 
 
 
148
  res.finish_reason = "stop";
149
  return res;
150
  }
 
144
  }
145
  } catch (error) {
146
  console.error("stream error", 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);
157
  res.finish_reason = "stop";
158
  return res;
159
  }