Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
Thomas G. Lopes
commited on
Commit
·
7e80e42
1
Parent(s):
5e80fac
update and lint
Browse files- e2e/home.test.ts +1 -1
- eslint.config.mts +1 -1
- package.json +1 -1
- pnpm-lock.yaml +13 -13
- src/lib/attachments/observe.svelte.ts +2 -2
- src/lib/components/inference-playground/conversation.svelte +1 -1
- src/lib/components/inference-playground/custom-model-config.svelte +1 -1
- src/lib/components/inference-playground/custom-provider-select.svelte +1 -1
- src/lib/components/inference-playground/generation-config.svelte +1 -1
- src/lib/components/inference-playground/message.svelte +1 -1
- src/lib/components/inference-playground/project-select.svelte +1 -1
- src/lib/components/inference-playground/provider-select.svelte +1 -1
- src/lib/components/inference-playground/structured-output-modal.svelte +2 -2
- src/lib/components/share-modal.svelte +2 -2
- src/lib/remult.ts +1 -1
- src/lib/server/providers/index.ts +1 -1
- src/lib/spells/extract.svelte.ts +1 -1
- src/lib/spells/scroll-state.svelte.ts +5 -5
- src/lib/spells/textarea-autosize.svelte.ts +2 -2
- src/lib/state/checkpoints.svelte.ts +1 -1
- src/lib/state/conversations.svelte.ts +3 -3
- src/lib/utils/object.svelte.ts +1 -1
- src/lib/utils/poll.ts +1 -1
- src/lib/utils/snippets.ts +7 -7
- src/routes/api/models/+server.ts +4 -4
e2e/home.test.ts
CHANGED
|
@@ -42,7 +42,7 @@ test.describe.serial("Token Handling and Subsequent Tests", () => {
|
|
| 42 |
// Verify token is in localStorage
|
| 43 |
const storedToken = await page.evaluate(
|
| 44 |
key => JSON.parse(window.localStorage.getItem(key) ?? ""),
|
| 45 |
-
HF_TOKEN_STORAGE_KEY
|
| 46 |
);
|
| 47 |
expect(storedToken).toBe(HF_TOKEN);
|
| 48 |
|
|
|
|
| 42 |
// Verify token is in localStorage
|
| 43 |
const storedToken = await page.evaluate(
|
| 44 |
key => JSON.parse(window.localStorage.getItem(key) ?? ""),
|
| 45 |
+
HF_TOKEN_STORAGE_KEY,
|
| 46 |
);
|
| 47 |
expect(storedToken).toBe(HF_TOKEN);
|
| 48 |
|
eslint.config.mts
CHANGED
|
@@ -96,5 +96,5 @@ export default ts.config(
|
|
| 96 |
...globals.node,
|
| 97 |
},
|
| 98 |
},
|
| 99 |
-
}
|
| 100 |
);
|
|
|
|
| 96 |
...globals.node,
|
| 97 |
},
|
| 98 |
},
|
| 99 |
+
},
|
| 100 |
);
|
package.json
CHANGED
|
@@ -22,7 +22,7 @@
|
|
| 22 |
"@eslint/js": "^9.22.0",
|
| 23 |
"@floating-ui/dom": "^1.6.13",
|
| 24 |
"@huggingface/hub": "^2.1.0",
|
| 25 |
-
"@huggingface/inference": "^4.
|
| 26 |
"@huggingface/tasks": "^0.19.8",
|
| 27 |
"@huggingface/transformers": "^3.5.1",
|
| 28 |
"@iconify-json/carbon": "^1.2.8",
|
|
|
|
| 22 |
"@eslint/js": "^9.22.0",
|
| 23 |
"@floating-ui/dom": "^1.6.13",
|
| 24 |
"@huggingface/hub": "^2.1.0",
|
| 25 |
+
"@huggingface/inference": "^4.5.3",
|
| 26 |
"@huggingface/tasks": "^0.19.8",
|
| 27 |
"@huggingface/transformers": "^3.5.1",
|
| 28 |
"@iconify-json/carbon": "^1.2.8",
|
pnpm-lock.yaml
CHANGED
|
@@ -34,8 +34,8 @@ importers:
|
|
| 34 |
specifier: ^2.1.0
|
| 35 |
version: 2.1.0
|
| 36 |
'@huggingface/inference':
|
| 37 |
-
specifier: ^4.
|
| 38 |
-
version: 4.
|
| 39 |
'@huggingface/tasks':
|
| 40 |
specifier: ^0.19.8
|
| 41 |
version: 0.19.8
|
|
@@ -589,20 +589,20 @@ packages:
|
|
| 589 |
engines: {node: '>=18'}
|
| 590 |
hasBin: true
|
| 591 |
|
| 592 |
-
'@huggingface/inference@4.
|
| 593 |
-
resolution: {integrity: sha512-
|
| 594 |
engines: {node: '>=18'}
|
| 595 |
|
| 596 |
'@huggingface/jinja@0.4.1':
|
| 597 |
resolution: {integrity: sha512-3WXbMFaPkk03LRCM0z0sylmn8ddDm4ubjU7X+Hg4M2GOuMklwoGAFXp9V2keq7vltoB/c7McE5aHUVVddAewsw==}
|
| 598 |
engines: {node: '>=18'}
|
| 599 |
|
| 600 |
-
'@huggingface/jinja@0.5.
|
| 601 |
-
resolution: {integrity: sha512-
|
| 602 |
engines: {node: '>=18'}
|
| 603 |
|
| 604 |
-
'@huggingface/tasks@0.19.
|
| 605 |
-
resolution: {integrity: sha512-
|
| 606 |
|
| 607 |
'@huggingface/tasks@0.19.8':
|
| 608 |
resolution: {integrity: sha512-gR88OvYQQ2zu1Dt/tfFRVWJRfsKCdssxJBb8bz3tVd9fh3rneNE/pjkaGyG3oT1VlHv7wEmrqrnkmMcXy8O0rg==}
|
|
@@ -3548,16 +3548,16 @@ snapshots:
|
|
| 3548 |
dependencies:
|
| 3549 |
'@huggingface/tasks': 0.19.8
|
| 3550 |
|
| 3551 |
-
'@huggingface/inference@4.
|
| 3552 |
dependencies:
|
| 3553 |
-
'@huggingface/jinja': 0.5.
|
| 3554 |
-
'@huggingface/tasks': 0.19.
|
| 3555 |
|
| 3556 |
'@huggingface/jinja@0.4.1': {}
|
| 3557 |
|
| 3558 |
-
'@huggingface/jinja@0.5.
|
| 3559 |
|
| 3560 |
-
'@huggingface/tasks@0.19.
|
| 3561 |
|
| 3562 |
'@huggingface/tasks@0.19.8': {}
|
| 3563 |
|
|
|
|
| 34 |
specifier: ^2.1.0
|
| 35 |
version: 2.1.0
|
| 36 |
'@huggingface/inference':
|
| 37 |
+
specifier: ^4.5.3
|
| 38 |
+
version: 4.5.3
|
| 39 |
'@huggingface/tasks':
|
| 40 |
specifier: ^0.19.8
|
| 41 |
version: 0.19.8
|
|
|
|
| 589 |
engines: {node: '>=18'}
|
| 590 |
hasBin: true
|
| 591 |
|
| 592 |
+
'@huggingface/inference@4.5.3':
|
| 593 |
+
resolution: {integrity: sha512-SAWKT+e32jSfxwYkRaBQx1rlfgzkHCu0PXbCbOpY0Pvx6Si5wHia2BzZZdwgrpldaRbmFClxmNJy6lfCzQYfOw==}
|
| 594 |
engines: {node: '>=18'}
|
| 595 |
|
| 596 |
'@huggingface/jinja@0.4.1':
|
| 597 |
resolution: {integrity: sha512-3WXbMFaPkk03LRCM0z0sylmn8ddDm4ubjU7X+Hg4M2GOuMklwoGAFXp9V2keq7vltoB/c7McE5aHUVVddAewsw==}
|
| 598 |
engines: {node: '>=18'}
|
| 599 |
|
| 600 |
+
'@huggingface/jinja@0.5.1':
|
| 601 |
+
resolution: {integrity: sha512-yUZLld4lrM9iFxHCwFQ7D1HW2MWMwSbeB7WzWqFYDWK+rEb+WldkLdAJxUPOmgICMHZLzZGVcVjFh3w/YGubng==}
|
| 602 |
engines: {node: '>=18'}
|
| 603 |
|
| 604 |
+
'@huggingface/tasks@0.19.26':
|
| 605 |
+
resolution: {integrity: sha512-E1+A6RIdfIS32tBjo+ReM61sZ5H3fHUDOH/gGO5uxvapjxaOns1IFtl+ESH8g9Tu+2HRmANoQ4bxli48igRAcA==}
|
| 606 |
|
| 607 |
'@huggingface/tasks@0.19.8':
|
| 608 |
resolution: {integrity: sha512-gR88OvYQQ2zu1Dt/tfFRVWJRfsKCdssxJBb8bz3tVd9fh3rneNE/pjkaGyG3oT1VlHv7wEmrqrnkmMcXy8O0rg==}
|
|
|
|
| 3548 |
dependencies:
|
| 3549 |
'@huggingface/tasks': 0.19.8
|
| 3550 |
|
| 3551 |
+
'@huggingface/inference@4.5.3':
|
| 3552 |
dependencies:
|
| 3553 |
+
'@huggingface/jinja': 0.5.1
|
| 3554 |
+
'@huggingface/tasks': 0.19.26
|
| 3555 |
|
| 3556 |
'@huggingface/jinja@0.4.1': {}
|
| 3557 |
|
| 3558 |
+
'@huggingface/jinja@0.5.1': {}
|
| 3559 |
|
| 3560 |
+
'@huggingface/tasks@0.19.26': {}
|
| 3561 |
|
| 3562 |
'@huggingface/tasks@0.19.8': {}
|
| 3563 |
|
src/lib/attachments/observe.svelte.ts
CHANGED
|
@@ -50,8 +50,8 @@ export const observed: Record<ObservedElements, ObservedData> = $state(
|
|
| 50 |
};
|
| 51 |
return acc;
|
| 52 |
},
|
| 53 |
-
{} as Record<ObservedElements, ObservedData
|
| 54 |
-
)
|
| 55 |
);
|
| 56 |
|
| 57 |
type ObserveArgs = {
|
|
|
|
| 50 |
};
|
| 51 |
return acc;
|
| 52 |
},
|
| 53 |
+
{} as Record<ObservedElements, ObservedData>,
|
| 54 |
+
),
|
| 55 |
);
|
| 56 |
|
| 57 |
type ObserveArgs = {
|
src/lib/components/inference-playground/conversation.svelte
CHANGED
|
@@ -33,7 +33,7 @@
|
|
| 33 |
} catch {
|
| 34 |
// noop
|
| 35 |
}
|
| 36 |
-
}
|
| 37 |
);
|
| 38 |
|
| 39 |
async function regenMessage(idx: number) {
|
|
|
|
| 33 |
} catch {
|
| 34 |
// noop
|
| 35 |
}
|
| 36 |
+
},
|
| 37 |
);
|
| 38 |
|
| 39 |
async function regenMessage(idx: number) {
|
src/lib/components/inference-playground/custom-model-config.svelte
CHANGED
|
@@ -68,7 +68,7 @@
|
|
| 68 |
if (prev === undefined) testSuccessful = exists;
|
| 69 |
else testSuccessful = false;
|
| 70 |
},
|
| 71 |
-
{ lazy: true }
|
| 72 |
);
|
| 73 |
|
| 74 |
let testing = $state(false);
|
|
|
|
| 68 |
if (prev === undefined) testSuccessful = exists;
|
| 69 |
else testSuccessful = false;
|
| 70 |
},
|
| 71 |
+
{ lazy: true },
|
| 72 |
);
|
| 73 |
|
| 74 |
let testing = $state(false);
|
src/lib/components/inference-playground/custom-provider-select.svelte
CHANGED
|
@@ -71,7 +71,7 @@
|
|
| 71 |
"focus-outline relative flex items-center justify-between gap-6 overflow-hidden rounded-lg border bg-gray-100/80 px-3 py-1.5 leading-tight whitespace-nowrap shadow-sm",
|
| 72 |
"hover:brightness-95 dark:border-gray-700 dark:bg-gray-800 dark:hover:brightness-110",
|
| 73 |
select.open && "!custom-outline",
|
| 74 |
-
classes
|
| 75 |
)}
|
| 76 |
type="button"
|
| 77 |
>
|
|
|
|
| 71 |
"focus-outline relative flex items-center justify-between gap-6 overflow-hidden rounded-lg border bg-gray-100/80 px-3 py-1.5 leading-tight whitespace-nowrap shadow-sm",
|
| 72 |
"hover:brightness-95 dark:border-gray-700 dark:bg-gray-800 dark:hover:brightness-110",
|
| 73 |
select.open && "!custom-outline",
|
| 74 |
+
classes,
|
| 75 |
)}
|
| 76 |
type="button"
|
| 77 |
>
|
src/lib/components/inference-playground/generation-config.svelte
CHANGED
|
@@ -28,7 +28,7 @@
|
|
| 28 |
max_tokens: maxTokens,
|
| 29 |
},
|
| 30 |
});
|
| 31 |
-
}
|
| 32 |
);
|
| 33 |
|
| 34 |
type Config = (typeof conversation)["data"]["config"];
|
|
|
|
| 28 |
max_tokens: maxTokens,
|
| 29 |
},
|
| 30 |
});
|
| 31 |
+
},
|
| 32 |
);
|
| 33 |
|
| 34 |
type Config = (typeof conversation)["data"]["config"];
|
src/lib/components/inference-playground/message.svelte
CHANGED
|
@@ -34,7 +34,7 @@
|
|
| 34 |
const canUploadImgs = $derived(
|
| 35 |
message.role === "user" &&
|
| 36 |
"pipeline_tag" in conversation.model &&
|
| 37 |
-
conversation.model.pipeline_tag === PipelineTag.ImageTextToText
|
| 38 |
);
|
| 39 |
|
| 40 |
const fileQueue = new AsyncQueue();
|
|
|
|
| 34 |
const canUploadImgs = $derived(
|
| 35 |
message.role === "user" &&
|
| 36 |
"pipeline_tag" in conversation.model &&
|
| 37 |
+
conversation.model.pipeline_tag === PipelineTag.ImageTextToText,
|
| 38 |
);
|
| 39 |
|
| 40 |
const fileQueue = new AsyncQueue();
|
src/lib/components/inference-playground/project-select.svelte
CHANGED
|
@@ -67,7 +67,7 @@
|
|
| 67 |
{...select.trigger}
|
| 68 |
class={cn(
|
| 69 |
"relative flex grow items-center justify-between gap-6 overflow-hidden rounded-lg border bg-gray-100/80 px-3 py-1.5 leading-tight whitespace-nowrap shadow-sm",
|
| 70 |
-
"hover:brightness-95 dark:border-gray-700 dark:bg-gray-800 dark:hover:brightness-110"
|
| 71 |
)}
|
| 72 |
>
|
| 73 |
<div class="flex items-center gap-1 text-sm">
|
|
|
|
| 67 |
{...select.trigger}
|
| 68 |
class={cn(
|
| 69 |
"relative flex grow items-center justify-between gap-6 overflow-hidden rounded-lg border bg-gray-100/80 px-3 py-1.5 leading-tight whitespace-nowrap shadow-sm",
|
| 70 |
+
"hover:brightness-95 dark:border-gray-700 dark:bg-gray-800 dark:hover:brightness-110",
|
| 71 |
)}
|
| 72 |
>
|
| 73 |
<div class="flex items-center gap-1 text-sm">
|
src/lib/components/inference-playground/provider-select.svelte
CHANGED
|
@@ -89,7 +89,7 @@
|
|
| 89 |
class={cn(
|
| 90 |
"relative flex items-center justify-between gap-6 overflow-hidden rounded-lg border bg-gray-100/80 px-3 py-1.5 leading-tight whitespace-nowrap shadow-sm",
|
| 91 |
"hover:brightness-95 dark:border-gray-700 dark:bg-gray-800 dark:hover:brightness-110",
|
| 92 |
-
classes
|
| 93 |
)}
|
| 94 |
>
|
| 95 |
<div class="flex items-center gap-1 text-sm">
|
|
|
|
| 89 |
class={cn(
|
| 90 |
"relative flex items-center justify-between gap-6 overflow-hidden rounded-lg border bg-gray-100/80 px-3 py-1.5 leading-tight whitespace-nowrap shadow-sm",
|
| 91 |
"hover:brightness-95 dark:border-gray-700 dark:bg-gray-800 dark:hover:brightness-110",
|
| 92 |
+
classes,
|
| 93 |
)}
|
| 94 |
>
|
| 95 |
<div class="flex items-center gap-1 text-sm">
|
src/lib/components/inference-playground/structured-output-modal.svelte
CHANGED
|
@@ -71,7 +71,7 @@
|
|
| 71 |
value: parseJsonSchema,
|
| 72 |
onChange(v) {
|
| 73 |
const required = Array.from(new Set(v.schema?.required)).filter(name =>
|
| 74 |
-
keys(v.schema?.properties ?? {}).includes(name)
|
| 75 |
);
|
| 76 |
const validated: Schema = {
|
| 77 |
schema: {
|
|
@@ -138,7 +138,7 @@
|
|
| 138 |
const updatedProperties = renameKey(
|
| 139 |
schemaObj.current.schema?.properties ?? {},
|
| 140 |
propertyName,
|
| 141 |
-
value
|
| 142 |
);
|
| 143 |
updateSchemaNested({ properties: updatedProperties });
|
| 144 |
}
|
|
|
|
| 71 |
value: parseJsonSchema,
|
| 72 |
onChange(v) {
|
| 73 |
const required = Array.from(new Set(v.schema?.required)).filter(name =>
|
| 74 |
+
keys(v.schema?.properties ?? {}).includes(name),
|
| 75 |
);
|
| 76 |
const validated: Schema = {
|
| 77 |
schema: {
|
|
|
|
| 138 |
const updatedProperties = renameKey(
|
| 139 |
schemaObj.current.schema?.properties ?? {},
|
| 140 |
propertyName,
|
| 141 |
+
value,
|
| 142 |
);
|
| 143 |
updateSchemaNested({ properties: updatedProperties });
|
| 144 |
}
|
src/lib/components/share-modal.svelte
CHANGED
|
@@ -58,7 +58,7 @@
|
|
| 58 |
await sleep(100);
|
| 59 |
encoded = encodeObject(fullProject);
|
| 60 |
})();
|
| 61 |
-
}
|
| 62 |
);
|
| 63 |
let pasted = $state("");
|
| 64 |
|
|
@@ -160,7 +160,7 @@
|
|
| 160 |
...omit(c, "id", "createdAt"),
|
| 161 |
projectId,
|
| 162 |
});
|
| 163 |
-
})
|
| 164 |
);
|
| 165 |
projects.activeId = projectId;
|
| 166 |
saving = false;
|
|
|
|
| 58 |
await sleep(100);
|
| 59 |
encoded = encodeObject(fullProject);
|
| 60 |
})();
|
| 61 |
+
},
|
| 62 |
);
|
| 63 |
let pasted = $state("");
|
| 64 |
|
|
|
|
| 160 |
...omit(c, "id", "createdAt"),
|
| 161 |
projectId,
|
| 162 |
});
|
| 163 |
+
}),
|
| 164 |
);
|
| 165 |
projects.activeId = projectId;
|
| 166 |
saving = false;
|
src/lib/remult.ts
CHANGED
|
@@ -33,7 +33,7 @@ export function initRemultSvelteReactivity() {
|
|
| 33 |
export class JsonEntityIndexedDbStorage implements JsonEntityStorage {
|
| 34 |
constructor(
|
| 35 |
private dbName: string = "db",
|
| 36 |
-
private storeName: string = "jsonStore"
|
| 37 |
) {}
|
| 38 |
supportsRawJson = true;
|
| 39 |
//@internal
|
|
|
|
| 33 |
export class JsonEntityIndexedDbStorage implements JsonEntityStorage {
|
| 34 |
constructor(
|
| 35 |
private dbName: string = "db",
|
| 36 |
+
private storeName: string = "jsonStore",
|
| 37 |
) {}
|
| 38 |
supportsRawJson = true;
|
| 39 |
//@internal
|
src/lib/server/providers/index.ts
CHANGED
|
@@ -109,7 +109,7 @@ async function updateCache(provider: string, modelId: string, maxTokens: number)
|
|
| 109 |
export async function getMaxTokens(
|
| 110 |
provider: string,
|
| 111 |
modelId: string,
|
| 112 |
-
apiKey: string | undefined
|
| 113 |
): Promise<number | null> {
|
| 114 |
const cache = await readCache();
|
| 115 |
const cachedValue = cache[provider]?.[modelId];
|
|
|
|
| 109 |
export async function getMaxTokens(
|
| 110 |
provider: string,
|
| 111 |
modelId: string,
|
| 112 |
+
apiKey: string | undefined,
|
| 113 |
): Promise<number | null> {
|
| 114 |
const cache = await readCache();
|
| 115 |
const cachedValue = cache[provider]?.[modelId];
|
src/lib/spells/extract.svelte.ts
CHANGED
|
@@ -7,7 +7,7 @@ import type { MaybeGetter } from "$lib/types.js";
|
|
| 7 |
*/
|
| 8 |
export function extract<T, D extends T>(
|
| 9 |
value: MaybeGetter<T>,
|
| 10 |
-
defaultValue?: D
|
| 11 |
): D extends undefined | null ? T : Exclude<T, undefined | null> | D {
|
| 12 |
if (isFunction(value)) {
|
| 13 |
const getter = value;
|
|
|
|
| 7 |
*/
|
| 8 |
export function extract<T, D extends T>(
|
| 9 |
value: MaybeGetter<T>,
|
| 10 |
+
defaultValue?: D,
|
| 11 |
): D extends undefined | null ? T : Exclude<T, undefined | null> | D {
|
| 12 |
if (isFunction(value)) {
|
| 13 |
const getter = value;
|
src/lib/spells/scroll-state.svelte.ts
CHANGED
|
@@ -100,7 +100,7 @@ export class ScrollState {
|
|
| 100 |
right: 0,
|
| 101 |
top: 0,
|
| 102 |
bottom: 0,
|
| 103 |
-
})
|
| 104 |
);
|
| 105 |
onScroll = $derived(this.#options.onScroll ?? noop);
|
| 106 |
onStop = $derived(this.#options.onStop ?? noop);
|
|
@@ -108,14 +108,14 @@ export class ScrollState {
|
|
| 108 |
this.#options.eventListenerOptions ?? {
|
| 109 |
capture: false,
|
| 110 |
passive: true,
|
| 111 |
-
}
|
| 112 |
);
|
| 113 |
behavior = $derived(extract(this.#options.behavior, "auto"));
|
| 114 |
onError = $derived(
|
| 115 |
this.#options.onError ??
|
| 116 |
((e: unknown) => {
|
| 117 |
console.error(e);
|
| 118 |
-
})
|
| 119 |
);
|
| 120 |
|
| 121 |
/** State */
|
|
@@ -162,14 +162,14 @@ export class ScrollState {
|
|
| 162 |
"scroll",
|
| 163 |
// throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler,
|
| 164 |
this.onScrollHandler,
|
| 165 |
-
this.eventListenerOptions
|
| 166 |
);
|
| 167 |
|
| 168 |
useEventListener(
|
| 169 |
() => this.element,
|
| 170 |
"scrollend",
|
| 171 |
e => this.onScrollEnd(e),
|
| 172 |
-
this.eventListenerOptions
|
| 173 |
);
|
| 174 |
|
| 175 |
onMount(() => {
|
|
|
|
| 100 |
right: 0,
|
| 101 |
top: 0,
|
| 102 |
bottom: 0,
|
| 103 |
+
}),
|
| 104 |
);
|
| 105 |
onScroll = $derived(this.#options.onScroll ?? noop);
|
| 106 |
onStop = $derived(this.#options.onStop ?? noop);
|
|
|
|
| 108 |
this.#options.eventListenerOptions ?? {
|
| 109 |
capture: false,
|
| 110 |
passive: true,
|
| 111 |
+
},
|
| 112 |
);
|
| 113 |
behavior = $derived(extract(this.#options.behavior, "auto"));
|
| 114 |
onError = $derived(
|
| 115 |
this.#options.onError ??
|
| 116 |
((e: unknown) => {
|
| 117 |
console.error(e);
|
| 118 |
+
}),
|
| 119 |
);
|
| 120 |
|
| 121 |
/** State */
|
|
|
|
| 162 |
"scroll",
|
| 163 |
// throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler,
|
| 164 |
this.onScrollHandler,
|
| 165 |
+
this.eventListenerOptions,
|
| 166 |
);
|
| 167 |
|
| 168 |
useEventListener(
|
| 169 |
() => this.element,
|
| 170 |
"scrollend",
|
| 171 |
e => this.onScrollEnd(e),
|
| 172 |
+
this.eventListenerOptions,
|
| 173 |
);
|
| 174 |
|
| 175 |
onMount(() => {
|
src/lib/spells/textarea-autosize.svelte.ts
CHANGED
|
@@ -43,7 +43,7 @@ export class TextareaAutosize {
|
|
| 43 |
|
| 44 |
watch(
|
| 45 |
() => this.textareaHeight,
|
| 46 |
-
() => options?.onResize?.()
|
| 47 |
);
|
| 48 |
|
| 49 |
useResizeObserver(
|
|
@@ -55,7 +55,7 @@ export class TextareaAutosize {
|
|
| 55 |
|
| 56 |
this.textareaOldWidth = contentRect.width;
|
| 57 |
this.triggerResize();
|
| 58 |
-
}
|
| 59 |
);
|
| 60 |
|
| 61 |
onDestroy(() => {
|
|
|
|
| 43 |
|
| 44 |
watch(
|
| 45 |
() => this.textareaHeight,
|
| 46 |
+
() => options?.onResize?.(),
|
| 47 |
);
|
| 48 |
|
| 49 |
useResizeObserver(
|
|
|
|
| 55 |
|
| 56 |
this.textareaOldWidth = contentRect.width;
|
| 57 |
this.triggerResize();
|
| 58 |
+
},
|
| 59 |
);
|
| 60 |
|
| 61 |
onDestroy(() => {
|
src/lib/state/checkpoints.svelte.ts
CHANGED
|
@@ -60,7 +60,7 @@ class Checkpoints {
|
|
| 60 |
conversations: conversations.for(project.id).map(c => c.data),
|
| 61 |
timestamp: new Date(),
|
| 62 |
projectId: project.id,
|
| 63 |
-
})
|
| 64 |
);
|
| 65 |
|
| 66 |
// Hack because dates are formatted to string by save
|
|
|
|
| 60 |
conversations: conversations.for(project.id).map(c => c.data),
|
| 61 |
timestamp: new Date(),
|
| 62 |
projectId: project.id,
|
| 63 |
+
}),
|
| 64 |
);
|
| 65 |
|
| 66 |
// Hack because dates are formatted to string by save
|
src/lib/state/conversations.svelte.ts
CHANGED
|
@@ -195,7 +195,7 @@ export class ConversationClass {
|
|
| 195 |
this.updateMessage({ index, message: streamingMessage });
|
| 196 |
}
|
| 197 |
},
|
| 198 |
-
this.abortManager.createController()
|
| 199 |
);
|
| 200 |
} else {
|
| 201 |
const { message: newMessage, completion_tokens: newTokensCount } = await handleNonStreamingResponse(this);
|
|
@@ -273,7 +273,7 @@ class Conversations {
|
|
| 273 |
}
|
| 274 |
|
| 275 |
create = async (
|
| 276 |
-
args: { projectId: ProjectEntity["id"]; modelId?: Model["id"] } & Partial<ConversationEntityMembers
|
| 277 |
) => {
|
| 278 |
const conv = snapshot({
|
| 279 |
...getDefaultConversation(args.projectId),
|
|
@@ -348,7 +348,7 @@ class Conversations {
|
|
| 348 |
await Promise.allSettled(
|
| 349 |
fromArr.map(async c => {
|
| 350 |
conversations.create({ ...c.data, projectId: to });
|
| 351 |
-
})
|
| 352 |
);
|
| 353 |
};
|
| 354 |
|
|
|
|
| 195 |
this.updateMessage({ index, message: streamingMessage });
|
| 196 |
}
|
| 197 |
},
|
| 198 |
+
this.abortManager.createController(),
|
| 199 |
);
|
| 200 |
} else {
|
| 201 |
const { message: newMessage, completion_tokens: newTokensCount } = await handleNonStreamingResponse(this);
|
|
|
|
| 273 |
}
|
| 274 |
|
| 275 |
create = async (
|
| 276 |
+
args: { projectId: ProjectEntity["id"]; modelId?: Model["id"] } & Partial<ConversationEntityMembers>,
|
| 277 |
) => {
|
| 278 |
const conv = snapshot({
|
| 279 |
...getDefaultConversation(args.projectId),
|
|
|
|
| 348 |
await Promise.allSettled(
|
| 349 |
fromArr.map(async c => {
|
| 350 |
conversations.create({ ...c.data, projectId: to });
|
| 351 |
+
}),
|
| 352 |
);
|
| 353 |
};
|
| 354 |
|
src/lib/utils/object.svelte.ts
CHANGED
|
@@ -88,7 +88,7 @@ export function deepMerge<T extends DeepMergeable, U extends DeepMergeable>(targ
|
|
| 88 |
export function renameKey<T extends object>(
|
| 89 |
obj: T,
|
| 90 |
oldKey: keyof T,
|
| 91 |
-
newKey: string
|
| 92 |
): { [K in keyof T as K extends typeof oldKey ? typeof newKey : K]: T[K] } {
|
| 93 |
const entries = Object.entries(obj);
|
| 94 |
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
| 88 |
export function renameKey<T extends object>(
|
| 89 |
obj: T,
|
| 90 |
oldKey: keyof T,
|
| 91 |
+
newKey: string,
|
| 92 |
): { [K in keyof T as K extends typeof oldKey ? typeof newKey : K]: T[K] } {
|
| 93 |
const entries = Object.entries(obj);
|
| 94 |
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
src/lib/utils/poll.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
| 6 |
*/
|
| 7 |
export async function poll<T>(
|
| 8 |
predicate: () => T | Promise<T>,
|
| 9 |
-
options: { interval?: number; maxAttempts?: number } = {}
|
| 10 |
): Promise<T | undefined> {
|
| 11 |
const { interval = 10, maxAttempts = 200 } = options;
|
| 12 |
|
|
|
|
| 6 |
*/
|
| 7 |
export async function poll<T>(
|
| 8 |
predicate: () => T | Promise<T>,
|
| 9 |
+
options: { interval?: number; maxAttempts?: number } = {},
|
| 10 |
): Promise<T | undefined> {
|
| 11 |
const { interval = 10, maxAttempts = 200 } = options;
|
| 12 |
|
src/lib/utils/snippets.ts
CHANGED
|
@@ -64,7 +64,7 @@ function insertPropertiesInternal(
|
|
| 64 |
openChar: string, // The opening character, e.g., '{' or '('
|
| 65 |
closeChar: string, // The closing character, e.g., '}' or ')'
|
| 66 |
propFormatter: (key: string, formattedValue: string, indent: string) => string,
|
| 67 |
-
valueFormatter: (value: unknown, baseIndent: string) => string
|
| 68 |
): string {
|
| 69 |
if (Object.keys(newProperties).length === 0) {
|
| 70 |
return snippet;
|
|
@@ -215,7 +215,7 @@ export function modifySnippet(snippet: string, newProperties: Record<string, unk
|
|
| 215 |
"{", // The parameters are in an object literal
|
| 216 |
"}",
|
| 217 |
(key, value, indent) => `${indent}${key}: ${value},\n`, // JS object literal style
|
| 218 |
-
formatJsJsonValue
|
| 219 |
);
|
| 220 |
}
|
| 221 |
// JS: HuggingFace InferenceClient (non-streaming)
|
|
@@ -228,7 +228,7 @@ export function modifySnippet(snippet: string, newProperties: Record<string, unk
|
|
| 228 |
"{", // The parameters are in an object literal
|
| 229 |
"}",
|
| 230 |
(key, value, indent) => `${indent}${key}: ${value},\n`, // JS object literal style
|
| 231 |
-
formatJsJsonValue
|
| 232 |
);
|
| 233 |
}
|
| 234 |
// JS: OpenAI Client
|
|
@@ -244,7 +244,7 @@ export function modifySnippet(snippet: string, newProperties: Record<string, unk
|
|
| 244 |
"{", // The parameters are in an object literal
|
| 245 |
"}",
|
| 246 |
(key, value, indent) => `${indent}${key}: ${value},\n`,
|
| 247 |
-
formatJsJsonValue
|
| 248 |
);
|
| 249 |
}
|
| 250 |
// Python: OpenAI or HuggingFace Client using client.chat.completions.create
|
|
@@ -259,7 +259,7 @@ export function modifySnippet(snippet: string, newProperties: Record<string, unk
|
|
| 259 |
const snakeKey = key.replace(/([A-Z])/g, "_$1").toLowerCase();
|
| 260 |
return `${indent}${snakeKey}=${value},\n`;
|
| 261 |
},
|
| 262 |
-
formatPythonValue
|
| 263 |
);
|
| 264 |
}
|
| 265 |
// Python: requests example with query({...})
|
|
@@ -272,7 +272,7 @@ export function modifySnippet(snippet: string, newProperties: Record<string, unk
|
|
| 272 |
"}",
|
| 273 |
// Python dict keys are strings, values formatted for Python
|
| 274 |
(key, formattedValue, indent) => `${indent}"${key}": ${formattedValue},\n`,
|
| 275 |
-
formatPythonValue // Use formatPythonValue for the values themselves
|
| 276 |
);
|
| 277 |
}
|
| 278 |
// Shell/curl (JSON content)
|
|
@@ -287,7 +287,7 @@ export function modifySnippet(snippet: string, newProperties: Record<string, unk
|
|
| 287 |
const snakeKey = key.replace(/([A-Z])/g, "_$1").toLowerCase();
|
| 288 |
return `${indent}"${snakeKey}": ${value},\n`;
|
| 289 |
},
|
| 290 |
-
formatJsJsonValue
|
| 291 |
);
|
| 292 |
}
|
| 293 |
return snippet;
|
|
|
|
| 64 |
openChar: string, // The opening character, e.g., '{' or '('
|
| 65 |
closeChar: string, // The closing character, e.g., '}' or ')'
|
| 66 |
propFormatter: (key: string, formattedValue: string, indent: string) => string,
|
| 67 |
+
valueFormatter: (value: unknown, baseIndent: string) => string,
|
| 68 |
): string {
|
| 69 |
if (Object.keys(newProperties).length === 0) {
|
| 70 |
return snippet;
|
|
|
|
| 215 |
"{", // The parameters are in an object literal
|
| 216 |
"}",
|
| 217 |
(key, value, indent) => `${indent}${key}: ${value},\n`, // JS object literal style
|
| 218 |
+
formatJsJsonValue,
|
| 219 |
);
|
| 220 |
}
|
| 221 |
// JS: HuggingFace InferenceClient (non-streaming)
|
|
|
|
| 228 |
"{", // The parameters are in an object literal
|
| 229 |
"}",
|
| 230 |
(key, value, indent) => `${indent}${key}: ${value},\n`, // JS object literal style
|
| 231 |
+
formatJsJsonValue,
|
| 232 |
);
|
| 233 |
}
|
| 234 |
// JS: OpenAI Client
|
|
|
|
| 244 |
"{", // The parameters are in an object literal
|
| 245 |
"}",
|
| 246 |
(key, value, indent) => `${indent}${key}: ${value},\n`,
|
| 247 |
+
formatJsJsonValue,
|
| 248 |
);
|
| 249 |
}
|
| 250 |
// Python: OpenAI or HuggingFace Client using client.chat.completions.create
|
|
|
|
| 259 |
const snakeKey = key.replace(/([A-Z])/g, "_$1").toLowerCase();
|
| 260 |
return `${indent}${snakeKey}=${value},\n`;
|
| 261 |
},
|
| 262 |
+
formatPythonValue,
|
| 263 |
);
|
| 264 |
}
|
| 265 |
// Python: requests example with query({...})
|
|
|
|
| 272 |
"}",
|
| 273 |
// Python dict keys are strings, values formatted for Python
|
| 274 |
(key, formattedValue, indent) => `${indent}"${key}": ${formattedValue},\n`,
|
| 275 |
+
formatPythonValue, // Use formatPythonValue for the values themselves
|
| 276 |
);
|
| 277 |
}
|
| 278 |
// Shell/curl (JSON content)
|
|
|
|
| 287 |
const snakeKey = key.replace(/([A-Z])/g, "_$1").toLowerCase();
|
| 288 |
return `${indent}"${snakeKey}": ${value},\n`;
|
| 289 |
},
|
| 290 |
+
formatJsJsonValue,
|
| 291 |
);
|
| 292 |
}
|
| 293 |
return snippet;
|
src/routes/api/models/+server.ts
CHANGED
|
@@ -145,7 +145,7 @@ export const GET: RequestHandler = async ({ fetch }) => {
|
|
| 145 |
} else {
|
| 146 |
textGenModels = await response.json();
|
| 147 |
}
|
| 148 |
-
})
|
| 149 |
);
|
| 150 |
}
|
| 151 |
|
|
@@ -158,7 +158,7 @@ export const GET: RequestHandler = async ({ fetch }) => {
|
|
| 158 |
} else {
|
| 159 |
imgText2TextModels = await response.json();
|
| 160 |
}
|
| 161 |
-
})
|
| 162 |
);
|
| 163 |
}
|
| 164 |
|
|
@@ -191,7 +191,7 @@ export const GET: RequestHandler = async ({ fetch }) => {
|
|
| 191 |
}
|
| 192 |
|
| 193 |
const models: Model[] = [...textGenModels, ...imgText2TextModels].filter(
|
| 194 |
-
m => m.inferenceProviderMapping.length > 0
|
| 195 |
);
|
| 196 |
models.sort((a, b) => a.id.toLowerCase().localeCompare(b.id.toLowerCase()));
|
| 197 |
|
|
@@ -209,7 +209,7 @@ export const GET: RequestHandler = async ({ fetch }) => {
|
|
| 209 |
console.log(
|
| 210 |
`Cache updated: ${models.length} models, status: ${cacheStatus}, ` +
|
| 211 |
`failed tokenizers: ${newFailedTokenizers.length}, ` +
|
| 212 |
-
`API failures: text=${newFailedApiCalls.textGeneration}, img=${newFailedApiCalls.imageTextToText}
|
| 213 |
);
|
| 214 |
|
| 215 |
return createResponse({ models });
|
|
|
|
| 145 |
} else {
|
| 146 |
textGenModels = await response.json();
|
| 147 |
}
|
| 148 |
+
}),
|
| 149 |
);
|
| 150 |
}
|
| 151 |
|
|
|
|
| 158 |
} else {
|
| 159 |
imgText2TextModels = await response.json();
|
| 160 |
}
|
| 161 |
+
}),
|
| 162 |
);
|
| 163 |
}
|
| 164 |
|
|
|
|
| 191 |
}
|
| 192 |
|
| 193 |
const models: Model[] = [...textGenModels, ...imgText2TextModels].filter(
|
| 194 |
+
m => m.inferenceProviderMapping.length > 0,
|
| 195 |
);
|
| 196 |
models.sort((a, b) => a.id.toLowerCase().localeCompare(b.id.toLowerCase()));
|
| 197 |
|
|
|
|
| 209 |
console.log(
|
| 210 |
`Cache updated: ${models.length} models, status: ${cacheStatus}, ` +
|
| 211 |
`failed tokenizers: ${newFailedTokenizers.length}, ` +
|
| 212 |
+
`API failures: text=${newFailedApiCalls.textGeneration}, img=${newFailedApiCalls.imageTextToText}`,
|
| 213 |
);
|
| 214 |
|
| 215 |
return createResponse({ models });
|