Fraser commited on
Commit
568021d
·
1 Parent(s): de7bb17
package-lock.json CHANGED
@@ -9,7 +9,9 @@
9
  "version": "0.0.0",
10
  "dependencies": {
11
  "@imgly/background-removal": "^1.7.0",
12
- "dexie": "^4.0.11"
 
 
13
  },
14
  "devDependencies": {
15
  "@sveltejs/vite-plugin-svelte": "^5.0.3",
@@ -1168,6 +1170,12 @@
1168
  "undici-types": "~7.8.0"
1169
  }
1170
  },
 
 
 
 
 
 
1171
  "node_modules/@types/statuses": {
1172
  "version": "2.0.6",
1173
  "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz",
@@ -1892,6 +1900,18 @@
1892
  "node": ">=8"
1893
  }
1894
  },
 
 
 
 
 
 
 
 
 
 
 
 
1895
  "node_modules/is-node-process": {
1896
  "version": "1.2.0",
1897
  "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz",
@@ -2111,6 +2131,35 @@
2111
  "optional": true,
2112
  "peer": true
2113
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2114
  "node_modules/path-to-regexp": {
2115
  "version": "6.3.0",
2116
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
@@ -2289,6 +2338,15 @@
2289
  "optional": true,
2290
  "peer": true
2291
  },
 
 
 
 
 
 
 
 
 
2292
  "node_modules/rollup": {
2293
  "version": "4.45.1",
2294
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz",
 
9
  "version": "0.0.0",
10
  "dependencies": {
11
  "@imgly/background-removal": "^1.7.0",
12
+ "dexie": "^4.0.11",
13
+ "p-retry": "^6.2.1",
14
+ "p-timeout": "^6.1.4"
15
  },
16
  "devDependencies": {
17
  "@sveltejs/vite-plugin-svelte": "^5.0.3",
 
1170
  "undici-types": "~7.8.0"
1171
  }
1172
  },
1173
+ "node_modules/@types/retry": {
1174
+ "version": "0.12.2",
1175
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz",
1176
+ "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==",
1177
+ "license": "MIT"
1178
+ },
1179
  "node_modules/@types/statuses": {
1180
  "version": "2.0.6",
1181
  "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz",
 
1900
  "node": ">=8"
1901
  }
1902
  },
1903
+ "node_modules/is-network-error": {
1904
+ "version": "1.1.0",
1905
+ "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz",
1906
+ "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==",
1907
+ "license": "MIT",
1908
+ "engines": {
1909
+ "node": ">=16"
1910
+ },
1911
+ "funding": {
1912
+ "url": "https://github.com/sponsors/sindresorhus"
1913
+ }
1914
+ },
1915
  "node_modules/is-node-process": {
1916
  "version": "1.2.0",
1917
  "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz",
 
2131
  "optional": true,
2132
  "peer": true
2133
  },
2134
+ "node_modules/p-retry": {
2135
+ "version": "6.2.1",
2136
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz",
2137
+ "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==",
2138
+ "license": "MIT",
2139
+ "dependencies": {
2140
+ "@types/retry": "0.12.2",
2141
+ "is-network-error": "^1.0.0",
2142
+ "retry": "^0.13.1"
2143
+ },
2144
+ "engines": {
2145
+ "node": ">=16.17"
2146
+ },
2147
+ "funding": {
2148
+ "url": "https://github.com/sponsors/sindresorhus"
2149
+ }
2150
+ },
2151
+ "node_modules/p-timeout": {
2152
+ "version": "6.1.4",
2153
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz",
2154
+ "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==",
2155
+ "license": "MIT",
2156
+ "engines": {
2157
+ "node": ">=14.16"
2158
+ },
2159
+ "funding": {
2160
+ "url": "https://github.com/sponsors/sindresorhus"
2161
+ }
2162
+ },
2163
  "node_modules/path-to-regexp": {
2164
  "version": "6.3.0",
2165
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
 
2338
  "optional": true,
2339
  "peer": true
2340
  },
2341
+ "node_modules/retry": {
2342
+ "version": "0.13.1",
2343
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
2344
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
2345
+ "license": "MIT",
2346
+ "engines": {
2347
+ "node": ">= 4"
2348
+ }
2349
+ },
2350
  "node_modules/rollup": {
2351
  "version": "4.45.1",
2352
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz",
package.json CHANGED
@@ -26,6 +26,8 @@
26
  },
27
  "dependencies": {
28
  "@imgly/background-removal": "^1.7.0",
29
- "dexie": "^4.0.11"
 
 
30
  }
31
  }
 
26
  },
27
  "dependencies": {
28
  "@imgly/background-removal": "^1.7.0",
29
+ "dexie": "^4.0.11",
30
+ "p-retry": "^6.2.1",
31
+ "p-timeout": "^6.1.4"
32
  }
