Compare commits

..
Author SHA1 Message Date
Brandon Thomas bc32d7c2ee cleanup 2026-04-02 00:31:49 -04:00
Brandon Thomas bf0703f0c1 refactor web errors with cause + notification details 2026-04-02 00:20:23 -04:00
Brandon Thomas c7943bce59 AdvancedCommonWebError with wrapped errors 2026-04-01 23:41:51 -04:00
Brandon Thomas c5f62daa2b categorize seedance credits error (#1285) 2026-04-01 22:51:25 -04:00
bflatastic 7122e4507f fixed issue where duration isn't passed through when clicking on recreate 2026-04-02 09:35:44 +07:00
Tanish Manku 238cb10499 Add copy prompt button and prompt preview to failed task notifications (#1284)
- Copy button on failed task cards copies the prompt to clipboard with a
3s check/green feedback
- Prompt preview row with marquee scroll on hover (only when text
overflows), tooltip showing full prompt up to 300 chars
- Fix dismiss and action button icon centering across all card types
(InProgress, Completed, Failed)
- Add marquee keyframe animation to tailwind.config.ts
2026-04-01 19:08:43 -07:00
Brandon Thomas 1ebb124f05 cleaned up pager (#1283) 2026-04-01 22:00:38 -04:00
Brandon Thomas e7bb263755 mysql backup tool 2026-04-01 13:15:27 -04:00
Tanish Manku bbfea2ae96 Code cleanup: Delete PageEdit dead code and migrate shared types to ui-pagedraw (#1281)
PageEdit was never rendered in the app. Removes all PageEdit files
(~4000 lines) and migrates the shared types (BaseSelectorImage,
ImageBundle) and HistoryStack component to @storyteller/ui-pagedraw
which already owns the canonical definitions.
2026-04-01 09:29:17 -07:00
BFlat 3bc55c761c footnote update pricing apge 2026-04-01 22:45:42 +07:00
BFlat 8348a91693 show seedance in pricing table 2026-04-01 21:55:11 +07:00
BFlat d1adc0b179 website footer reddit link 2026-04-01 21:51:53 +07:00
BFlat c0ac3cbc9c pricing plan description updated 2026-04-01 20:03:59 +07:00
Brandon Thomas 0a13d36070 no more "free user downgrade" since we're not giving away nano banana… (#1279)
… pro anymore
2026-04-01 03:00:00 -04:00
Brandon Thomas 8662e79824 use tested typesafe fal bindings in webhook (#1278)
wip - still needs tested extractors for image, video, etc.
2026-04-01 02:46:21 -04:00
Brandon Thomas dc30cf9669 fal webhooks - tested cases for error extraction (#1277) 2026-04-01 02:21:44 -04:00
Tanish Manku b09a0fd854 Drag-N-Drop assets into Artcraft to upload them (#1231) 2026-03-31 21:05:38 -04:00
Brandon Thomas 400bccc155 more claude config files (#1276) 2026-03-31 19:22:45 -04:00
Tanish Manku 11011dacaf 2D: Add blank canvas option with preset sizes (#1275) 2026-03-31 15:28:22 -07:00
Tanish Manku 2f73e861d1 2D: Make PageDraw a self-contained lib (#1244)
Moves PageDraw from artcraft app to a component lib, leaving an adapter
implementation and import behind instead
2026-03-31 14:43:21 -07:00
Brandon Thomas 0151a2e28d fix password null bytes paging (#1273) 2026-03-31 14:55:10 -04:00
Brandon Thomas 12d3f82fe2 fal handle webhook errors (#1272) 2026-03-31 10:50:52 -04:00
Brandon Thomas 4489c90125 fal webhook and seedance job alerting with additonal context (#1267) 2026-03-31 06:22:27 -04:00
Brandon Thomas fd54477f73 page on seedance jobs (#1266)
also fix threading on video-thumbnail-job
2026-03-31 05:01:12 -04:00
Brandon Thomas c093603b3d config crates for sharing between services (#1265) 2026-03-31 04:01:34 -04:00
Brandon Thomas a9fb97d720 video-thumbnail-job alerts (#1264) 2026-03-31 03:23:58 -04:00
Brandon Thomas 3d12be2469 don't write db if user already has flags 2026-03-31 02:29:23 -04:00
Brandon Thomas e9938f6c93 fix login paging with sentinel value passwords (#1263) 2026-03-31 02:18:56 -04:00
Brandon Thomas 7e2d7048b1 health check page and health check thread page, mod pages have message + priority (#1262) 2026-03-31 01:22:28 -04:00
Brandon Thomas 0c2b800494 increase username randomness to stop pages (#1261)
We were getting several username collisions a day under the old
algorithm
2026-03-31 00:31:22 -04:00
Brandon Thomas a2a9b3b7de more pager updates to fix spammy pager (#1260) 2026-03-30 22:36:22 -04:00
Brandon Thomas 67df86e54e pager: event deduplication, more data, and cleanup (#1259) 2026-03-30 21:30:57 -04:00
Brandon Thomas dbe42447af oncall: fix paging on users not being logged in (#1258) 2026-03-30 20:27:15 -04:00
Brandon Thomas 37667be20c postman configs 2026-03-30 18:22:57 -04:00
Brandon Thomas b4d68d73ff CLAUDE update 2026-03-30 18:09:30 -04:00
Brandon Thomas 65f3a0e2d0 move postman collections 2026-03-30 18:04:24 -04:00
Brandon Thomas e71c006a63 postman collections (#1257) 2026-03-30 18:03:17 -04:00
Brandon Thomas 5224da1968 characters: part 1 (schema, routes, API) (#1255)
- API first draft is done
- Schema is not quite done
- Queries obviously not ready
2026-03-30 14:33:09 -04:00
Brandon Thomas c3dfbb1698 character api (#1250) 2026-03-29 09:27:28 -04:00
BFlat 48d69449c7 omni stuff implementation (#1249) 2026-03-29 19:59:57 +07:00
BFlat 20d7e3bf31 generations gallery on the website (#1233) 2026-03-29 09:42:00 +07:00
Brandon Thomas 505766b237 omni gen APIs for image and video (part one) (#1246) 2026-03-28 20:29:01 -04:00
BFlat d462f65891 per model promptbox char limit and text area expand button (#1241) 2026-03-27 23:16:00 +07:00
Brandon Thomas 827bbc613f more common enums (#1239)
this will be useful with an omni-api
2026-03-27 07:46:46 -04:00
Brandon Thomas 2ba11c9b3d add more support debugging info (#1238) 2026-03-26 02:36:00 -04:00
Brandon Thomas 824d1f22ab add hostnames to pages (#1237) 2026-03-26 02:00:17 -04:00
Brandon Thomas a3c03e3d99 kinovi uses the old hostname for static assets (#1236) 2026-03-26 01:16:33 -04:00
Brandon Thomas 29ef6daeed alerting middleware (#1234) 2026-03-26 00:11:18 -04:00
BFlat 602d7d33a7 stretch all promptboxes for bigger field to accommodate more image re… (#1232)
…fs etc.
2026-03-26 07:35:49 +07:00
Brandon Thomas 7ceb002fd3 no-op pager (#1229) 2026-03-25 19:28:37 -04:00
Brandon Thomas ed1ce11dc0 add paging to enqueue failures (oncall support) (#1228)
It's SRE time!
2026-03-25 19:05:05 -04:00
Brandon Thomas 527917c45c pager subsystem (#1226) 2026-03-25 17:19:24 -04:00
Brandon Thomas 0274450a2b rootly client (#1225) 2026-03-25 14:09:58 -04:00
Tanish Manku 5e150db37e 3D: world/local transform space toggle for 3D editor gizmo (#1223)
Defaults translate and rotate to world space. X key and toolbar pill
toggle between world and local. Scale mode is locked to local space.
2026-03-25 09:05:15 -07:00
BFlat 68f8a339af temporary prompt info and image ref for task queue generations (#1220)
<img width="490" height="683"
alt="{68D2BE71-2E3F-4AB3-BD40-8A1BED5561F6}"
src="https://github.com/user-attachments/assets/edcc6090-3f78-4512-8314-474116f93898"
/>

makes it easier to differentiate which generation task is which by
prompt hover and image ref thumbnails
2026-03-25 20:29:54 +07:00
BFlat 338b0b6313 refresh credits count on refund from failed generation (#1219) 2026-03-25 18:44:08 +07:00
BFlat 4e752d7a9e button to copy text prompt directly from image gen history and added … (#1218)
…icons next to model name

<img width="229" height="78"
alt="{C9321025-FD31-4C46-A096-38E006009081}"
src="https://github.com/user-attachments/assets/62bce67f-9bec-4834-80af-7e7ea2bdbc9c"
/>
2026-03-25 18:32:43 +07:00
Tanish Manku 32e01a415b Move character ordering and AI Trump category in 3D presets (#1217)
Storyboy, Story Girl, Knight, and News Anchor are now pinned to the
front of the Characters row in that order. AI Trump is moved from
Characters into Memes. Both are resolved client-side after the featured
items fetch by matching on lowercased item names.
2026-03-25 00:42:48 -07:00
Brandon Thomas 389b1c3d17 update website download links 2026-03-25 00:39:01 -04:00
Brandon Thomas f9148d3cf6 seedance 2 fast (#1215) 2026-03-25 00:26:19 -04:00
Brandon Thomas 64d66aa9f0 Batched Seedance 2.0 Job Polling (#1214) 2026-03-24 17:20:31 -04:00
Brandon Thomas 82695725cd seedance whitelist for faster generations (#1213) 2026-03-24 15:54:52 -04:00
Brandon Thomas 53f9032603 simplify seedance 2.0 handler flow 2026-03-24 14:43:29 -04:00
Brandon Thomas 69c03045fd .gitignore 2026-03-24 14:38:09 -04:00
Brandon Thomas e82f070d1d bump artcraft 0.19 -> 0.20 (#1212) 2026-03-24 14:30:32 -04:00
BFlat 459960e64f remove confusing system prompt toggle 2026-03-24 22:23:40 +07:00
BFlat d1266b7591 reprompt/recreate updated to use prompts api (#1208) 2026-03-24 21:59:38 +07:00
BFlat 4bdb1c89a4 password reset fail message 2026-03-24 16:59:22 +07:00
Brandon Thomas 4d53d9af18 mod user signup list (#1207) 2026-03-24 05:53:44 -04:00
Brandon Thomas 2bc00d7f80 richer errors for password reset failures (#1206) 2026-03-24 04:52:25 -04:00
Brandon Thomas f48cb41f21 plumb prompt duration for video models (#1205) 2026-03-24 03:53:05 -04:00
Brandon Thomas d24508aee9 alter prompts table durations (#1204) 2026-03-24 03:04:45 -04:00
Brandon Thomas 1985d9acd7 bump artcraft 0.18 -> 0.19 (#1203) 2026-03-24 02:31:44 -04:00
Brandon Thomas 0f90981f30 fix windows via anstyle-wincon downgrade (#1202) 2026-03-24 02:30:48 -04:00
Brandon Thomas 8d1ca743db bump artcraft 0.17 -> 0.18 (#1201) 2026-03-24 02:15:46 -04:00
Brandon Thomas 72403ad4d8 record prompt info (#1200) 2026-03-24 01:48:46 -04:00
Tanish Manku 8d731f1155 Text2Image - Image batches: Arrow key support (#1198) 2026-03-23 20:57:50 -07:00
Brandon Thomas 516d740e97 include class of model in prompt info 2026-03-23 21:53:00 -04:00
Brandon Thomas 95eeafd6f0 enrich prompts (#1197) 2026-03-23 21:50:18 -04:00
Brandon Thomas 0db5646deb prompts: new database columns (#1196) 2026-03-23 15:59:07 -04:00
Brandon Thomas ac839e2c39 remove enums crates (#1195)
I tried. I'll have to make a better attempt in the future to divorce DB
schema definitions from API definitions (and worse - API clients).
2026-03-23 14:43:57 -04:00
Brandon Thomas 65334e12be More notes on repo 2026-03-23 14:23:50 -04:00
Brandon Thomas 7e644c3e98 Root CLAUDE.md 2026-03-23 14:07:24 -04:00
BFlat bb3fe2df2d reprompt (recreate) button (#1194)
<img width="1219" height="790"
alt="{A15AF77F-C555-4C85-BC15-B4B8D44D2248}"
src="https://github.com/user-attachments/assets/ec4b52a2-68c4-42b0-88fc-00ee3b322321"
/>

A "recreate" button in the media lightbox modal.
On clicked, it will prefill the image or video promptbox with the same
model, prompt and ref images that was used to generate that media the
button was clicked from.

Temporary and doesnt support seedance video/audio ref yet.
2026-03-23 11:14:01 +07:00
Brandon Thomas a92ad2eb3a remove unused enum imports (#1192) 2026-03-22 18:27:00 -04:00
Brandon Thomas 78e7d08f04 all_variants enum methods (#1191) 2026-03-22 18:10:56 -04:00
Brandon Thomas be18036bf6 enums helper methods, cleanup (#1190) 2026-03-22 17:34:32 -04:00
Brandon Thomas 83a8852cef enums split - but just the enums (#1188) 2026-03-22 12:46:29 -04:00
BFlat afed8688a5 resiable image and video prompt boxes 2026-03-20 21:00:10 +07:00
BFlat 9d380decf9 seedance multi generations at a time (#1185) 2026-03-20 20:36:45 +07:00
BFlat 4905cdcd3d angles update 2026-03-20 20:20:50 +07:00
Brandon Thomas b709b6e764 remove fal.rs and move everything into fal_client (#1183) 2026-03-19 20:11:34 -04:00
Brandon Thomas 58d2665f0e seedance2pro -> kinovi domain name migration (#1181) 2026-03-19 13:49:43 -04:00
BFlat 72bf6738e1 website library filter links, added 3d, and video thumbnails to prope… (#1174)
…rly show
2026-03-19 13:21:19 +07:00
Brandon Thomas 1178bb7ebf update utoipa and swagger doc gen (#1171) 2026-03-18 22:49:04 -04:00
Brandon Thomas fea20c417c update builds to trigger only on relevant changes (#1170) 2026-03-18 22:07:20 -04:00
Brandon Thomas 5a07903870 organize root cargo.toml 2026-03-18 21:51:06 -04:00
Brandon Thomas 2063434304 centralized dependency configuration (#1169) 2026-03-18 21:45:42 -04:00
Brandon Thomas b386fd5d88 bump artcraft 0.16.0 -> 0.17.0 (#1168) 2026-03-18 21:19:31 -04:00
Brandon Thomas 1626dda8b4 fix windows builds (#1167) 2026-03-18 21:17:54 -04:00
Brandon Thomas ebe365703b refactor testing crates (#1166) 2026-03-18 21:06:46 -04:00
Brandon Thomas 5caa578b86 Bump ArtCraft 0.15 -> 0.16 (#1165) 2026-03-18 20:34:21 -04:00
Brandon Thomas 2da5fbcc58 cleanup refactor #2 (#1164)
- move a lot of "deprecated" crates so we don't use them
- kill several dead crates
- rename crates to be more semantic/clear
- roll back broken sha3 version bump
2026-03-18 20:32:50 -04:00
Tanish Manku 588650b1b5 2D: Ordered draw instead of Z-Index + Other improvements (#1163)
Paint/Mask cursor now draws properly regardless of canvas scale and drag
offset.
Inpainting now has its own brush with add and subtract actions.
A total node array is used for ordered-rendering of nodes, which fixes
the layer forward/backward operations.
2026-03-18 15:53:32 -07:00
Brandon Thomas 761bf832a5 bump misc dep versions (#1162)
Some deps require manual upgrade - will cycle back
2026-03-18 17:45:58 -04:00
Brandon Thomas df4d46cc9d rename both worldlabs crates (#1161)
- api client crate
- consumer client crate
2026-03-18 16:49:04 -04:00
Brandon Thomas 19599e00be still broken in google ads 2026-03-18 15:44:19 -04:00
Brandon Thomas 2f2ac350bc more redirects 2026-03-18 15:41:54 -04:00
Brandon Thomas bbd0871c04 google ads broken link 2026-03-18 15:40:32 -04:00
Brandon Thomas 7d20ac3d16 grab bag of refactoring, cleanup, etc. (#1160)
- rename seedance2pro crate
- deprecate methods
- remove smtp client
- etc.
2026-03-18 13:36:29 -04:00
Brandon Thomas f9c1201fc6 add thumbnail job sharding and logging (#1158) 2026-03-18 11:42:22 -04:00
Brandon Thomas 0ac57a5448 thumbnail job (#1157) 2026-03-18 02:59:18 -04:00
bflatastic b88f5c536b please upload mp4 file toast - video ref 2026-03-18 08:51:57 +07:00
bflatastic 7edba0d9d5 failed to upload toast for video ref 2026-03-18 08:40:30 +07:00
bflatastic 76ae56a051 updated to duration slider 2026-03-18 07:46:23 +07:00
bflatastic 75a92fe204 popover/dropdown to support scroll on smaller screen height 2026-03-18 07:22:54 +07:00
Tanish Manku 31c507a404 2D: Composite draw layer into ref image for default gen (#1156)
3D nodes and drawings on the canvas were missing from the reference
image sent to the model in the default generation path. The fix mirrors
the Nano Banana Pro approach: render a composite of the base image and
the draw layer, upload it via uploadSceneSnapshot, and pass it as
scene_image_media_token rather than putting editedImageToken in
image_media_tokens.
2026-03-17 14:59:21 -07:00
Brandon Thomas 42bb07c110 hide website image and video gen for now (it's slightly broken) (#1155) 2026-03-17 16:03:02 -04:00
Brandon Thomas 5afa81b57d alter media_files to include thumbnail information (#1154) 2026-03-17 15:42:44 -04:00
Brandon Thomas 81cadf35b0 fix compile error 2026-03-17 09:46:50 -04:00
BFlat d4b3579915 web image and video generations (#1146)
Image and video generation pages on getartcraft website.
2026-03-17 20:36:29 +07:00
Brandon Thomas 7cd8c0299b artcraft router: seedance (#1153)
add multiple providers to artcraft router for seedance
2026-03-16 22:43:50 -04:00
Brandon Thomas 87296752a5 Use muapi as backup (#1152)
Possible problem in our Seedance 2.0 provider means we need a backup.
This is here in case we need it.

Muapi is inferior for several reasons:

- Videos contain watermarks
- Videos cost 2x as much
- Not as many aspect ratio controls
- Not as many duration controls
- No starting frame / ending frame
- No video references
- No audio references

It does seem fast, however.
2026-03-16 17:15:53 -04:00
Brandon Thomas 1416c5cd17 bump 0.14 -> 0.15 2026-03-16 13:27:54 -04:00
BFlat de29444626 allow playing audio ref in seedance prompt input (#1151) 2026-03-16 22:02:39 +07:00
Brandon Thomas 41988a4462 plumb references to seedance (#1150) 2026-03-16 10:49:00 -04:00
BFlat 4c0c536fb0 video and audio references seedance 2.0 (#1121)
<img width="846" height="544" alt="image"
src="https://github.com/user-attachments/assets/1ca92a7e-1faa-47a4-b32c-24d9587aff61"
/>
<img width="374" height="308" alt="image"
src="https://github.com/user-attachments/assets/2331fc09-b576-4556-9a56-225d24eb30e1"
/>

Do not merge: awaiting backend.
2026-03-16 09:26:26 -04:00
bflatastic b15a5d532a angles history stack base thumbnail to use cdn image instead of blob 2026-03-16 19:55:30 +07:00
Brandon Thomas 8ae983ee32 seedance omni video (#1148) 2026-03-16 08:53:47 -04:00
bflatastic 279a79e60a angles local upload thumbnails not showing and get rid of double toast 2026-03-16 19:48:33 +07:00
bflatastic ebd2a276f9 body font updates and fixed title font in app 2026-03-14 15:52:02 +07:00
bflatastic 0d2f1cfa2c website and app font update 2026-03-14 13:13:34 +07:00
Tanish Manku 3592111019 Improve 2D (PageDraw) render stability and performance (#1143)
Generous use of caching used for react elements. Made a pretty
significant difference too.
Minor refactor to move helper functions outside instead of within
component tree.
2026-03-13 16:42:11 -07:00
Tanish Manku 9d12603d1f 2D Editor support for 3D objects (#1142)
3D objects can now be drag-n-dropped from gallery onto 2D canvas, with
support for scale, rotation and FOV changes.
History is tracks so changes support undo/redo as well.
2026-03-13 16:35:46 -07:00
bflatastic 8902f77a18 Show both enum failure reason and dynamic failure message in task queue 2026-03-14 04:18:40 +07:00
Brandon Thomas 6d91b5616f add failure messages to backend + tauri (#1141) 2026-03-13 13:45:54 -04:00
Brandon Thomas 3783c194e3 make job statuses forward- and backwards- compatible (#1140)
this could have possibly been breaking older clients
2026-03-13 10:44:29 -04:00
bflatastic b7770d5566 performance fix - thumbnails to load smaller images not full size 2026-03-13 13:17:05 +07:00
bflatastic 2fb1eb957b removed generation count blocker (image) 2026-03-13 09:30:09 +07:00
Brandon Thomas 9b4ffa7986 long lived url tech debt hurting local dev (#1139)
kill some local dev tech debt on url construction
2026-03-12 21:34:31 -04:00
bflatastic 2dca4884b1 seedance 2.0 temporary alerts 2026-03-12 22:22:23 +07:00
bflatastic 1d280ba2e0 build fix 3 2026-03-12 21:35:29 +07:00
bflatastic 777758dc16 build fix 2 2026-03-12 21:23:43 +07:00
bflatastic f2cf78514b build fix 2026-03-12 21:18:51 +07:00
BFlat c04586c785 genhub start mock to ui (#1138) 2026-03-12 21:12:46 +07:00
BFlat fd89d5ab39 Revert nextjs genhub (#1137) 2026-03-12 15:49:24 +07:00
BFlat bbfbc40147 fix react version mismatch genhub 2026-03-12 15:36:55 +07:00
BFlat 76d120916b downgrade nextjs version for genhub (#1136) 2026-03-12 15:30:16 +07:00
BFlat efb33bfe38 fix: replace bare libs/ import paths with workspace package names 2026-03-12 14:37:59 +07:00
BFlat e7d1d796e1 nx version fixed to before and path (#1135) 2026-03-12 14:29:52 +07:00
BFlat fc81854b99 genhub to use nextjs instead of vite for seo (#1134) 2026-03-12 11:14:41 +07:00
bflatastic 6e9981acc2 genhub netlify redirects 2026-03-12 01:40:12 +07:00
bflatastic 94637e0d0b netlify build file for genhub 2026-03-12 01:31:03 +07:00
bflatastic 04b6957dfd netlify build command for genhub 2026-03-12 01:24:32 +07:00
BFlat 6a0627a493 genhub init (#1133) 2026-03-12 01:21:54 +07:00
Brandon Thomas 6e2ed226d8 api docs 2026-03-11 12:19:06 -04:00
bflatastic 0c20a10a78 add models with missing name mapping 2026-03-11 23:05:30 +07:00
bflatastic 92bba52502 failure reason in task queue 2026-03-11 19:43:43 +07:00
bflatastic 6d3ec8bfee "Make 3D" button to not enqueue directly but go to 3D object page 2026-03-11 14:17:12 +07:00
Brandon Thomas c7744ae545 update oncall script 2026-03-11 00:36:12 -04:00
Brandon Thomas 65b97a7636 moderation: create wallet (#1131) 2026-03-11 00:14:03 -04:00
Brandon Thomas dd630c5993 tauri task failure reasons (#1130) 2026-03-10 23:27:55 -04:00
Brandon Thomas b39f208bd3 add robust job failure reasons to seedance (#1129) 2026-03-10 19:30:31 -04:00
Brandon Thomas 53f34061b6 CLI tool for support issues (#1128) 2026-03-10 17:06:38 -04:00
2636 changed files with 53615 additions and 127250 deletions
+47
View File
@@ -0,0 +1,47 @@
# API Conventions
## HTTP Handlers (Actix-Web)
Handlers in `storyteller_web` follow this structure:
1. **Request/Response types** with `#[derive(Deserialize/Serialize, ToSchema)]`
2. **Error enum** implementing `ResponseError`, `Display`, `Serialize`, `ToSchema`
3. **Handler function** annotated with `#[utoipa::path(...)]` for OpenAPI docs
4. Handler returns `Result<Json<Response>, ErrorType>`. Only use `Result<HttpResponse, ErrorType>` when you need to set headers/cookies.
### Error Types
- Use `CommonWebError` for simple handlers that only need standard HTTP error codes
- Use a custom error enum when you need endpoint-specific error variants (e.g. `LoginErrorType::InvalidCredentials`)
- Custom error enums MUST implement `ResponseError` (actix), `Display`, and `Serialize`
- When adding `From<RequireUserSessionError>` or similar conversions, implement them on `CommonWebError` in its own module (orphan rule)
- Error response bodies include: `success: false`, `error_code`, `error_code_str`
### Session/Auth
- `require_user_session_using_connection()` reuses an open DB connection (preferred)
- `require_user_session()` acquires its own connection (deprecated)
- `require_moderator()` for admin-only endpoints
### API Type Definitions
- Shared request/response types go in `artcraft_api_defs` crate (under `crates/api_clients/artcraft/artcraft_api_defs/`)
- Types that need `ResponseError` impl must stay in `storyteller_web` (orphan rule)
- New types must be added to `api_doc.rs` schemas (in storyteller-web) for Swagger generation
## Enums (Database-backed)
- Located in `crates/schema/public/enums/src/by_table/{table_name}/`
- Require manual `to_str()` and `from_str()` implementations
- Use `impl_enum_display_and_debug_using_to_str!` and `impl_mysql_enum_coders!` macros
- Add comprehensive tests: serialization, round-trip, variant count
- YOU CAN ADD NEW VALUES but DO NOT CHANGE EXISTING VALUES without a migration strategy
- Note that adding new values can break older versions of the Tauri desktop app that read
responses over Rust - make sure it consumes variants with an "Unknown(String)" variant
catch-all to future proof the APIs.
## Tokens (Primary Keys)
- Located in `crates/schema/public/tokens/src/tokens/`
- Opaque `String` wrappers with Stripe-like prefixes (e.g. `user_`, `mf_`)
- Use `impl_string_token!`, `impl_mysql_token_from_row!`, `impl_crockford_generator!` macros
+59
View File
@@ -0,0 +1,59 @@
# Code Style
## Rust
- Two spaces for indentation (not four)
- No minimum supported Rust version; use latest stable features freely
- `#[macro_use] extern crate serde_derive;` is used in binary crates; library crates use `use serde_derive::{Serialize, Deserialize};`
- Prefer `log` crate macros (`info!`, `warn!`, `error!`) over `println!`
- Use `anyhow::Result` / `AnyhowResult` for fallible functions in application code
- Enum Display/Debug: use `impl_enum_display_and_debug_using_to_str!` macro, not `derive_more::Display` (CLion doesn't understand it)
- Fields that are optional use the `maybe_` prefix: `maybe_creator_user_token`, `maybe_prompt_token`
- When implementing `fmt::Display` for error types, use the pattern: `write!(f, "{:?}", self)`
## File Layout (Top-to-Bottom Reading Order)
Organize code so a human reading top-to-bottom encounters the most important things first and
can drill down into details only when curious. Think of it like a newspaper: headline first,
then the story, then the fine print.
### Ordering within a file
1. **Constants** at the top, right after imports.
2. **The primary public type** (the main struct/enum the file is about) comes next.
A reader opening this file should immediately see what it defines.
3. **Supporting/subordinate types** (sub-structs, helper enums, serialization DTOs) go
below the primary type, not above it. Ask: "Would a reader need to know this type
exists before seeing the main type?" — if no, push it down.
4. **Type ordering for API types**: Request, then Response (success), then Error.
5. **`impl` blocks** after their type definitions.
### Ordering within an `impl` block
1. **Constructors** (`new`, `from_*`, `builder`) at the top.
2. **Public methods** next — these are the main entry points a reader cares about.
3. **Private helper methods** below public methods.
- Among helpers: place "meaty" helpers (substantial logic, direct continuations of the
public entry point) above "leaf" helpers (small formatters, simple lookups).
- A method that calls another method in the same file should appear *above* the method
it calls. This lets readers follow the call chain downward.
## Naming
- Handler functions: `{verb}_{noun}_handler` (e.g. `get_health_check_handler`, `login_handler`)
- Error enums: `{Feature}Error` (e.g. `FalWebhookError`, `HealthCheckError`)
- Request/response structs: `{Action}Request`, `{Action}Response`, `{Action}SuccessResponse`
- Path params: `{Action}PathInfo`
- Builder structs: `{Thing}Builder` with `set_` prefixed setters and a `build()` method
## Imports
- Group imports: std, external crates, internal workspace crates, `crate::` imports
- Use fully qualified paths for one-off references; `use` for repeated references
- Prefer specific imports over wildcards, except in `api_doc.rs` and test modules
## TypeScript / Frontend
- TypeScript with React, Vite, Zustand, Three.js
- Nx monorepo under `crates/frontend/`
- Two spaces for indentation
+27
View File
@@ -0,0 +1,27 @@
# Testing
## Running Tests
- Most crates: `cargo test -p {crate_name}`
- Crates using SQLx offline mode: `SQLX_OFFLINE=true cargo test -p {crate_name}`
- The `storyteller-web` and `mysql_queries` crates require `SQLX_OFFLINE=true` for compilation
- Use `cargo check -p {crate_name}` for fast compilation checks without running tests
## Test Patterns
- Tests live in `#[cfg(test)] mod tests { ... }` at the bottom of each file
- Group related tests in sub-modules: `mod explicit_checks`, `mod mechanical_checks`
- Enum tests should cover: serialization, deserialization, `to_str`/`from_str` round-trip, variant count
- Password/crypto tests: be mindful of computation cost, don't add too many bcrypt test cases
## What to Test
- New error types and their mappings
- Enum variant serialization stability (these are stored in the database)
- Hash/deduplication functions with known inputs
- Edge cases in parsers (empty input, missing fields, malformed data)
## What Not to Test
- Don't add integration tests that require a running database unless explicitly asked
- Don't add tests for simple struct construction or trivial getters
+14
View File
@@ -10,6 +10,20 @@ on:
#- $default-branch
- main
- test
# Only build when files that affect the Docker image change.
# This avoids expensive 15-25 min builds for docs-only or config-only changes.
paths:
# Individual files
- '.github/workflows/docker-publish-cpu.yml'
- 'Cargo.lock'
- 'Cargo.toml'
- 'build/service_cpu.Dockerfile'
# Directories
- '.sqlx/**'
- '_database/**'
- 'crates/**'
- 'includes/**'
- 'test_data/**'
env:
IMAGE_NAME: storyteller-rust
+2 -1
View File
@@ -36,8 +36,9 @@ script/socat_dev_database_connect.sh
# Python virtual envs (named by convention)
venv/
# Testing
# LLM Testing
/prompts/
/reports/
/requests/
# Scratch data
+4
View File
@@ -1,5 +1,9 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<codeStyleSettings language="Markdown">
<option name="RIGHT_MARGIN" value="100" />
<option name="WRAP_ON_TYPING" value="1" />
</codeStyleSettings>
<codeStyleSettings language="Rust">
<option name="RIGHT_MARGIN" value="180" />
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
@@ -1,12 +0,0 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO generic_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n job_type = ?,\n\n maybe_external_third_party = ?,\n maybe_external_third_party_id = ?,\n\n product_category = ?,\n inference_category = ?,\n\n maybe_model_type = NULL,\n maybe_model_token = NULL,\n\n maybe_input_source_token = NULL,\n maybe_input_source_token_type = NULL,\n\n maybe_download_url = NULL,\n maybe_cover_image_media_file_token = NULL,\n \n maybe_prompt_token = ?,\n\n maybe_raw_inference_text = NULL,\n\n maybe_inference_args = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n priority_level = 0,\n is_keepalive_required = FALSE,\n max_duration_seconds = 0,\n\n is_debug_request = FALSE,\n maybe_routing_tag = NULL,\n\n status = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 14
},
"nullable": []
},
"hash": "002cdb3d086f3b4181e2997befa54bd8516cb1d3d3bb6e389862695318d5c299"
}
@@ -1,12 +0,0 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO prompts\nSET\n token = ?,\n prompt_type = ?,\n\n maybe_creator_user_token = ?,\n \n maybe_model_type = ?,\n maybe_generation_provider = ?,\n\n maybe_positive_prompt = ?,\n maybe_negative_prompt = ?,\n \n maybe_other_args = ?,\n\n creator_ip_address = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 9
},
"nullable": []
},
"hash": "08f52f15acf6afc7091a525e3dc88f706c71c3579e5e81aa9903807d85f469ef"
}
@@ -1,6 +1,6 @@
{
"db_name": "SQLite",
"query": "\n SELECT\n id,\n task_status,\n task_type,\n model_type,\n provider,\n provider_job_id,\n frontend_caller,\n frontend_subscriber_id,\n frontend_subscriber_payload,\n on_complete_primary_media_file_token,\n on_complete_primary_media_file_class,\n on_complete_batch_token,\n on_complete_primary_media_file_cdn_url,\n on_complete_primary_media_file_thumbnail_url_template,\n created_at as \"created_at: DateTime<Utc>\",\n updated_at as \"updated_at: DateTime<Utc>\",\n completed_at as \"completed_at: DateTime<Utc>\"\n FROM tasks\n WHERE is_dismissed_by_user == 0\n ",
"query": "\n SELECT\n id,\n task_status,\n task_type,\n model_type,\n provider,\n provider_job_id,\n frontend_caller,\n frontend_subscriber_id,\n frontend_subscriber_payload,\n on_complete_primary_media_file_token,\n on_complete_primary_media_file_class,\n on_complete_batch_token,\n on_complete_primary_media_file_cdn_url,\n on_complete_primary_media_file_thumbnail_url_template,\n on_failure_type,\n on_failure_message,\n created_at as \"created_at: DateTime<Utc>\",\n updated_at as \"updated_at: DateTime<Utc>\",\n completed_at as \"completed_at: DateTime<Utc>\"\n FROM tasks\n WHERE is_dismissed_by_user == 0\n ",
"describe": {
"columns": [
{
@@ -74,18 +74,28 @@
"type_info": "Text"
},
{
"name": "created_at: DateTime<Utc>",
"name": "on_failure_type",
"ordinal": 14,
"type_info": "Text"
},
{
"name": "on_failure_message",
"ordinal": 15,
"type_info": "Text"
},
{
"name": "created_at: DateTime<Utc>",
"ordinal": 16,
"type_info": "Int64"
},
{
"name": "updated_at: DateTime<Utc>",
"ordinal": 15,
"ordinal": 17,
"type_info": "Int64"
},
{
"name": "completed_at: DateTime<Utc>",
"ordinal": 16,
"ordinal": 18,
"type_info": "Int64"
}
],
@@ -107,10 +117,12 @@
true,
true,
true,
true,
true,
false,
false,
true
]
},
"hash": "47f94c127abc20683b25c257aed3c2190b9bd29eb829d61392f08e10fd986767"
"hash": "2436eb7bf4b0e23a899311a67a77f71d89eb35461e2113e43cd9d221bfa91c9a"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO generic_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n job_type = ?,\n\n maybe_external_third_party = ?,\n maybe_external_third_party_id = ?,\n\n product_category = ?,\n inference_category = ?,\n\n maybe_model_type = NULL,\n maybe_model_token = NULL,\n\n maybe_input_source_token = NULL,\n maybe_input_source_token_type = NULL,\n\n maybe_download_url = NULL,\n maybe_cover_image_media_file_token = NULL,\n\n maybe_prompt_token = ?,\n\n maybe_raw_inference_text = NULL,\n\n maybe_inference_args = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n priority_level = 0,\n is_keepalive_required = FALSE,\n max_duration_seconds = 0,\n\n is_debug_request = FALSE,\n maybe_routing_tag = NULL,\n\n frontend_failure_category = ?,\n failure_reason = ?,\n\n status = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 16
},
"nullable": []
},
"hash": "29916e73a1784ea0b70ef4f637520b05efccc31e01840f681e9b042f82eb8f7e"
}
@@ -0,0 +1,168 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n u.id as `id: u64`,\n u.token as `token: tokens::tokens::users::UserToken`,\n u.username,\n u.display_name,\n u.username_is_not_customized as `username_is_not_customized: bool`,\n u.email_address,\n u.email_confirmed as `email_confirmed: bool`,\n u.is_without_password as `is_without_password: bool`,\n u.ip_address_creation,\n u.maybe_source as `maybe_source: enums::by_table::users::user_signup_source::UserSignupSource`,\n u.maybe_signup_method as `maybe_signup_method: enums::by_table::users::user_signup_method::UserSignupMethod`,\n u.created_at,\n u.maybe_referral_url,\n u.is_temporary as `is_temporary: bool`\nFROM users AS u\nWHERE\n u.id < ?\n AND u.user_deleted_at IS NULL\n AND u.mod_deleted_at IS NULL\nORDER BY u.id DESC\nLIMIT ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id: u64",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | PRIMARY_KEY | AUTO_INCREMENT",
"char_set": 63,
"max_size": 20
}
},
{
"ordinal": 1,
"name": "token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 3,
"name": "display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 4,
"name": "username_is_not_customized: bool",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 5,
"name": "email_address",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 6,
"name": "email_confirmed: bool",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 7,
"name": "is_without_password: bool",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 8,
"name": "ip_address_creation",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 9,
"name": "maybe_source: enums::by_table::users::user_signup_source::UserSignupSource",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 10,
"name": "maybe_signup_method: enums::by_table::users::user_signup_method::UserSignupMethod",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 11,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 12,
"name": "maybe_referral_url",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 13,
"name": "is_temporary: bool",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
}
],
"parameters": {
"Right": 2
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true,
false,
true,
false
]
},
"hash": "2fe10ae5a2d013e1861f71dcb0afae4048e0d47c5b584c6bbc7df25dde747e87"
}
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n p.token as `token: tokens::tokens::prompts::PromptToken`,\n\n p.prompt_type as `prompt_type: enums::by_table::prompts::prompt_type::PromptType`,\n\n p.maybe_model_type as `maybe_model_type: enums::common::model_type::ModelType`,\n p.maybe_generation_provider as `maybe_generation_provider: enums::common::generation_provider::GenerationProvider`,\n\n p.maybe_creator_user_token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n\n p.maybe_positive_prompt,\n p.maybe_negative_prompt,\n p.maybe_other_args,\n\n p.creator_ip_address,\n p.created_at\n\nFROM prompts as p\nWHERE\n p.token = ?\n ",
"query": "\nSELECT\n p.token as `token: tokens::tokens::prompts::PromptToken`,\n\n p.prompt_type as `prompt_type: enums::by_table::prompts::prompt_type::PromptType`,\n\n p.maybe_model_type as `maybe_model_type: enums::common::generation::common_model_type::CommonModelType`,\n p.maybe_generation_provider as `maybe_generation_provider: enums::common::generation_provider::GenerationProvider`,\n\n p.maybe_creator_user_token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n\n p.maybe_positive_prompt,\n p.maybe_negative_prompt,\n\n p.maybe_generation_mode as `maybe_generation_mode: enums::common::generation::common_generation_mode::CommonGenerationMode`,\n p.maybe_aspect_ratio as `maybe_aspect_ratio: enums::common::generation::common_aspect_ratio::CommonAspectRatio`,\n p.maybe_resolution as `maybe_resolution: enums::common::generation::common_resolution::CommonResolution`,\n p.maybe_batch_count as `maybe_batch_count: u8`,\n p.maybe_generate_audio as `maybe_generate_audio: bool`,\n p.maybe_duration_seconds as `maybe_duration_seconds: u32`,\n\n p.maybe_other_args,\n\n p.creator_ip_address,\n p.created_at\n\nFROM prompts as p\nWHERE\n p.token = ?\n ",
"describe": {
"columns": [
{
@@ -25,7 +25,7 @@
},
{
"ordinal": 2,
"name": "maybe_model_type: enums::common::model_type::ModelType",
"name": "maybe_model_type: enums::common::generation::common_model_type::CommonModelType",
"type_info": {
"type": "VarString",
"flags": "BINARY",
@@ -75,6 +75,66 @@
},
{
"ordinal": 7,
"name": "maybe_generation_mode: enums::common::generation::common_generation_mode::CommonGenerationMode",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 96
}
},
{
"ordinal": 8,
"name": "maybe_aspect_ratio: enums::common::generation::common_aspect_ratio::CommonAspectRatio",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 96
}
},
{
"ordinal": 9,
"name": "maybe_resolution: enums::common::generation::common_resolution::CommonResolution",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 10,
"name": "maybe_batch_count: u8",
"type_info": {
"type": "Tiny",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 3
}
},
{
"ordinal": 11,
"name": "maybe_generate_audio: bool",
"type_info": {
"type": "Tiny",
"flags": "",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 12,
"name": "maybe_duration_seconds: u32",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 13,
"name": "maybe_other_args",
"type_info": {
"type": "Blob",
@@ -84,7 +144,7 @@
}
},
{
"ordinal": 8,
"ordinal": 14,
"name": "creator_ip_address",
"type_info": {
"type": "VarString",
@@ -94,7 +154,7 @@
}
},
{
"ordinal": 9,
"ordinal": 15,
"name": "created_at",
"type_info": {
"type": "Timestamp",
@@ -116,9 +176,15 @@
true,
true,
true,
true,
true,
true,
true,
true,
true,
false,
false
]
},
"hash": "b46b0d022790f4e10f6e47126df0fdc55172bf8cda77d4e0b2afac9e6ebd1630"
"hash": "4a50b7bf06061f05e769a41e547cb927bd2b3a6f67c8ceb37883b744237ba34c"
}
@@ -0,0 +1,289 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n u.id as `id: u64`,\n u.token as `token: tokens::tokens::users::UserToken`,\n u.username,\n u.display_name,\n u.username_is_not_customized as `username_is_not_customized: bool`,\n u.email_address,\n u.email_confirmed as `email_confirmed: bool`,\n u.is_without_password as `is_without_password: bool`,\n u.ip_address_creation,\n u.maybe_source as `maybe_source: enums::by_table::users::user_signup_source::UserSignupSource`,\n u.maybe_signup_method as `maybe_signup_method: enums::by_table::users::user_signup_method::UserSignupMethod`,\n u.created_at,\n u.maybe_referral_url,\n u.is_temporary as `is_temporary: bool`,\n us.subscription_namespace,\n us.subscription_product_slug,\n us.maybe_stripe_subscription_id,\n us.maybe_stripe_customer_id,\n us.maybe_stripe_product_id,\n us.maybe_stripe_price_id,\n us.maybe_stripe_subscription_status,\n us.maybe_stripe_recurring_interval,\n us.maybe_stripe_invoice_is_paid as `maybe_stripe_invoice_is_paid: bool`,\n us.maybe_cancel_at,\n us.maybe_canceled_at\nFROM users AS u\nINNER JOIN user_subscriptions AS us ON u.token = us.user_token\nWHERE\n u.id < ?\n AND u.user_deleted_at IS NULL\n AND u.mod_deleted_at IS NULL\nORDER BY u.id DESC\nLIMIT ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id: u64",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | PRIMARY_KEY | AUTO_INCREMENT",
"char_set": 63,
"max_size": 20
}
},
{
"ordinal": 1,
"name": "token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 3,
"name": "display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 4,
"name": "username_is_not_customized: bool",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 5,
"name": "email_address",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 6,
"name": "email_confirmed: bool",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 7,
"name": "is_without_password: bool",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 8,
"name": "ip_address_creation",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 9,
"name": "maybe_source: enums::by_table::users::user_signup_source::UserSignupSource",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 10,
"name": "maybe_signup_method: enums::by_table::users::user_signup_method::UserSignupMethod",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 11,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 12,
"name": "maybe_referral_url",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 13,
"name": "is_temporary: bool",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 14,
"name": "subscription_namespace",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 15,
"name": "subscription_product_slug",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 16,
"name": "maybe_stripe_subscription_id",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 17,
"name": "maybe_stripe_customer_id",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 18,
"name": "maybe_stripe_product_id",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 19,
"name": "maybe_stripe_price_id",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 20,
"name": "maybe_stripe_subscription_status",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 21,
"name": "maybe_stripe_recurring_interval",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 22,
"name": "maybe_stripe_invoice_is_paid: bool",
"type_info": {
"type": "Tiny",
"flags": "",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 23,
"name": "maybe_cancel_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 24,
"name": "maybe_canceled_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 2
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true,
false,
true,
false,
false,
false,
true,
true,
true,
true,
true,
true,
true,
true,
true
]
},
"hash": "83840fa1a0712a326a26ae146a819f67a44fae927f294780d89892270075ebb7"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\n UPDATE media_files\n SET maybe_thumbnail_version = ?\n WHERE token = ?\n LIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "87d7233bb9a4bcae7c9b7d55bb93fab182343847f0bcf8d8ce849f3a2dcfb704"
}
@@ -0,0 +1,12 @@
{
"db_name": "SQLite",
"query": "\n UPDATE tasks\n SET task_status = ?,\n on_failure_type = ?,\n on_failure_message = ?\n WHERE id = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 4
},
"nullable": []
},
"hash": "9b99ccd0baf9a4b74d8903f63e3a3dcf4c09b75cad978f0532388cbd743b7516"
}
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n jobs.token as `job_token: tokens::tokens::generic_inference_jobs::InferenceJobToken`,\n\n jobs.status as `status: enums::common::job_status_plus::JobStatusPlus`,\n jobs.attempt_count,\n\n jobs.maybe_creator_user_token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n jobs.maybe_creator_anonymous_visitor_token as `maybe_creator_anonymous_visitor_token: tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken`,\n jobs.creator_ip_address,\n\n jobs.product_category as `product_category: enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory`,\n jobs.inference_category as `inference_category: enums::by_table::generic_inference_jobs::inference_category::InferenceCategory`,\n jobs.maybe_model_type,\n jobs.maybe_model_token,\n jobs.maybe_raw_inference_text,\n jobs.maybe_inference_args,\n\n jobs.frontend_failure_category as `maybe_frontend_failure_category: enums::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory`,\n\n jobs.on_success_result_entity_type as maybe_result_entity_type,\n jobs.on_success_result_entity_token as maybe_result_entity_token,\n jobs.on_success_result_batch_token as maybe_result_batch_token,\n\n model_weights.title as maybe_model_weights_title,\n tts_models.title as maybe_tts_model_title,\n voice_conversion_models.title as maybe_voice_conversion_model_title,\n\n tts_results.public_bucket_wav_audio_path as maybe_tts_public_bucket_path,\n voice_conversion_results.public_bucket_hash as maybe_voice_conversion_public_bucket_hash,\n\n media_files.public_bucket_directory_hash as maybe_media_file_public_bucket_directory_hash,\n media_files.maybe_public_bucket_prefix as maybe_media_file_public_bucket_prefix,\n media_files.maybe_public_bucket_extension as maybe_media_file_public_bucket_extension,\n\n jobs.assigned_worker as maybe_assigned_worker,\n jobs.assigned_cluster as maybe_assigned_cluster,\n\n jobs.is_keepalive_required,\n\n jobs.created_at,\n jobs.updated_at,\n\n jobs.first_started_at as maybe_first_started_at,\n jobs.successfully_completed_at as maybe_successfully_completed_at,\n\n NOW() as database_clock\n\nFROM generic_inference_jobs as jobs\n\nLEFT OUTER JOIN model_weights ON jobs.maybe_model_token = model_weights.token\nLEFT OUTER JOIN tts_models ON jobs.maybe_model_token = tts_models.token\nLEFT OUTER JOIN voice_conversion_models ON jobs.maybe_model_token = voice_conversion_models.token\n\nLEFT OUTER JOIN tts_results ON jobs.on_success_result_entity_token = tts_results.token\nLEFT OUTER JOIN voice_conversion_results ON jobs.on_success_result_entity_token = voice_conversion_results.token\nLEFT OUTER JOIN media_files ON jobs.on_success_result_entity_token = media_files.token\n\nWHERE jobs.token = ?\n ",
"query": "\nSELECT\n jobs.token as `job_token: tokens::tokens::generic_inference_jobs::InferenceJobToken`,\n\n jobs.status as `status: enums::common::job_status_plus::JobStatusPlus`,\n jobs.attempt_count,\n\n jobs.maybe_creator_user_token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n jobs.maybe_creator_anonymous_visitor_token as `maybe_creator_anonymous_visitor_token: tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken`,\n jobs.creator_ip_address,\n\n jobs.product_category as `product_category: enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory`,\n jobs.inference_category as `inference_category: enums::by_table::generic_inference_jobs::inference_category::InferenceCategory`,\n jobs.maybe_model_type,\n jobs.maybe_model_token,\n jobs.maybe_raw_inference_text,\n jobs.maybe_inference_args,\n\n jobs.frontend_failure_category as `maybe_frontend_failure_category: enums::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory`,\n jobs.failure_reason,\n\n jobs.on_success_result_entity_type as maybe_result_entity_type,\n jobs.on_success_result_entity_token as maybe_result_entity_token,\n jobs.on_success_result_batch_token as maybe_result_batch_token,\n\n model_weights.title as maybe_model_weights_title,\n tts_models.title as maybe_tts_model_title,\n voice_conversion_models.title as maybe_voice_conversion_model_title,\n\n tts_results.public_bucket_wav_audio_path as maybe_tts_public_bucket_path,\n voice_conversion_results.public_bucket_hash as maybe_voice_conversion_public_bucket_hash,\n\n media_files.public_bucket_directory_hash as maybe_media_file_public_bucket_directory_hash,\n media_files.maybe_public_bucket_prefix as maybe_media_file_public_bucket_prefix,\n media_files.maybe_public_bucket_extension as maybe_media_file_public_bucket_extension,\n\n jobs.assigned_worker as maybe_assigned_worker,\n jobs.assigned_cluster as maybe_assigned_cluster,\n\n jobs.is_keepalive_required,\n\n jobs.created_at,\n jobs.updated_at,\n\n jobs.first_started_at as maybe_first_started_at,\n jobs.successfully_completed_at as maybe_successfully_completed_at,\n\n NOW() as database_clock\n\nFROM generic_inference_jobs as jobs\n\nLEFT OUTER JOIN model_weights ON jobs.maybe_model_token = model_weights.token\nLEFT OUTER JOIN tts_models ON jobs.maybe_model_token = tts_models.token\nLEFT OUTER JOIN voice_conversion_models ON jobs.maybe_model_token = voice_conversion_models.token\n\nLEFT OUTER JOIN tts_results ON jobs.on_success_result_entity_token = tts_results.token\nLEFT OUTER JOIN voice_conversion_results ON jobs.on_success_result_entity_token = voice_conversion_results.token\nLEFT OUTER JOIN media_files ON jobs.on_success_result_entity_token = media_files.token\n\nWHERE jobs.token = ?\n ",
"describe": {
"columns": [
{
@@ -135,6 +135,16 @@
},
{
"ordinal": 13,
"name": "failure_reason",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 2048
}
},
{
"ordinal": 14,
"name": "maybe_result_entity_type",
"type_info": {
"type": "VarString",
@@ -144,7 +154,7 @@
}
},
{
"ordinal": 14,
"ordinal": 15,
"name": "maybe_result_entity_token",
"type_info": {
"type": "VarString",
@@ -154,7 +164,7 @@
}
},
{
"ordinal": 15,
"ordinal": 16,
"name": "maybe_result_batch_token",
"type_info": {
"type": "VarString",
@@ -164,7 +174,7 @@
}
},
{
"ordinal": 16,
"ordinal": 17,
"name": "maybe_model_weights_title",
"type_info": {
"type": "VarString",
@@ -174,7 +184,7 @@
}
},
{
"ordinal": 17,
"ordinal": 18,
"name": "maybe_tts_model_title",
"type_info": {
"type": "VarString",
@@ -184,7 +194,7 @@
}
},
{
"ordinal": 18,
"ordinal": 19,
"name": "maybe_voice_conversion_model_title",
"type_info": {
"type": "VarString",
@@ -194,7 +204,7 @@
}
},
{
"ordinal": 19,
"ordinal": 20,
"name": "maybe_tts_public_bucket_path",
"type_info": {
"type": "VarString",
@@ -204,7 +214,7 @@
}
},
{
"ordinal": 20,
"ordinal": 21,
"name": "maybe_voice_conversion_public_bucket_hash",
"type_info": {
"type": "VarString",
@@ -214,7 +224,7 @@
}
},
{
"ordinal": 21,
"ordinal": 22,
"name": "maybe_media_file_public_bucket_directory_hash",
"type_info": {
"type": "VarString",
@@ -224,7 +234,7 @@
}
},
{
"ordinal": 22,
"ordinal": 23,
"name": "maybe_media_file_public_bucket_prefix",
"type_info": {
"type": "VarString",
@@ -234,7 +244,7 @@
}
},
{
"ordinal": 23,
"ordinal": 24,
"name": "maybe_media_file_public_bucket_extension",
"type_info": {
"type": "VarString",
@@ -244,7 +254,7 @@
}
},
{
"ordinal": 24,
"ordinal": 25,
"name": "maybe_assigned_worker",
"type_info": {
"type": "VarString",
@@ -254,7 +264,7 @@
}
},
{
"ordinal": 25,
"ordinal": 26,
"name": "maybe_assigned_cluster",
"type_info": {
"type": "VarString",
@@ -264,7 +274,7 @@
}
},
{
"ordinal": 26,
"ordinal": 27,
"name": "is_keepalive_required",
"type_info": {
"type": "Tiny",
@@ -274,7 +284,7 @@
}
},
{
"ordinal": 27,
"ordinal": 28,
"name": "created_at",
"type_info": {
"type": "Timestamp",
@@ -284,7 +294,7 @@
}
},
{
"ordinal": 28,
"ordinal": 29,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
@@ -294,7 +304,7 @@
}
},
{
"ordinal": 29,
"ordinal": 30,
"name": "maybe_first_started_at",
"type_info": {
"type": "Timestamp",
@@ -304,7 +314,7 @@
}
},
{
"ordinal": 30,
"ordinal": 31,
"name": "maybe_successfully_completed_at",
"type_info": {
"type": "Timestamp",
@@ -314,7 +324,7 @@
}
},
{
"ordinal": 31,
"ordinal": 32,
"name": "database_clock",
"type_info": {
"type": "Datetime",
@@ -354,6 +364,7 @@
true,
true,
true,
true,
false,
false,
false,
@@ -362,5 +373,5 @@
false
]
},
"hash": "243afe0bc574f9f233c7797add9faf96440e2bafd52032e07951272fb1ec78b1"
"hash": "a2c9e2f61eba666254f8432b3c50a0a7738ee3b3faa77c5281bc8e4af96159b9"
}
@@ -0,0 +1,58 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n username,\n display_name,\n username_is_generated as `username_is_generated: bool`,\n username_is_not_customized as `username_is_not_customized: bool`\nFROM users\nWHERE\n token = ?\n AND user_deleted_at IS NULL\n AND mod_deleted_at IS NULL\nLIMIT 1\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 1,
"name": "display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 2,
"name": "username_is_generated: bool",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 3,
"name": "username_is_not_customized: bool",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false
]
},
"hash": "be9867966f24f44e14f96966cf5113055f00c339dda75334e7e88d355b9bfe72"
}
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n j.status as `job_status: enums::common::job_status_plus::JobStatusPlus`,\n j.failure_reason as job_failure_reason,\n wle.credits_delta,\n wle.maybe_linked_refund_ledger_token as `maybe_linked_refund_ledger_token: tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken`,\n j.on_success_result_entity_token as `on_success_result_media_token: tokens::tokens::media_files::MediaFileToken`,\n j.token as `job_token: tokens::tokens::generic_inference_jobs::InferenceJobToken`,\n wle.token as `wallet_ledger_entry_token: tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken`,\n wle.entry_type as `wallet_ledger_entry_type: enums::by_table::wallet_ledger_entries::wallet_ledger_entry_type::WalletLedgerEntryType`\nFROM generic_inference_jobs as j\nLEFT OUTER JOIN users as u\n ON j.maybe_creator_user_token = u.token\nLEFT OUTER JOIN wallet_ledger_entries as wle\n ON wle.maybe_entity_ref = j.token\nWHERE u.token = ?\nORDER BY j.id DESC\n ",
"query": "\nSELECT\n j.status as `job_status: enums::common::job_status_plus::JobStatusPlus`,\n j.failure_reason as job_failure_reason,\n wle.credits_delta,\n wle.maybe_linked_refund_ledger_token as `maybe_linked_refund_ledger_token: tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken`,\n j.on_success_result_entity_token as `on_success_result_media_token: tokens::tokens::media_files::MediaFileToken`,\n j.token as `job_token: tokens::tokens::generic_inference_jobs::InferenceJobToken`,\n wle.token as `wallet_ledger_entry_token: tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken`,\n wle.entry_type as `wallet_ledger_entry_type: enums::by_table::wallet_ledger_entries::wallet_ledger_entry_type::WalletLedgerEntryType`,\n j.maybe_external_third_party as `maybe_external_third_party: enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty`,\n j.maybe_external_third_party_id,\n j.created_at,\n j.updated_at\nFROM generic_inference_jobs as j\nLEFT OUTER JOIN users as u\n ON j.maybe_creator_user_token = u.token\nLEFT OUTER JOIN wallet_ledger_entries as wle\n ON wle.maybe_entity_ref = j.token\nWHERE u.token = ?\nORDER BY j.id DESC\n ",
"describe": {
"columns": [
{
@@ -82,6 +82,46 @@
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 8,
"name": "maybe_external_third_party: enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 9,
"name": "maybe_external_third_party_id",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 256
}
},
{
"ordinal": 10,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 11,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
@@ -95,8 +135,12 @@
true,
false,
true,
true
true,
true,
true,
false,
false
]
},
"hash": "0757d81ba153b2ad2df25df3dd92b655ef08b95f5f83251bf3573f9be3a9f8d1"
"hash": "cbdaa45597de14d1eb6dc0f6a95788d56334757bb3d03eda2eb64df3ba2a0144"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO prompts\nSET\n token = ?,\n prompt_type = ?,\n\n maybe_creator_user_token = ?,\n \n maybe_model_type = ?,\n maybe_generation_provider = ?,\n\n maybe_positive_prompt = ?,\n maybe_negative_prompt = ?,\n\n maybe_generation_mode = ?,\n maybe_aspect_ratio = ?,\n maybe_resolution = ?,\n maybe_batch_count = ?,\n maybe_generate_audio = ?,\n maybe_duration_seconds = ?,\n\n maybe_other_args = ?,\n\n creator_ip_address = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 15
},
"nullable": []
},
"hash": "ccf92ebe0328d3019ac6b01be4b442df706a183362fa7e5c331f5a4bf1a74a00"
}
@@ -0,0 +1,91 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n id,\n token as `token: MediaFileToken`,\n created_at as `created_at: DateTime<Utc>`,\n maybe_thumbnail_version as `maybe_thumbnail_version: u8`,\n public_bucket_directory_hash,\n maybe_public_bucket_prefix,\n maybe_public_bucket_extension\nFROM media_files\nWHERE\n id >= (SELECT COALESCE(MIN(id), 0) FROM media_files WHERE created_at >= NOW() - INTERVAL ? HOUR)\n AND id < ?\n AND media_class = ?\n AND maybe_thumbnail_version IS NULL\n AND user_deleted_at IS NULL\n AND mod_deleted_at IS NULL\nORDER BY id DESC\nLIMIT ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | PRIMARY_KEY | AUTO_INCREMENT",
"char_set": 63,
"max_size": 20
}
},
{
"ordinal": 1,
"name": "token: MediaFileToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "created_at: DateTime<Utc>",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 3,
"name": "maybe_thumbnail_version: u8",
"type_info": {
"type": "Tiny",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 3
}
},
{
"ordinal": 4,
"name": "public_bucket_directory_hash",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 5,
"name": "maybe_public_bucket_prefix",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 6,
"name": "maybe_public_bucket_extension",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 64
}
}
],
"parameters": {
"Right": 4
},
"nullable": [
false,
false,
false,
true,
false,
true,
true
]
},
"hash": "daed2dcd03b3c9fbdb9057b743df078f43e2af87a2c31f418234f98da5ff979f"
}
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO wallets\nSET\n token = ?,\n wallet_namespace = ?,\n\n owner_user_token = ?,\n \n banked_credits = 0,\n monthly_credits = 0\n ",
"query": "\nINSERT INTO wallets\nSET\n token = ?,\n wallet_namespace = ?,\n\n owner_user_token = ?,\n\n banked_credits = 0,\n monthly_credits = 0\n ",
"describe": {
"columns": [],
"parameters": {
@@ -8,5 +8,5 @@
},
"nullable": []
},
"hash": "4f5100a2cfb465964e77eaacb1ae394daae94de20c56a0966a8222dc9bea63c6"
"hash": "f4fb945b4311bd4458a68d82e417b40f8c36c08d572c07881b89cd157a8a8699"
}
+75
View File
@@ -0,0 +1,75 @@
# CLAUDE.md
This file provides guidance for Claude Code when working with the Artcraft monorepo.
## Project Overview
Artcraft is a web and desktop application for generating AI image and video. It is written in
Rust and TypeScript and contains desktop, server, and frontend components.
## Project Structure
```
artcraft/
├── _database/ # Schema definitions and migrations (MySQL, SQLite, Elasticsearch, etc.)
│ ├── elasticsearch/ # Elasticsearch schema and queries
│ └── sql/ # MySQL and SQLite schema definitions and migrations
│ ├── artcraft_migrations/ # ArtCraft desktop app SQLite migrations
│ ├── migrations/ # Server MySQL migrations
│ └── migrations_squashed/ # Fully materialized MySQL schema definitions for most tables
├── _tools/ # Various 3rd party tool integrations and configurations
│ └── postman/ # Postman configs for test HTTP requests against development and production
├── build/ # Dockerfile build instructions for server components
├── crates/ # Rust workspace
│ ├── api_clients/ # HTTP clients for calling internal and 3rd party services
│ ├── cli/ # Command line tools
│ ├── desktop/ # Desktop (Tauri) apps
│ │ └── artcraft/ # (Important) ArtCraft, the desktop app. This is one of our main pieces of software
│ ├── lib/ # Various utility libraries for servers, CLI tools, desktop, etc.
│ ├── schema/ # Data definition layer: MySQL, SQlite, Redis, S3/R2 buckets, etc.
│ │ ├── buckets/ # Declares R2 cloud bucket topology
│ │ ├── database/ # MySQL, SQLite, Elasticsearch, Redis, etc.
│ │ │ ├── elasticsearch_schema/ # Elasticsearch
│ │ │ ├── migration/ # (deprecated) Online schema adapters for MySQL
│ │ │ ├── mysql_queries/ # Sqlx MySQL queries for our backend monolith `storyteller-web`, jobs, etc.
│ │ │ ├── redis_common/ # Redis support
│ │ │ ├── redis_schema/ # Redis key and HKEY topology
│ │ │ ├── sqlite_queries/ # (deprecated) Sqlite queries
│ │ │ └── sqlite_tasks/ # Queries for the ArtCraft desktop app's "tasks" database.
│ │ ├── public/ # Token identifier and enum variant definitions
│ │ │ ├── composite_identifier/ # MySQL composite key system
│ │ │ ├── enums/ # MySQL "enums" stored in VARCHAR fields.
│ │ │ └── tokens/ # Primary database identifiers with Stripe-like ID prefixes, eg. "user_{entropy}"
│ │ └── service/ # Backend HTTP services and jobs
│ │ ├── job/ # Backend jobs.
│ │ │ └── video_thumbnail_job/ # Render video thumbnails
│ │ ├── plugins/ # Collections of reusable Actix-Web HTTP functions (user and billing systems)
│ │ └── web/ # HTTP web servers
│ │ └── storyteller_web/ # (Important) Our main HTTP API monolith and backend.
│ └── frontend/ # Nx typescript monorepo for our websites and Tauri desktop apps
│ ├── apps/ # Websites and Tauri desktop apps
│ │ ├── artcraft/ # ArtCraft the Tauri app's frontend. Used in conjunction with `artcraft` the Rust crate.
│ │ └── artcraft-website/ # The website for https://getartcraft.com
│ └── libs/ # Support libraries, reusable React components, etc.
└── Cargo.toml # Rust monorepo workspace
```
## Code Style
- Rust with no minimum supported version
- Actix-web for HTTP services
- SQLx for MySQL and SQLite
- A mix of wreq and reqwest for Rust HTTP clients
- TypeScript with Nx, React, Vite, Zustand, and Three.js
- Use two spaces for indentation
### File Layout
Organize for top-to-bottom reading. Important things first, details later.
- **Constants** at the top (after imports)
- **Structs/enums** next; outer structs above inner sub-structs
- **API types** in order: Request, Response, Error
- **In impl blocks**: constructors first, then public methods, then private helpers
- Private helpers go *below* the methods that call them
- Among helpers: meatier logic above leaf-level formatters
Generated
+609 -870
View File
File diff suppressed because it is too large Load Diff
+101 -66
View File
@@ -6,26 +6,28 @@ resolver = "2"
members = [
# API clients for external services
# These might be custom implementations or wrappers over other client libraries.
"crates/api_clients/artcraft/artcraft_api_defs", # TODO: api_clients/{artcraft}/{api_defs,client}
"crates/api_clients/artcraft/artcraft_api_defs",
"crates/api_clients/artcraft/artcraft_client",
"crates/api_clients/artcraft/artcraft_router",
"crates/api_clients/cloud_storage",
"crates/api_clients/fal_client",
"crates/api_clients/google_drive_common",
"crates/api_clients/google_drive_downloader",
"crates/api_clients/google_sign_in",
"crates/api_clients/grok_client",
"crates/api_clients/midjourney_client",
"crates/api_clients/muapi_client",
"crates/api_clients/openai_sora_client",
"crates/api_clients/openart_client",
"crates/api_clients/seedance2pro",
"crates/api_clients/rootly_client",
"crates/api_clients/runwayml_client",
"crates/api_clients/seedance2pro_client",
"crates/api_clients/thumbnail_generator",
"crates/api_clients/world_labs_api",
"crates/api_clients/world_labs_client",
"crates/api_clients/worldlabs_api_client",
"crates/api_clients/worldlabs_consumer_client",
# CLI tools for operations, etc.
"crates/cli/devenv/dev-database-seed",
"crates/cli/devenv/dev-upload-media-file",
"crates/cli/devenv/scrape-test",
"crates/cli/production/db-backfill",
"crates/cli/production/db-backup",
"crates/cli/production/db-cleanup",
@@ -43,7 +45,6 @@ members = [
"crates/lib/actix_cors_configs",
"crates/lib/actix_helpers",
"crates/lib/bootstrap",
"crates/lib/bucket_paths",
"crates/lib/build_metadata",
"crates/lib/caching/memory_caching",
"crates/lib/caching/memory_store",
@@ -52,19 +53,14 @@ members = [
"crates/lib/cloudflare_mitigation",
"crates/lib/concurrency",
"crates/lib/cookie_store",
"crates/lib/cookies",
"crates/lib/data/collections",
"crates/lib/data/crockford",
"crates/lib/data/datetimes",
"crates/lib/data/primitives",
"crates/lib/data/web_base64",
"crates/lib/deprecated/config", # TODO(bt, 2023-02-13): Deprecate or repurpose
"crates/lib/deprecated/http_server_common", # TODO(bt, 2023-03-20): Move useful pieces to actix_helpers
"crates/lib/dimensions",
"crates/lib/easyenv", # NB: Vendored version of https://github.com/echelon/easyenv.rs that we'll improve.
"crates/lib/email_sender",
"crates/lib/errors",
"crates/lib/files/archives",
"crates/lib/ffmpeg_utils",
"crates/lib/files/file_to_base64_url",
"crates/lib/files/filesys",
"crates/lib/files/hashing",
@@ -72,35 +68,46 @@ members = [
"crates/lib/files/media",
"crates/lib/files/mimetypes",
"crates/lib/files/videos",
"crates/lib/files/zip_archives",
"crates/lib/http_headers",
"crates/lib/idempotency",
"crates/api_clients/artcraft/artcraft_router",
"crates/lib/image_algorithms",
"crates/lib/jobs_common",
"crates/lib/jwt_light",
"crates/lib/jwt_signer",
"crates/lib/logging",
"crates/lib/machine_learning/ml_weights_registry",
"crates/lib/machine_learning/prompt_engineering",
"crates/lib/markdown",
"crates/lib/migration",
"crates/lib/pager",
"crates/lib/password",
"crates/lib/server_environment",
"crates/lib/sqlx_mysql_helpers",
"crates/lib/storyteller_root",
"crates/lib/subprocess_common",
"crates/lib/test_data",
"crates/lib/testing",
"crates/lib/tts_common",
"crates/lib/url_config",
"crates/lib/url_utils",
"crates/lib/user_input_common",
"crates/lib/users",
"crates/lib/web_scrapers",
"crates/lib/uuid_utils",
#"crates/lib/api_clients/fakeyou_client",
#"crates/lib/machine_learning/ml_models",
#"crates/lib/deprecated/machine_learning/ml_models",
# Shared libraries (Deprecated)
"crates/lib/deprecated/config", # TODO(bt, 2023-02-13): Deprecate or repurpose
"crates/lib/deprecated/email_sender",
"crates/lib/deprecated/http_server_common", # TODO(bt, 2023-03-20): Move useful pieces to actix_helpers
"crates/lib/deprecated/image_algorithms",
"crates/lib/deprecated/machine_learning/ml_weights_registry",
"crates/lib/deprecated/machine_learning/prompt_engineering",
"crates/lib/deprecated/subprocess_common",
"crates/lib/deprecated/tts_common",
# Schema (buckets): S3/R2 topology
"crates/schema/buckets/bucket_paths",
# Schema (config): configuration constants for external services
"crates/schema/config/rootly_config",
"crates/schema/config/shared_env_var_config",
# Schema (database): queries, database layouts, Redis keys, etc.
"crates/schema/database/elasticsearch_schema",
"crates/schema/database/migration",
"crates/schema/database/mysql_queries",
"crates/schema/database/redis_common",
"crates/schema/database/redis_schema",
@@ -115,31 +122,34 @@ members = [
"crates/schema/public/tokens",
# Services: API servers, jobs, workers, etc.
"crates/service/job/analytics_job",
"crates/service/job/download_job",
"crates/service/job/email_sender_job",
"crates/service/job/es-update-job",
"crates/service/job/inference_job",
"crates/service/job/seedance2_pro_job",
"crates/service/job/video_thumbnail_job",
"crates/service/job/worldlabs_job",
"crates/service/job/tts_download_job",
"crates/service/job/tts_inference_job",
"crates/service/job/w2l_download_job",
"crates/service/job/w2l_inference_job",
"crates/service/web/dummy_service",
"crates/service/web/storyteller_web",
# Services (Deprecated) - may still have some use
"crates/service/job/deprecated/analytics_job",
"crates/service/job/deprecated/download_job",
"crates/service/job/deprecated/email_sender_job",
"crates/service/job/deprecated/es-update-job",
"crates/service/job/deprecated/inference_job",
"crates/service/job/deprecated/tts_download_job",
"crates/service/job/deprecated/tts_inference_job",
"crates/service/job/deprecated/w2l_download_job",
"crates/service/job/deprecated/w2l_inference_job",
# Service Plugins: complete subsystems that can be plugged into services (users, billing, etc.)
"crates/service/plugins/billing",
"crates/service/plugins/billing_artcraft",
"crates/service/plugins/component_traits",
"crates/service/plugins/inference_workloads",
"crates/service/plugins/user_traits_component",
# Testing code
"crates/testing/test_data",
"crates/testing/test_utils",
# Vendored code
"crates/vendor/fal-rs",
"crates/vendor/fal-rs/fal-derive",
"crates/vendor/fal-rs/generate",
"crates/vendor/limitation",
"crates/vendor/tauri-plugin-http",
"crates/vendor/Symphonia/symphonia",
@@ -211,49 +221,60 @@ workspace-build-acceleration = { path = "crates/workspace-build-acceleration" }
# Setting paths here ensures we don't need to do so in every crate's Cargo.toml
# It makes refactoring much easier.
actix_artcraft = { path = "crates/lib/actix_artcraft" }
artcraft_router = { path = "crates/api_clients/artcraft/artcraft_router" }
actix_helpers = { path = "crates/lib/actix_helpers" }
artcraft_api_defs = { path = "crates/api_clients/artcraft/artcraft_api_defs" }
artcraft_client = { path = "crates/api_clients/artcraft/artcraft_client" }
artcraft_router = { path = "crates/api_clients/artcraft/artcraft_router" }
bootstrap = { path = "crates/lib/bootstrap" }
bucket_paths = { path = "crates/schema/buckets/bucket_paths" }
build_metadata = { path = "crates/lib/build_metadata" }
cloud_storage = { path = "crates/api_clients/cloud_storage" }
cloudflare_errors = { path = "crates/lib/cloudflare_errors" }
cloudflare_mitigation = { path = "crates/lib/cloudflare_mitigation" }
collections = { path = "crates/lib/data/collections" }
component_traits = { path = "crates/service/plugins/component_traits" }
concurrency = { path = "crates/lib/concurrency" }
cookie_store = { path = "crates/lib/cookie_store" }
cookies = { path = "crates/lib/cookies" }
crockford = { path = "crates/lib/data/crockford" }
easyenv = { path = "crates/lib/easyenv" }
enums = { path = "crates/schema/public/enums" }
enums_public = { path = "crates/schema/public/enums_public" }
errors = { path = "crates/lib/errors" }
fal_client = { path = "crates/api_clients/fal_client" }
ffmpeg_utils = { path = "crates/lib/ffmpeg_utils" }
file_to_base64_url = { path = "crates/lib/files/file_to_base64_url" }
filesys = { path = "crates/lib/files/filesys" }
grok_client = { path = "crates/api_clients/grok_client" }
rootly_client = { path = "crates/api_clients/rootly_client" }
rootly_config = { path = "crates/schema/config/rootly_config" }
shared_env_var_config = { path = "crates/schema/config/shared_env_var_config" }
http_headers = { path = "crates/lib/http_headers" }
idempotency = { path = "crates/lib/idempotency" }
images = { path = "crates/lib/files/images" }
jobs_common = { path = "crates/lib/jobs_common" }
jwt_light = { path = "crates/lib/jwt_light" }
jwt_signer = { path = "crates/lib/jwt_signer" }
memory_caching = { path = "crates/lib/caching/memory_caching" }
memory_store = { path = "crates/lib/caching/memory_store" }
midjourney_client = { path = "crates/api_clients/midjourney_client" }
mimetypes = { path = "crates/lib/files/mimetypes" }
muapi_client = { path = "crates/api_clients/muapi_client" }
mysql_queries = { path = "crates/schema/database/mysql_queries" }
pager = { path = "crates/lib/pager" }
openai_sora_client = { path = "crates/api_clients/openai_sora_client" }
seedance2pro = { path = "crates/api_clients/seedance2pro" }
primitives = { path = "crates/lib/data/primitives" }
seedance2pro_client = { path = "crates/api_clients/seedance2pro_client" }
shared_service_components = { path = "crates/lib/shared_service_components" }
sqlite_tasks = { path = "crates/schema/database/sqlite_tasks" }
artcraft_client = { path = "crates/api_clients/artcraft/artcraft_client" }
subprocess_common = { path = "crates/lib/subprocess_common" }
test_data = { path = "crates/lib/test_data" }
testing = { path = "crates/lib/testing" }
subprocess_common = { path = "crates/lib/deprecated/subprocess_common" }
test_data = { path = "crates/testing/test_data" }
test_utils = { path = "crates/testing/test_utils" }
tokens = { path = "crates/schema/public/tokens" }
url_utils = { path = "crates/lib/url_utils" }
users = { path = "crates/lib/users" }
uuid_utils = { path = "crates/lib/uuid_utils" }
web_base64 = { path = "crates/lib/data/web_base64" }
world_labs_api = { path = "crates/api_clients/world_labs_api" }
world_labs_client = { path = "crates/api_clients/world_labs_client" }
worldlabs_api_client = { path = "crates/api_clients/worldlabs_api_client" }
worldlabs_consumer_client = { path = "crates/api_clients/worldlabs_consumer_client" }
# External libs
# Centrally pinned versions so that we can uniformly upgrade/downgrade versions across the workspace
@@ -269,45 +290,59 @@ actix-web = "4.7.0" # TODO(bt): We're behind and need to bump versions.
actix-web-actors = "4.3.1+deprecated"
actix-web-lab = "0.20.2"
anyhow = "1.0.102"
assertor = "0.0.3"
base64 = "0.22.1"
bcrypt = "0.15"
bstr = "1.12.1"
bytes = "1.10.1"
chrono = { version = "0.4.41", features = ["serde"] }
clap = { version = "4.5.60", features = ["derive"] }
byteorder = "1.5.0"
bytes = "1.11.1"
chrono = { version = "0.4.44", features = ["serde"] }
clap = { version = "=4.5.60", features = ["derive"] }
cookie = "0.18.1"
dotenv = "0.15.0"
elasticsearch = { version = "8.5.0-alpha.1", default-features = false, features = ["rustls-tls"] }
env = "1.0.1"
env_logger = "0.11.9"
futures = { version = "0.3.31" }
hex-literal = "1.0.0"
indexmap = "2.9.0"
futures = { version = "0.3.32" }
hex-literal = "1.1.0"
hostname = "0.4.0"
indexmap = "2.13.0"
log = "0.4.29"
md-5 = "0.10.6" # insecure but used for gravatar
once_cell = "1.21.3"
mockall = "0.12.1"
once_cell = "1.21.4"
r2d2 = "0.8.10"
r2d2_redis = "0.14.0"
rand = "0.9.1"
redis = { version = "1.0.2", features = ["r2d2", "tokio-rustls-comp", "tokio-comp", "cluster-async", "aio"] }
regex = "1.12.3"
reqwest = { version = "0.12.23", default-features = false, features = [ "charset", "http2", "system-proxy", "json", "cookies", "rustls-tls", "gzip" ] }
reqwest-websocket = { version = "0.5.0" }
serde = { version = "1.0.219", features = ["derive"] }
serde_derive = "1.0.219"
serde_json = "1.0.140"
rust-s3 = { version = "0.36.0-beta.2", default-features = false, features = ["fail-on-err", "tags", "tokio-rustls-tls"] }
serde = { version = "1.0.228", features = ["derive"] }
serde_derive = "1.0.228"
serde_json = "1.0.149"
serde_yaml = "0.9.34+deprecated"
sha2 = "0.11.0-rc.2"
sha2 = "0.11.0-rc.5"
sha3 = "0.10.8"
speculoos = "0.11.0"
strum = { version = "0.28.0", features = ["derive"] }
tauri = { version = "2.8.3", features = ["unstable", "devtools"] } # NB: "devtools" prevents App Store distribution; "ubstable" is needed for window access
tauri = { version = "2.8.3", features = ["unstable", "devtools", "protocol-asset"] } # NB: "devtools" prevents App Store distribution; "ubstable" is needed for window access
tauri-plugin-dialog = "2.3.3"
tauri-plugin-fs = "2.4.2"
tauri-plugin-log = "2.6.0"
tauri-plugin-upload = "2.3.1"
tempdir = "0.3.7"
tempfile = "3.20.0"
thiserror = "2.0.12"
tokio = { version = "1.45.1", features = ["macros"] }
toml = "0.8.23"
url = { version = "2.5.4", features = ["serde"] }
uuid = "1.18.1"
tempfile = "3.27.0"
thiserror = "2.0.18"
time = "0.3.36"
tokio = { version = "1.50.0", features = ["macros"] }
tokio-util = "0.7.12"
toml = "1.0.7+spec-1.1.0"
url = { version = "2.5.8", features = ["serde"] }
utoipa = { version = "5.4.0", features = ["chrono", "actix_extras", "url"] }
uuid = "1.22.0"
walkdir = "2.4.0"
# NB: wreq gets past fingerprinting, but we have to deal with platform-specific build issues.
#
@@ -16,7 +16,9 @@
-- on_complete_primary_media_file_class,
-- on_complete_primary_media_file_cdn_url,
-- on_complete_primary_media_file_thumbnail_url_template,
--
-- tasks_v6.sqlite - added two fields:
-- on_failure_type
-- on_failure_message
CREATE TABLE tasks (
-- Task auto-incrementing primary key.
@@ -84,6 +86,15 @@ CREATE TABLE tasks (
-- The URL template for the thumbnail of the primary media file.
on_complete_primary_media_file_thumbnail_url_template TEXT,
-- OPTIONAL.
-- An enum-like string describing the failure reason (even for non-terminal failures).
-- The enum is `TaskFailureType`, which is a close analogue of the backend API's `FrontendFailureCategory`.
on_failure_type TEXT,
-- OPTIONAL.
-- A human-readable message describing the failure reason (even for non-terminal failures).
on_failure_message TEXT,
created_at INTEGER NOT NULL DEFAULT (unixepoch('now')),
updated_at INTEGER NOT NULL DEFAULT (unixepoch('now')),
completed_at INTEGER DEFAULT NULL
@@ -0,0 +1,7 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE media_files
DROP COLUMN
maybe_thumbnail_version;
@@ -0,0 +1,7 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE media_files
ADD COLUMN
maybe_thumbnail_version TINYINT UNSIGNED DEFAULT NULL;
@@ -0,0 +1,11 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE prompts
DROP COLUMN maybe_generation_mode,
DROP COLUMN maybe_aspect_ratio,
DROP COLUMN maybe_resolution,
DROP COLUMN maybe_duration,
DROP COLUMN maybe_batch_count,
DROP COLUMN maybe_generate_audio;
@@ -0,0 +1,11 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE prompts
ADD COLUMN maybe_generation_mode VARCHAR(24) DEFAULT NULL,
ADD COLUMN maybe_aspect_ratio VARCHAR(24) DEFAULT NULL,
ADD COLUMN maybe_resolution VARCHAR(16) DEFAULT NULL,
ADD COLUMN maybe_duration VARCHAR(8) DEFAULT NULL,
ADD COLUMN maybe_batch_count TINYINT UNSIGNED DEFAULT NULL,
ADD COLUMN maybe_generate_audio BOOLEAN DEFAULT NULL;
@@ -0,0 +1,7 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE prompts
DROP COLUMN maybe_duration_seconds,
ADD COLUMN maybe_duration VARCHAR(8) DEFAULT NULL;
@@ -0,0 +1,7 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE prompts
DROP COLUMN maybe_duration,
ADD COLUMN maybe_duration_seconds INT UNSIGNED DEFAULT NULL;
@@ -0,0 +1,29 @@
-- NB: This is a manually squashed view of all the CREATE and ALTER statements,
-- with comments attached to the fields for centralized documentation.
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Stores the media files (images) used as input when creating a character.
CREATE TABLE character_creation_assets (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Foreign key to the characters table.
character_token VARCHAR(32) NOT NULL,
-- The media file used as a creation input (e.g. reference image).
asset_media_file_token VARCHAR(32) NOT NULL,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- ========== INDICES ==========
PRIMARY KEY (id),
KEY index_character_token (character_token),
KEY index_asset_media_file_token (asset_media_file_token)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,28 @@
-- NB: This is a manually squashed view of all the CREATE and ALTER statements,
-- with comments attached to the fields for centralized documentation.
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Stores prompts/descriptions used when creating a character.
CREATE TABLE character_creation_prompts (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Foreign key to the characters table.
character_token VARCHAR(32) NOT NULL,
-- The prompt or description used during character creation.
prompt TEXT DEFAULT NULL,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- ========== INDICES ==========
PRIMARY KEY (id),
KEY index_character_token (character_token)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,71 @@
-- NB: This is a manually squashed view of all the CREATE and ALTER statements,
-- with comments attached to the fields for centralized documentation.
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Maps our characters to their representations in third-party systems.
-- A single character may have entries in multiple third-party systems
-- (e.g. Kinovi for Seedance, Runway for Gen-3, etc.).
-- If a third-party character needs to be recreated, a new row is inserted.
CREATE TABLE character_third_party_entities (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Effective "primary key" (PUBLIC)
-- We may need to recreate the character in a third party, so this gets its own token.
token VARCHAR(32) NOT NULL,
-- Foreign key to the characters table.
character_token VARCHAR(32) NOT NULL,
-- Whether this third-party entity is active and usable.
is_active BOOLEAN NOT NULL DEFAULT false,
-- ========== THIRD PARTY DETAILS ==========
-- Which third-party system the character lives in (enum crate type).
-- e.g. "kinovi", "runway", etc.
third_party VARCHAR(32) NOT NULL,
-- Which types of models can use this character (enum crate type).
-- e.g. "seedance_2_pro", "seedance_2_fast", etc.
third_party_scopes VARCHAR(32) NOT NULL,
-- The identifier in the third-party system.
-- e.g. Kinovi's "char_1774752056469_2wlxoq"
third_party_id VARCHAR(64) NOT NULL,
-- The name used by the third party.
-- Important for Kinovi since characters are referenced by name in prompts.
third_party_name VARCHAR(255) NOT NULL,
-- An upstream third party of the third party (if any).
-- e.g. Kinovi's assetId "asset-20260329104101-kk5kl"
maybe_fourth_party_id VARCHAR(64) DEFAULT NULL,
-- ========== JOB TRACKING ==========
-- Our job system token (if the character was created via a job).
maybe_origin_job_token VARCHAR(32) DEFAULT NULL,
-- Third party's job system token (if any).
maybe_origin_third_party_job_id VARCHAR(64) DEFAULT NULL,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP DEFAULT NULL,
-- ========== INDICES ==========
PRIMARY KEY (id),
UNIQUE KEY (token),
KEY index_character_token (character_token),
KEY index_third_party (third_party),
KEY index_third_party_id (third_party_id),
KEY index_is_active (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,60 @@
-- NB: This is a manually squashed view of all the CREATE and ALTER statements,
-- with comments attached to the fields for centralized documentation.
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Characters are reusable entities that can be referenced in video/image generations.
-- A character is created from one or more reference images and registered with third-party
-- systems (e.g. Kinovi/Seedance) that support character-based generation.
CREATE TABLE characters (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Effective "primary key" (PUBLIC)
token VARCHAR(32) NOT NULL,
-- Whether the character has been fully created and is available for use.
-- A character may exist in the database before its creation job completes.
is_active BOOLEAN NOT NULL DEFAULT false,
-- ========== CHARACTER DETAILS ==========
-- Display name for the character.
name VARCHAR(255) NOT NULL,
-- Optional description of the character.
maybe_description VARCHAR(512) DEFAULT NULL,
-- ========== MEDIA ==========
-- Avatar image (small/thumbnail).
maybe_avatar_media_token VARCHAR(32) DEFAULT NULL,
-- Full-size reference image.
maybe_full_image_media_token VARCHAR(32) DEFAULT NULL,
-- ========== CREATOR ==========
-- The user who created this character.
maybe_creator_user_token VARCHAR(32) DEFAULT NULL,
-- For abuse tracking.
creator_ip_address VARCHAR(40) NOT NULL,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP DEFAULT NULL,
-- ========== INDICES ==========
PRIMARY KEY (id),
UNIQUE KEY (token),
KEY index_maybe_creator_user_token (maybe_creator_user_token),
KEY index_is_active (is_active),
KEY index_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -46,6 +46,7 @@ CREATE TABLE generic_inference_jobs (
-- * background_removal
inference_category VARCHAR(32) NOT NULL,
-- Enum: InferenceJobExternalThirdParty
-- If the job is externally enqueued, this is the third-party service
-- responsible for the job. Typically, we won't run an inference job for
-- jobs being run on a third party.
@@ -224,6 +224,12 @@ CREATE TABLE media_files (
-- If so, we may not need to add a watermark downstream in further processing steps.
has_watermark BOOLEAN NOT NULL DEFAULT FALSE,
-- Tracks the thumbnail algorithm/type used for this media file.
-- NULL = no thumbnail generated yet.
-- 1 = video thumbnail.
-- Other values are reserved for future thumbnail algorithms or media-specific types.
maybe_thumbnail_version TINYINT UNSIGNED DEFAULT NULL,
-- ========== UPLOAD, TRANSCODING, AND TRUNCATION DETAILS ==========
-- The hash for the bucket directory that contains the original upload
@@ -27,6 +27,8 @@ CREATE TABLE prompts (
-- What type of model was used to generate the result.
-- NB: We're conflating prompts with outputs, but in a
-- sense the model is inextricably part of the prompt.
--
-- Represented by the `CommonModelType` enum.
maybe_model_type VARCHAR(32) DEFAULT NULL,
-- What service provided the generation.
@@ -52,6 +54,29 @@ CREATE TABLE prompts (
-- TEXT = 65,535 bytes (64 KiB), ~= 4 bytes per UTF-8 character, ~ 16383 characters.
maybe_other_args TEXT DEFAULT NULL,
-- ========== GENERATION PARAMETERS ==========
-- Represented by the enum `CommonGenerationMode`.
-- The generation mode (eg. keyframe, reference, inpaint, etc.)
maybe_generation_mode VARCHAR(24) DEFAULT NULL,
-- Represented by the enum `CommonAspectRatio`.
-- The aspect ratio for the prompt (eg. square, auto, wide_three_by_two, etc.)
maybe_aspect_ratio VARCHAR(24) DEFAULT NULL,
-- Represented by the enum `CommonResolution`.
-- The resolution for the prompt (eg. four_k, 720p, etc.)
maybe_resolution VARCHAR(16) DEFAULT NULL,
-- The duration in seconds
maybe_duration_seconds INT UNSIGNED DEFAULT NULL,
-- The number of outputs to generate (0-255)
maybe_batch_count TINYINT UNSIGNED DEFAULT NULL,
-- Whether to generate audio
maybe_generate_audio BOOLEAN DEFAULT NULL,
-- ========== ABUSE TRACKING ==========
-- For abuse tracking.
@@ -66,6 +66,7 @@ CREATE TABLE users (
-- - "explore_media"
-- - "studio"
-- - "video_style_transfer"
-- - "sd_wl" (seedance whitelist)
maybe_feature_flags VARCHAR(255) DEFAULT NULL,
-- DEPRECATED
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
DROP TABLE IF EXISTS characters;
@@ -0,0 +1,55 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
CREATE TABLE characters (
-- Not used for anything except replication (private, not even used in queries)
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Public-facing "primary key" (PUBLIC)
token VARCHAR(32) NOT NULL,
-- Whether the character has been fully created and is available for use.
-- A character may exist in the database before its creation job completes.
is_active BOOLEAN NOT NULL DEFAULT false,
-- ========== CHARACTER DETAILS ==========
-- User's display name for the character.
name VARCHAR(255) NOT NULL,
-- Optional user description of the character.
maybe_description VARCHAR(512) DEFAULT NULL,
-- ========== MEDIA ==========
-- Avatar image (cropped to face, ideally).
maybe_avatar_media_token VARCHAR(32) DEFAULT NULL,
-- Full-size reference image.
maybe_full_image_media_token VARCHAR(32) DEFAULT NULL,
-- ========== CREATOR ==========
-- The user who created this character.
maybe_creator_user_token VARCHAR(32) DEFAULT NULL,
-- For abuse tracking.
creator_ip_address VARCHAR(40) NOT NULL,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP DEFAULT NULL,
-- ========== INDICES ==========
PRIMARY KEY (id),
UNIQUE KEY (token),
KEY index_maybe_creator_user_token (maybe_creator_user_token),
KEY index_is_active (is_active),
KEY index_created_at (created_at),
KEY index_deleted_at (deleted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
DROP TABLE IF EXISTS character_third_party_entities;
@@ -0,0 +1,60 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
CREATE TABLE character_third_party_entities (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Foreign key to the characters table.
character_token VARCHAR(32) NOT NULL,
-- Whether this third-party entity is active and usable.
is_active BOOLEAN NOT NULL DEFAULT false,
-- ========== THIRD PARTY DETAILS ==========
-- Which third-party system the character lives in (enum crate type).
-- e.g. "kinovi", "runway", etc.
third_party VARCHAR(32) NOT NULL,
-- The identifier in the third-party system.
-- e.g. Kinovi's "char_1774752056469_2wlxoq"
third_party_id VARCHAR(64) NOT NULL,
-- Which types of models can use this character (enum crate type).
-- e.g. "kinovi_seedance_2_pro", "kinovi_seedance_2_fast", etc.
third_party_scopes VARCHAR(32) NOT NULL,
-- The name used by the third party.
-- Important for Kinovi since characters are referenced by name in prompts.
third_party_name VARCHAR(255) NOT NULL,
-- An upstream third party of the third party (if any).
-- e.g. Kinovi's assetId "asset-20260329104101-kk5kl"
maybe_fourth_party_id VARCHAR(64) DEFAULT NULL,
-- ========== JOB TRACKING ==========
-- Our job system token (if the character was created via a job).
maybe_origin_job_token VARCHAR(32) DEFAULT NULL,
-- Third party's job system token (if any).
maybe_origin_third_party_job_id VARCHAR(64) DEFAULT NULL,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP DEFAULT NULL,
-- ========== INDICES ==========
PRIMARY KEY (id),
UNIQUE KEY unique_third_party_id (third_party, third_party_id),
KEY index_character_token (character_token),
KEY index_third_party (third_party),
KEY index_third_party_id (third_party_id),
KEY index_is_active (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
DROP TABLE IF EXISTS character_creation_assets;
@@ -0,0 +1,26 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Stores the media files (images) used as input when creating a character.
CREATE TABLE character_creation_assets (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Foreign key to the characters table.
character_token VARCHAR(32) NOT NULL,
-- The media file used as a creation input (e.g. reference image).
asset_media_file_token VARCHAR(32) NOT NULL,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- ========== INDICES ==========
PRIMARY KEY (id),
KEY index_character_token (character_token),
KEY index_asset_media_file_token (asset_media_file_token)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
DROP TABLE IF EXISTS character_creation_prompts;
@@ -0,0 +1,25 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Stores prompts/descriptions used when creating a character.
CREATE TABLE character_creation_prompts (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Foreign key to the characters table.
character_token VARCHAR(32) NOT NULL,
-- The prompt or description used during character creation.
prompt TEXT DEFAULT NULL,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- ========== INDICES ==========
PRIMARY KEY (id),
KEY index_character_token (character_token)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
+16
View File
@@ -0,0 +1,16 @@
# Use this workspace to collaborate
workspace:
id: ""
# Each entry here maps a local resource to one or more corresponding objects in Postman Cloud
cloudResources:
collections:
../postman/collections/ArtCraft API: 32845438-9defd864-8fb5-4b32-abbb-b87f16af5451
environments:
../postman/environments/Local Development.environment.yaml: 32845438-8b5c042a-aed6-491a-99a6-fcb2f72cbc44
../postman/environments/Production.environment.yaml: 32845438-a5b2562e-057d-42c2-b054-67285a50e2b7
localResources:
environments:
- ../environments/Local Development.environment.yaml
- ../environments/Production.environment.yaml
@@ -0,0 +1,6 @@
$kind: collection
variables:
- key: api_host
value: https://api.fakeyou.com
disabled: true
secret: false
@@ -0,0 +1,2 @@
$kind: collection
order: 11000
@@ -0,0 +1,2 @@
$kind: collection
order: 1000
@@ -0,0 +1,10 @@
$kind: http-request
name: Set Bearer
url: "{{api_host}}/v1/control_plane/sora_secret"
method: POST
body:
type: urlencoded
content:
key: bearer
value: ""
order: 1000
@@ -0,0 +1,10 @@
$kind: http-request
name: Set Cookie
url: "{{api_host}}/v1/control_plane/sora_secret"
method: POST
body:
type: urlencoded
content:
key: cookie
value: ""
order: 2000
@@ -0,0 +1,10 @@
$kind: http-request
name: Set Sentinel
url: "{{api_host}}/v1/control_plane/sora_secret"
method: POST
body:
type: urlencoded
content:
key: sentinel
value: ""
order: 3000
@@ -0,0 +1,2 @@
$kind: collection
order: 3000
@@ -0,0 +1,2 @@
$kind: collection
order: 5000
@@ -0,0 +1,25 @@
$kind: http-request
name: Estimate Image Cost
url: "{{api_host}}/v1/generate/cost_estimate/image"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: |
{
"model": "seedream_5_lite",
"provider": "artcraft",
"generation_mode": {"type": "text_to_image" },
"aspect_ratio": "wide_sixteen_by_nine",
"resolution": "two_k",
"image_batch_count": 1
}
order: 2000
@@ -0,0 +1,26 @@
$kind: http-request
name: Estimate Video Cost
url: "{{api_host}}/v1/generate/cost_estimate/video"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: |
{
"model": "seedance_2p0",
"provider": "artcraft",
"generation_mode": {"type": "text_to_video" },
"aspect_ratio": "wide_sixteen_by_nine",
"resolution": "four_k",
"duration_seconds": 8,
"video_batch_count": 4
}
order: 1000
@@ -0,0 +1,2 @@
$kind: collection
order: 1000
@@ -0,0 +1,18 @@
$kind: http-request
name: Background Removal
url: "{{api_host}}/v1/generate/image/remove_background"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
body:
type: json
content: |-
{
"uuid_idempotency_token": "{{$randomUUID}}",
"media_file_token": "m_v0n7g8k6saeg3t117kxf227xprtdcc"
}
order: 5000
@@ -0,0 +1,22 @@
$kind: http-request
name: Flux 1 Dev (text to image)
url: "{{api_host}}/v1/generate/image/multi_function/gpt_image_1p5"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
"prompt": "A large dinosaur looks inside a house from outside. It's looking for food. Big t-rex. Scary. Photorealistic. Face in the window.",
"number_images": 2
}
order: 6000
@@ -0,0 +1,2 @@
$kind: collection
order: 1000
@@ -0,0 +1,23 @@
$kind: http-request
name: Qwen Angle Edit
url: "{{api_host}}/v1/generate/image/angle/qwen_edit_2511"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
body:
type: json
content: |
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
"image_media_token": "m_z8v3nrjssha8rj5ayk51g85wef2cz9",
"vertical_angle": 33.0,
"horizontal_angle": 33.0
}
order: 1000
@@ -0,0 +1,2 @@
$kind: collection
order: 2000
@@ -0,0 +1,46 @@
$kind: http-request
name: Edit Gpt-Image-1
url: "{{api_host}}/v1/generate/image/edit/gpt_image_1"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
body:
type: json
content: >-
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
"image_media_tokens": ["m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb", "m_4n0p3ve9qew899774pg6w03vgzb6af", "m_9y8hy50582mwxpm8hxmh4n4wjeh5cr"],
"prompt": "Put the cube from the image on the beach. Use the night sky."
}
/*pub struct GptImage1EditImageRequest {
/// Idempotency token to prevent duplicate requests.
pub uuid_idempotency_token: String,
/// Text prompt to generate the image from.
pub prompt: Option<String>,
// TODO: OneOf for image_urls or image_media_tokens
/// Image media tokens to include in the editing context.
pub image_media_tokens: Option<Vec<MediaFileToken>>,
/// Size of the image to generate. Default is Square.
pub image_size: Option<GptImage1EditImageImageSize>,
/// Number of images to generate. Default is one.
pub num_images: Option<GptImage1EditImageNumImages>,
/// Quality of the image to generate. Default is High.
pub image_quality: Option<GptImage1EditImageImageQuality>,
}*/
order: 1000
@@ -0,0 +1,25 @@
$kind: http-request
name: Flux Pro Kontext Max
url: "{{api_host}}/v1/generate/image/edit/flux_pro_kontext_max"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
"image_media_token": "m_z8v3nrjssha8rj5ayk51g85wef2cz9",
"prompt": "Make this scene photorealistic. Change it to an overcast sky. Make the bricks look more aged and worn."
}
order: 2000
@@ -0,0 +1,2 @@
$kind: collection
order: 3000
@@ -0,0 +1,28 @@
$kind: http-request
name: Flux Pro Inpaint
url: "{{api_host}}/v1/generate/image/inpaint/flux_pro_1"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
body:
type: json
content: |
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
// m_cznbn2a1p9mcqeghbjedp12p5d60tn (dev - mochi glasses)
// m_v6ppx1jq7rbhyxpj8mg1hkryqbc9h6 (dev - mochi glasses MASK)
"image_media_token": "m_cznbn2a1p9mcqeghbjedp12p5d60tn",
"mask_media_token": "m_v6ppx1jq7rbhyxpj8mg1hkryqbc9h6",
"prompt": "Remove the glasses"
}
order: 1000
@@ -0,0 +1,2 @@
$kind: collection
order: 4000
@@ -0,0 +1,32 @@
$kind: http-request
name: Bytedance Seedream 4.5 (edit image)
url: "{{api_host}}/v1/generate/image/multi_function/bytedance_seedream_4p5"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
// m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2 (dev halide - link)
// m_7jjskg45d8b00tsp5nxee0xjsr2fqw (dev halide - link again)
// m_5hhwgx47tzc68ms2ydkkwrdjakwtxk (dev halide - asian girl in rain)
// m_zm0xjkxrjh7vqxm3nd70qva49bnngn (dev halide - skeletal pose)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
"image_media_tokens": ["m_4n0p3ve9qew899774pg6w03vgzb6af", "m_9y8hy50582mwxpm8hxmh4n4wjeh5cr", "m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb"],
"prompt": "Put the stars above the beach scene at night, add the cube on the beach."
}
order: 4000
@@ -0,0 +1,22 @@
$kind: http-request
name: Bytedance Seedream 4.5 (text to image)
url: "{{api_host}}/v1/generate/image/multi_function/bytedance_seedream_4p5"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
"prompt": "A large dinosaur looks inside a house from outside. It's looking for food. Big t-rex. Scary. Photorealistic. Face in the window.",
"number_images": 2
}
order: 6000
@@ -0,0 +1,22 @@
$kind: http-request
name: Bytedance Seedream 5 Lite
url: "{{api_host}}/v1/generate/image/multi_function/bytedance_seedream_5_lite"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
"prompt": "A large dinosaur looks inside a house from outside. It's looking for food. Big t-rex. Scary. Photorealistic. Face in the window.",
"number_images": 2
}
order: 7000
@@ -0,0 +1,32 @@
$kind: http-request
name: GPT Image 1.5 (edit image)
url: "{{api_host}}/v1/generate/image/multi_function/gpt_image_1p5"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
// m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2 (dev halide - link)
// m_7jjskg45d8b00tsp5nxee0xjsr2fqw (dev halide - link again)
// m_5hhwgx47tzc68ms2ydkkwrdjakwtxk (dev halide - asian girl in rain)
// m_zm0xjkxrjh7vqxm3nd70qva49bnngn (dev halide - skeletal pose)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
"image_media_tokens": ["m_4n0p3ve9qew899774pg6w03vgzb6af", "m_9y8hy50582mwxpm8hxmh4n4wjeh5cr", "m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb"],
"prompt": "Put the stars above the beach scene at night, add the cube on the beach."
}
order: 3000
@@ -0,0 +1,22 @@
$kind: http-request
name: GPT Image 1.5 (text to image)
url: "{{api_host}}/v1/generate/image/flux_1_dev_text_to_image"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
"prompt": "A large dinosaur looks inside a house from outside. It's looking for food. Big t-rex. Scary. Photorealistic. Face in the window.",
"number_images": 2
}
order: 5000
@@ -0,0 +1,20 @@
$kind: http-request
name: Nano Banana 2
url: "{{api_host}}/v1/generate/image/multi_function/nano_banana_2"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
body:
type: json
content: |
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p4chw32084te7dv8t4jc3bjfmafmjh (these tokens are invalid)
//"image_media_tokens": [],
"prompt": "A t-rex jumping rope, photorealistic. The t-rex is nervous."
}
order: 2000
@@ -0,0 +1,30 @@
$kind: http-request
name: Nano Banana Pro (reference image)
url: "{{api_host}}/v1/generate/image/multi_function/nano_banana_pro"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
// m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2 (dev halide - link)
// m_7jjskg45d8b00tsp5nxee0xjsr2fqw (dev halide - link again)
// m_5hhwgx47tzc68ms2ydkkwrdjakwtxk (dev halide - asian girl in rain)
// m_zm0xjkxrjh7vqxm3nd70qva49bnngn (dev halide - skeletal pose)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
"image_media_tokens": ["m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2", "m_5hhwgx47tzc68ms2ydkkwrdjakwtxk", "m_p4chw32084te7dv8t4jc3bjfmafmjh"],
"prompt": "Add the man and the girl to the water scene. Make them hold hands."
}
order: 1000
@@ -0,0 +1,2 @@
$kind: collection
order: 3000
@@ -0,0 +1,23 @@
$kind: http-request
name: Generate Hunyuan 2 Image to 3d
url: "{{api_host}}/v1/generate/object/hunyuan_2_image_to_3d"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: ""
value: ""
disabled: true
body:
type: json
content: |-
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod)
"media_file_token": "m_z8v3nrjssha8rj5ayk51g85wef2cz9"
}
order: 2000
@@ -0,0 +1,2 @@
$kind: collection
order: 1000
@@ -0,0 +1,31 @@
$kind: http-request
name: Generate Hunyuan 3D v3 Image to Object
url: "{{api_host}}/v1/generate/object/multi_function/hunyuan3d_v3"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: ""
value: ""
disabled: true
body:
type: json
content: |-
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
// m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2 (dev halide - link)
// m_7jjskg45d8b00tsp5nxee0xjsr2fqw (dev halide - link again)
// m_5hhwgx47tzc68ms2ydkkwrdjakwtxk (dev halide - asian girl in rain)
// m_zm0xjkxrjh7vqxm3nd70qva49bnngn (dev halide - skeletal pose)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
"image_media_token": "m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1"
}
order: 1000
@@ -0,0 +1,21 @@
$kind: http-request
name: Generate Hunyuan 3D v3 Text to Object
url: "{{api_host}}/v1/generate/object/multi_function/hunyuan3d_v3"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: ""
value: ""
disabled: true
body:
type: json
content: |-
{
"uuid_idempotency_token": "{{$randomUUID}}",
"prompt": "a large blue dragon with a smile"
}
order: 2000
@@ -0,0 +1,2 @@
$kind: collection
order: 4000
@@ -0,0 +1,21 @@
$kind: http-request
name: Marble 0.1 Mini
url: "{{api_host}}/v1/generate/splat/worldlabs_marble_0p1_mini"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: |
{
"uuid_idempotency_token": "{{$randomUUID}}",
"prompt": "A hidden forest grotto, fireflies, lush green"
}
order: 1000
@@ -0,0 +1,2 @@
$kind: collection
order: 2000
@@ -0,0 +1,24 @@
$kind: http-request
name: Generate Kling 1.6 Video
url: "{{api_host}}/v1/generate/video/kling_1.6_pro_image_to_video"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
body:
type: json
content: >-
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_mxr5s0qpbj0w321pqcw7s2pj93c962 (dev - container ship)
// m_f249t2nb8nggqd7ynpsjps5qmym5h3 (dev - oil tanker)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod)
"media_file_token": "m_mxr5s0qpbj0w321pqcw7s2pj93c962",
"end_frame_image_media_token": "m_f249t2nb8nggqd7ynpsjps5qmym5h3",
"prompt": "A large ship in a lake, the camera pulls back and shows the oil tanker from overhead"
}
order: 2000
@@ -0,0 +1,24 @@
$kind: http-request
name: Generate Kling 2.1 Pro Video
url: "{{api_host}}/v1/generate/video/kling_2.1_pro_image_to_video"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
body:
type: json
content: >-
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev) - cube
// m_mxr5s0qpbj0w321pqcw7s2pj93c962 (dev - container ship)
// m_f249t2nb8nggqd7ynpsjps5qmym5h3 (dev - oil tanker)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod)
"media_file_token": "m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb",
"end_frame_image_media_token": "m_f249t2nb8nggqd7ynpsjps5qmym5h3",
"prompt": "A large ship in a lake, the camera pulls back and shows the oil tanker from overhead"
}
order: 3000
@@ -0,0 +1,2 @@
$kind: collection
order: 1000
@@ -0,0 +1,33 @@
$kind: http-request
name: Kling 2.5 Turbo Pro (image to video)
url: "{{api_host}}/v1/generate/video/multi_function/kling_2p5_turbo_pro"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: |
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
// m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2 (dev halide - link)
// m_7jjskg45d8b00tsp5nxee0xjsr2fqw (dev halide - link again)
// m_5hhwgx47tzc68ms2ydkkwrdjakwtxk (dev halide - asian girl in rain)
// m_zm0xjkxrjh7vqxm3nd70qva49bnngn (dev halide - skeletal pose)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
"start_frame_image_media_token": "m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1",
"prompt": "The camera is zooming by. It shows the full city"
}
order: 5000
@@ -0,0 +1,33 @@
$kind: http-request
name: Kling 2.6 Pro (image to video)
url: "{{api_host}}/v1/generate/video/multi_function/kling_2p6_pro"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: |
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
// m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2 (dev halide - link)
// m_7jjskg45d8b00tsp5nxee0xjsr2fqw (dev halide - link again)
// m_5hhwgx47tzc68ms2ydkkwrdjakwtxk (dev halide - asian girl in rain)
// m_zm0xjkxrjh7vqxm3nd70qva49bnngn (dev halide - skeletal pose)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
"start_frame_image_media_token": "m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1",
"prompt": "The camera is zooming by. It shows the full city"
}
order: 6000
@@ -0,0 +1,28 @@
$kind: http-request
name: Kling 3.0 Pro (image to video)
url: "{{api_host}}/v1/generate/video/multi_function/kling_3p0_pro"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
"start_frame_image_media_token": "m_8q0hx7g06dfrf28xxhjkgjhwcnqtbz",
"end_frame_image_media_token": "m_8q0hx7g06dfrf28xxhjkgjhwcnqtbz",
"prompt": "The corgi dances in a loop and then returns back to where it started"
}
order: 7000
@@ -0,0 +1,31 @@
$kind: http-request
name: Seedance 1.5 Pro (frame to video)
url: "{{api_host}}/v1/generate/video/multi_function/seedance_1p5_pro"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2 (dev halide - link)
// m_7jjskg45d8b00tsp5nxee0xjsr2fqw (dev halide - link again)
// m_5hhwgx47tzc68ms2ydkkwrdjakwtxk (dev halide - asian girl in rain)
// m_zm0xjkxrjh7vqxm3nd70qva49bnngn (dev halide - skeletal pose)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
// m_wfyggg046gp7tqvexd9xar4t6zr5yj (artcraft mac - trains)
// m_qty2g150r6ppkbapnryc4fx4ayf8rh (artcraft mac - trains wide)
"prompt": "A subway and a passenger train are moving along outside the window. The camera pans out to show a wider view of the city and trains.",
"start_frame_media_token": "m_wfyggg046gp7tqvexd9xar4t6zr5yj",
"end_frame_media_token": "m_qty2g150r6ppkbapnryc4fx4ayf8rh"
}
order: 2000
@@ -0,0 +1,22 @@
$kind: http-request
name: Seedance 1.5 Pro (text to video)
url: "{{api_host}}/v1/generate/video/multi_function/seedance_1p5_pro"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: |
{
"uuid_idempotency_token": "{{$randomUUID}}",
"prompt": "A giant is walking around in a forest",
"duration_seconds": 4
}
order: 1000
@@ -0,0 +1,31 @@
$kind: http-request
name: Seedance 2.0 (frame to video)
url: "{{api_host}}/v1/generate/video/multi_function/seedance_2p0"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2 (dev halide - link)
// m_7jjskg45d8b00tsp5nxee0xjsr2fqw (dev halide - link again)
// m_5hhwgx47tzc68ms2ydkkwrdjakwtxk (dev halide - asian girl in rain)
// m_zm0xjkxrjh7vqxm3nd70qva49bnngn (dev halide - skeletal pose)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
// m_wfyggg046gp7tqvexd9xar4t6zr5yj (artcraft mac - trains)
// m_qty2g150r6ppkbapnryc4fx4ayf8rh (artcraft mac - trains wide)
"prompt": "A subway and a passenger train are moving along outside the window. The camera pans out to show a wider view of the city and trains.",
"start_frame_media_token": "m_wfyggg046gp7tqvexd9xar4t6zr5yj",
"end_frame_media_token": "m_qty2g150r6ppkbapnryc4fx4ayf8rh"
}
order: 4000
@@ -0,0 +1,22 @@
$kind: http-request
name: Seedance 2.0 (text to video)
url: "{{api_host}}/v1/generate/video/multi_function/seedance_2p0"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: |
{
"uuid_idempotency_token": "{{$randomUUID}}",
"prompt": "A red panda is is walking around in a forest",
"duration_seconds": 4
}
order: 3000
@@ -0,0 +1,33 @@
$kind: http-request
name: Sora 2 (image to video)
url: "{{api_host}}/v1/generate/video/multi_function/sora_2"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
// m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2 (dev halide - link)
// m_7jjskg45d8b00tsp5nxee0xjsr2fqw (dev halide - link again)
// m_5hhwgx47tzc68ms2ydkkwrdjakwtxk (dev halide - asian girl in rain)
// m_zm0xjkxrjh7vqxm3nd70qva49bnngn (dev halide - skeletal pose)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
"image_media_token": "m_9y8hy50582mwxpm8hxmh4n4wjeh5cr",
"prompt": "The stars twinkle. There's a shooting star. The camera lowers to show the night sky above the forest"
}
order: 10000
@@ -0,0 +1,33 @@
$kind: http-request
name: Sora 2 Pro (image to video)
url: "{{api_host}}/v1/generate/video/multi_function/sora_2_pro"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
// m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2 (dev halide - link)
// m_7jjskg45d8b00tsp5nxee0xjsr2fqw (dev halide - link again)
// m_5hhwgx47tzc68ms2ydkkwrdjakwtxk (dev halide - asian girl in rain)
// m_zm0xjkxrjh7vqxm3nd70qva49bnngn (dev halide - skeletal pose)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
"image_media_token": "m_9y8hy50582mwxpm8hxmh4n4wjeh5cr",
"prompt": "The stars twinkle. There's a shooting star. The camera lowers to show the night sky above the forest"
}
order: 11000
@@ -0,0 +1,33 @@
$kind: http-request
name: Veo 3.1 (image to video) Copy
url: "{{api_host}}/v1/generate/video/multi_function/veo_3p1"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
// m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2 (dev halide - link)
// m_7jjskg45d8b00tsp5nxee0xjsr2fqw (dev halide - link again)
// m_5hhwgx47tzc68ms2ydkkwrdjakwtxk (dev halide - asian girl in rain)
// m_zm0xjkxrjh7vqxm3nd70qva49bnngn (dev halide - skeletal pose)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
"start_frame_image_media_token": "m_9y8hy50582mwxpm8hxmh4n4wjeh5cr",
"prompt": "The stars twinkle. There's a shooting star. The camera lowers to show the night sky above the forest"
}
order: 8000
@@ -0,0 +1,33 @@
$kind: http-request
name: Veo 3.1 Fast (image to video)
url: "{{api_host}}/v1/generate/video/multi_function/veo_3p1_fast"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
- key: Session
value: ""
disabled: true
body:
type: json
content: >
{
"uuid_idempotency_token": "{{$randomUUID}}",
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev)
// m_z8v3nrjssha8rj5ayk51g85wef2cz9 (prod - godzilla stacks)
// m_4n0p3ve9qew899774pg6w03vgzb6af (dev - beach)
// m_9y8hy50582mwxpm8hxmh4n4wjeh5cr (dev - stars)
// m_p2hvrt9zd0mmexy7x5r7n8bx9ma3zb (dev - cube)
// m_w7cpyqr45d11fw9ca1wbkxp1q3kxs1 (dev - studio alley screenshot)
// m_gn0yvdvd8mw71m5n8whxsa6ywgsdb2 (dev halide - link)
// m_7jjskg45d8b00tsp5nxee0xjsr2fqw (dev halide - link again)
// m_5hhwgx47tzc68ms2ydkkwrdjakwtxk (dev halide - asian girl in rain)
// m_zm0xjkxrjh7vqxm3nd70qva49bnngn (dev halide - skeletal pose)
// m_p4chw32084te7dv8t4jc3bjfmafmjh (dev halide - water shader)
"start_frame_image_media_token": "m_9y8hy50582mwxpm8hxmh4n4wjeh5cr",
"prompt": "The stars twinkle. There's a shooting star. The camera lowers to show the night sky above the forest"
}
order: 9000
@@ -0,0 +1,2 @@
$kind: collection
order: 9000
@@ -0,0 +1,28 @@
$kind: http-request
name: Prompt Image
url: "{{api_host}}/v1/image_studio/prompt"
method: POST
headers:
- key: Session
value: ""
disabled: true
- key: Accept
value: application/json
- key: sora-bearer
value: ""
disabled: true
- key: sora-cookie
value: ""
disabled: true
- key: sora-sentinel
value: ""
disabled: true
body:
type: json
content: >-
{
"uuid_idempotency_token": "{{$randomUUID}}",
"snapshot_media_token": "m_kaghwk8vsn5yw1qp6q7yzbx9szfgwe",
"prompt": "Match the provided image's composition and pose exactly as a reference. The characters should have the exact body poses, and the layouts of buildings and props should be close to exact. A girl standing in the middle of a clock town. N64 aesthetic."
}
order: 2000

Some files were not shown because too many files have changed in this diff Show More