Thomas G. Lopes commited on
Commit
7d76168
·
1 Parent(s): 881698e

fix canvas perf

Browse files
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.2.4",
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.2.4
22
- version: 1.2.4(svelte@5.38.10)
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.2.4':
1235
- resolution: {integrity: sha512-CygKmc3t+KevPdx9VEWa6Q0O7DegJ6qzYrOH5dQo5zp9Inm2cYAZpkUuk64ry9Djw/gwy7EvrJTjyXetuvBGOg==}
1236
  peerDependencies:
1237
  svelte: ^5.25.0
1238
 
1239
- '@xyflow/system@0.0.68':
1240
- resolution: {integrity: sha512-QDG2wxIG4qX+uF8yzm1ULVZrcXX3MxPBoxv7O52FWsX87qIImOqifUhfa/TwsvLdzn7ic2DDBH1uI8TKbdNTYA==}
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.2.4(svelte@5.38.10)':
4435
  dependencies:
4436
  '@svelte-put/shortcut': 4.1.0(svelte@5.38.10)
4437
- '@xyflow/system': 0.0.68
4438
  svelte: 5.38.10
4439
 
4440
- '@xyflow/system@0.0.68':
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 || this.remote.length > 0) {
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
- <SvelteFlow
61
- bind:nodes={
62
- () => derivedNodes,
63
- v => {
64
- derivedNodes = v;
65
- throttledSave(v);
 
 
66
  }
67
- }
68
- bind:edges={edges.current}
69
- fitView
70
- {nodeTypes}
71
- defaultEdgeOptions={edgeOptions}
72
- >
73
- <MiniMap pannable zoomable class="rounded-xl border border-gray-200 bg-white shadow-sm" />
74
- <Controls class="rounded-xl border border-gray-200 bg-white shadow-sm" />
75
- <Background gap={20} size={1} />
76
- </SvelteFlow>
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;