33
  }
src/lib/components/PicletGenerator/PicletGenerator.svelte CHANGED
@@ -10,6 +10,7 @@
10
  import { savePicletInstance, generatedDataToPicletInstance } from '$lib/db/piclets';
11
  import { PicletType, TYPE_DATA } from '$lib/types/picletTypes';
12
  import { EncounterService } from '$lib/db/encounterService';
 
13
 
14
  interface Props extends PicletGeneratorProps {
15
  // Trainer mode props
@@ -311,12 +312,12 @@ Format your response exactly as follows:
311
  console.log('Generating monster concept with qwen3...');
312
 
313
  // Call the add_message function (fn_index 13)
314
- const output = await qwenClient.predict(13, [
315
  conceptPrompt, // input_value
316
  defaultSettings, // settings_form_value
317
  thinkingBtnState, // thinking_btn_state_value
318
  defaultState // state_value
319
- ]);
320
 
321
  console.log('Qwen3 concept response:', output);
322
 
@@ -408,12 +409,12 @@ Create a concise visual description (1-3 sentences, max 100 words). Focus only o
408
  console.log('Generating image prompt with qwen3...');
409
 
410
  // Call the add_message function (fn_index 13)
411
- const output = await qwenClient.predict(13, [
412
  imagePromptPrompt, // input_value
413
  defaultSettings, // settings_form_value
414
  thinkingBtnState, // thinking_btn_state_value
415
  defaultState // state_value
416
- ]);
417
 
418
  console.log('Qwen3 image prompt response:', output);
419
 
@@ -770,12 +771,12 @@ Write your response within \`\`\`json\`\`\``;
770
  };
771
 
772
  // Call the add_message function (fn_index 13)
773
- const output = await qwenClient.predict(13, [
774
  statsPrompt, // input_value
775
  defaultSettings, // settings_form_value
776
  thinkingBtnState, // thinking_btn_state_value
777
  defaultState // state_value
778
- ]);
779
 
780
  console.log('Qwen3 stats response:', output);
781
 
 
10
  import { savePicletInstance, generatedDataToPicletInstance } from '$lib/db/piclets';
11
  import { PicletType, TYPE_DATA } from '$lib/types/picletTypes';
12
  import { EncounterService } from '$lib/db/encounterService';
13
+ import { withQwenTimeout } from '$lib/utils/qwenTimeout';
14
 
15
  interface Props extends PicletGeneratorProps {
16
  // Trainer mode props
 
312
  console.log('Generating monster concept with qwen3...');
313
 
314
  // Call the add_message function (fn_index 13)
315
+ const output = await withQwenTimeout(() => qwenClient.predict(13, [
316
  conceptPrompt, // input_value
317
  defaultSettings, // settings_form_value
318
  thinkingBtnState, // thinking_btn_state_value
319
  defaultState // state_value
320
+ ]));
321
 
322
  console.log('Qwen3 concept response:', output);
323
 
 
409
  console.log('Generating image prompt with qwen3...');
410
 
411
  // Call the add_message function (fn_index 13)
412
+ const output = await withQwenTimeout(() => qwenClient.predict(13, [
413
  imagePromptPrompt, // input_value
414
  defaultSettings, // settings_form_value
415
  thinkingBtnState, // thinking_btn_state_value
416
  defaultState // state_value
417
+ ]));
418
 
419
  console.log('Qwen3 image prompt response:', output);
420
 
 
771
  };
772
 
773
  // Call the add_message function (fn_index 13)
774
+ const output = await withQwenTimeout(() => qwenClient.predict(13, [
775
  statsPrompt, // input_value
776
  defaultSettings, // settings_form_value
777
  thinkingBtnState, // thinking_btn_state_value
778
  defaultState // state_value
779
+ ]));
780
 
781
  console.log('Qwen3 stats response:', output);
782
 
src/lib/utils/qwenTimeout.ts ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pRetry, { AbortError } from 'p-retry';
2
+ import pTimeout from 'p-timeout';
3
+
4
+ export async function withQwenTimeout<T>(
5
+ fn: () => Promise<T>,
6
+ { totalTimeout = 180_000, retries = 2 } = {}
7
+ ): Promise<T> {
8
+ return pRetry(
9
+ () => pTimeout(fn(), { milliseconds: totalTimeout }),
10
+ {
11
+ retries,
12
+ onFailedAttempt: (error) => {
13
+ console.error(`qwen3 attempt #${error.attemptNumber} failed: ${error.message}`);
14
+ if (error.retriesLeft === 0) {
15
+ console.error('qwen3 max retries reached, giving up');
16
+ }
17
+ }
18
+ }
19
+ );
20
+ }