Spaces:
Runtime error
Runtime error
Thomas G. Lopes
commited on
Commit
·
7d76168
1
Parent(s):
881698e
fix canvas perf
Browse files- package.json +1 -1
- pnpm-lock.yaml +9 -9
- src/lib/state/models.svelte.ts +9 -1
- src/routes/canvas/+page.svelte +21 -16
- src/routes/canvas/chat-node.svelte +0 -2
package.json
CHANGED
@@ -80,7 +80,7 @@
|
|
80 |
"@dagrejs/dagre": "^1.1.5",
|
81 |
"@modelcontextprotocol/sdk": "^1.13.3",
|
82 |
"@tailwindcss/typography": "^0.5.16",
|
83 |
-
"@xyflow/svelte": "^1.
|
84 |
"dequal": "^2.0.3",
|
85 |
"eslint-plugin-svelte": "^3.12.2",
|
86 |
"marked": "^16.1.2",
|
|
|
80 |
"@dagrejs/dagre": "^1.1.5",
|
81 |
"@modelcontextprotocol/sdk": "^1.13.3",
|
82 |
"@tailwindcss/typography": "^0.5.16",
|
83 |
+
"@xyflow/svelte": "^1.3.0",
|
84 |
"dequal": "^2.0.3",
|
85 |
"eslint-plugin-svelte": "^3.12.2",
|
86 |
"marked": "^16.1.2",
|
pnpm-lock.yaml
CHANGED
@@ -18,8 +18,8 @@ importers:
|
|
18 |
specifier: ^0.5.16
|
19 |
version: 0.5.16(tailwindcss@4.0.9)
|
20 |
'@xyflow/svelte':
|
21 |
-
specifier: ^1.
|
22 |
-
version: 1.
|
23 |
dequal:
|
24 |
specifier: ^2.0.3
|
25 |
version: 2.0.3
|
@@ -1231,13 +1231,13 @@ packages:
|
|
1231 |
'@vitest/utils@3.1.4':
|
1232 |
resolution: {integrity: sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==}
|
1233 |
|
1234 |
-
'@xyflow/svelte@1.
|
1235 |
-
resolution: {integrity: sha512-
|
1236 |
peerDependencies:
|
1237 |
svelte: ^5.25.0
|
1238 |
|
1239 |
-
'@xyflow/system@0.0.
|
1240 |
-
resolution: {integrity: sha512
|
1241 |
|
1242 |
abort-controller@3.0.0:
|
1243 |
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
|
@@ -4431,13 +4431,13 @@ snapshots:
|
|
4431 |
loupe: 3.1.3
|
4432 |
tinyrainbow: 2.0.0
|
4433 |
|
4434 |
-
'@xyflow/svelte@1.
|
4435 |
dependencies:
|
4436 |
'@svelte-put/shortcut': 4.1.0(svelte@5.38.10)
|
4437 |
-
'@xyflow/system': 0.0.
|
4438 |
svelte: 5.38.10
|
4439 |
|
4440 |
-
'@xyflow/system@0.0.
|
4441 |
dependencies:
|
4442 |
'@types/d3-drag': 3.0.7
|
4443 |
'@types/d3-interpolate': 3.0.4
|
|
|
18 |
specifier: ^0.5.16
|
19 |
version: 0.5.16(tailwindcss@4.0.9)
|
20 |
'@xyflow/svelte':
|
21 |
+
specifier: ^1.3.0
|
22 |
+
version: 1.3.0(svelte@5.38.10)
|
23 |
dequal:
|
24 |
specifier: ^2.0.3
|
25 |
version: 2.0.3
|
|
|
1231 |
'@vitest/utils@3.1.4':
|
1232 |
resolution: {integrity: sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==}
|
1233 |
|
1234 |
+
'@xyflow/svelte@1.3.0':
|
1235 |
+
resolution: {integrity: sha512-WWFb8cCzFt1ZpUl8exEaG0uoKAr7Ib7I286vhoz/fKQx5idiHhOVOjhLUXKVo3XZBsR+SvHrBp30qBD2SBRmAQ==}
|
1236 |
peerDependencies:
|
1237 |
svelte: ^5.25.0
|
1238 |
|
1239 |
+
'@xyflow/system@0.0.69':
|
1240 |
+
resolution: {integrity: sha512-+KYwHDnsapZQ1xSgsYwOKYN93fUR770LwfCT5qrvcmzoMaabO1rHa6twiEk7E5VUIceWciF8ukgfq9JC83B5jQ==}
|
1241 |
|
1242 |
abort-controller@3.0.0:
|
1243 |
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
|
|
|
4431 |
loupe: 3.1.3
|
4432 |
tinyrainbow: 2.0.0
|
4433 |
|
4434 |
+
'@xyflow/svelte@1.3.0(svelte@5.38.10)':
|
4435 |
dependencies:
|
4436 |
'@svelte-put/shortcut': 4.1.0(svelte@5.38.10)
|
4437 |
+
'@xyflow/system': 0.0.69
|
4438 |
svelte: 5.38.10
|
4439 |
|
4440 |
+
'@xyflow/system@0.0.69':
|
4441 |
dependencies:
|
4442 |
'@types/d3-drag': 3.0.7
|
4443 |
'@types/d3-interpolate': 3.0.4
|
src/lib/state/models.svelte.ts
CHANGED
@@ -31,11 +31,19 @@ class Models {
|
|
31 |
}
|
32 |
}
|
33 |
|
|
|
|
|
|
|
|
|
34 |
async load() {
|
35 |
-
if (this.loading
|
36 |
return await this.loading;
|
37 |
}
|
38 |
|
|
|
|
|
|
|
|
|
39 |
this.loading = Promise.all([getModels(), getRouterData()]).then(([models, data]) => {
|
40 |
this.remote = models;
|
41 |
this.routerData = data;
|
|
|
31 |
}
|
32 |
}
|
33 |
|
34 |
+
get ready() {
|
35 |
+
return this.loading === null && this.remote.length > 0;
|
36 |
+
}
|
37 |
+
|
38 |
async load() {
|
39 |
+
if (this.loading !== null) {
|
40 |
return await this.loading;
|
41 |
}
|
42 |
|
43 |
+
if (this.remote.length > 0) {
|
44 |
+
return;
|
45 |
+
}
|
46 |
+
|
47 |
this.loading = Promise.all([getModels(), getRouterData()]).then(([models, data]) => {
|
48 |
this.remote = models;
|
49 |
this.routerData = data;
|
src/routes/canvas/+page.svelte
CHANGED
@@ -7,6 +7,7 @@
|
|
7 |
import IconAdd from "~icons/lucide/plus";
|
8 |
import ChatNode from "./chat-node.svelte";
|
9 |
import { edges, nodes } from "./state.js";
|
|
|
10 |
|
11 |
const nodeTypes = { chat: ChatNode } as const;
|
12 |
|
@@ -34,6 +35,8 @@
|
|
34 |
const throttledSave = useDebounce((n: Node[]) => {
|
35 |
nodes.current = n;
|
36 |
}, 100);
|
|
|
|
|
37 |
</script>
|
38 |
|
39 |
<div class="h-screen w-screen bg-gray-50">
|
@@ -57,21 +60,23 @@
|
|
57 |
</button>
|
58 |
</header>
|
59 |
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
|
|
|
|
66 |
}
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
</div>
|
|
|
7 |
import IconAdd from "~icons/lucide/plus";
|
8 |
import ChatNode from "./chat-node.svelte";
|
9 |
import { edges, nodes } from "./state.js";
|
10 |
+
import { models } from "$lib/state/models.svelte";
|
11 |
|
12 |
const nodeTypes = { chat: ChatNode } as const;
|
13 |
|
|
|
35 |
const throttledSave = useDebounce((n: Node[]) => {
|
36 |
nodes.current = n;
|
37 |
}, 100);
|
38 |
+
|
39 |
+
await models.load();
|
40 |
</script>
|
41 |
|
42 |
<div class="h-screen w-screen bg-gray-50">
|
|
|
60 |
</button>
|
61 |
</header>
|
62 |
|
63 |
+
{#if models.ready}
|
64 |
+
<SvelteFlow
|
65 |
+
bind:nodes={
|
66 |
+
() => derivedNodes,
|
67 |
+
v => {
|
68 |
+
derivedNodes = v;
|
69 |
+
throttledSave(v);
|
70 |
+
}
|
71 |
}
|
72 |
+
bind:edges={edges.current}
|
73 |
+
fitView
|
74 |
+
{nodeTypes}
|
75 |
+
defaultEdgeOptions={edgeOptions}
|
76 |
+
>
|
77 |
+
<MiniMap pannable zoomable class="rounded-xl border border-gray-200 bg-white shadow-sm" />
|
78 |
+
<Controls class="rounded-xl border border-gray-200 bg-white shadow-sm" />
|
79 |
+
<Background gap={20} size={1} />
|
80 |
+
</SvelteFlow>
|
81 |
+
{/if}
|
82 |
</div>
|
src/routes/canvas/chat-node.svelte
CHANGED
@@ -22,8 +22,6 @@
|
|
22 |
};
|
23 |
let { id, data }: Props = $props();
|
24 |
|
25 |
-
await models.load();
|
26 |
-
|
27 |
let { updateNodeData, updateNode, getNode } = useSvelteFlow();
|
28 |
onMount(() => {
|
29 |
if (!data.modelId) data.modelId = models.trending[0]?.id;
|
|
|
22 |
};
|
23 |
let { id, data }: Props = $props();
|
24 |
|
|
|
|
|
25 |
let { updateNodeData, updateNode, getNode } = useSvelteFlow();
|
26 |
onMount(() => {
|
27 |
if (!data.modelId) data.modelId = models.trending[0]?.id;
|