Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
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<
|
| 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
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
}
|