Compare commits

...
Author SHA1 Message Date
Brandon Thomas 3b88979859 remove print statements 2026-04-08 10:22:56 -04:00
Brandon Thomas 20f16236e6 transcode video 2026-04-08 10:21:37 -04:00
Brandon Thomas df3dac8982 ffmpeg transcode 2026-04-08 10:00:10 -04:00
bflatastic ccea741443 fix safari mobile api calls/login not working since its third party 2026-04-08 14:45:29 +07:00
Brandon Thomas 2b9882d2d7 fix tests 2026-04-08 00:03:47 -04:00
bflatastic 55cab30dec comment out web generation access for now 2026-04-08 10:06:22 +07:00
Brandon Thomas a2f204b1be additional context for pages (#1317) 2026-04-07 19:07:49 -04:00
Brandon Thomas 12e4ff7a29 Omni Gen Video Models (#1316) 2026-04-07 17:05:52 -04:00
Brandon Thomas 8b73569238 omni image models (#1314) 2026-04-07 03:38:23 -04:00
Brandon Thomas badabe57eb fix inference-job 2026-04-07 00:49:18 -04:00
Brandon Thomas 2e62eef85b Bt cleanup web (#1313) 2026-04-07 00:43:21 -04:00
Brandon Thomas fd9f002615 avt cleanup (fix paging) (#1312) 2026-04-07 00:29:18 -04:00
Brandon Thomas a0e50067bb stop the session and session jobs alert pages by fixing error handling (#1310)
- was still getting dozens of pages from these two endpoints
- fixed the error chain so this is semantically correct
- improved code quality of legacy code/endpoints
2026-04-06 20:56:28 -04:00
Brandon Thomas 2b97694ebf omni gen for a few image models (#1308) 2026-04-06 04:10:14 -04:00
Brandon Thomas 0f6998cb6b bump artcraft 0.23 -> 0.24 (#1307) 2026-04-05 17:57:42 -04:00
Brandon Thomas 8076d1b830 fix builds (#1306) 2026-04-05 02:55:08 -04:00
Brandon Thomas 9842734ce7 more cleanup of deprecated or orphaned code (#1305) 2026-04-05 02:35:55 -04:00
Brandon Thomas 72761e11f3 delete public enums crate - old tech debt / cruft (#1304)
Ages ago I tried to hide what we were doing from "Uberduck". That was
stupid. As if it mattered.

Never again.
2026-04-04 23:04:32 -04:00
bflatastic 60c97ff312 characters modal bug overflowing on very small screens 2026-04-05 06:40:55 +07:00
BFlat 03ed457cb5 remove character limits on seedance 2 and nano banana models (#1303) 2026-04-05 06:24:30 +07:00
Brandon Thomas e89229896f character descriptions max length (#1302) 2026-04-04 16:50:44 -04:00
Brandon Thomas 56c1b57cce bump website version to 0.23 2026-04-03 19:16:02 -04:00
bflatastic 122c1d6688 mention text area small styling fix 2026-04-04 05:40:52 +07:00
Brandon Thomas 6768208af3 bump artcraft 0.22 -> 0.23 2026-04-03 18:31:21 -04:00
Brandon Thomas 99b5a9774a Frontend failure text updates (#1300) 2026-04-03 18:20:06 -04:00
BFlat f55a4c722e mentions text area (#1299)
- content editable div instead of textarea when mentions is needed
- no more overlayed text areas and misaligned cursors
2026-04-04 05:16:14 +07:00
Tanish Manku f337d630e3 Fix: Allow asset.localhost in CSP for Windows drag-drop (#1298)
On Windows production builds, convertFileSrc() generates
https://asset.localhost/... URLs. The connect-src CSP only had "asset:"
(covering asset:// on macOS/Linux) but not https://asset.localhost,
causing the fetch() in GlobalFileDropHandler to be silently blocked —
overlay appeared but no modal opened on drop.
2026-04-03 14:46:32 -07:00
Brandon Thomas b4e1e3ea57 marketing tracking (#1297) 2026-04-03 15:06:38 -04:00
bflatastic 71fd694368 maybe_landing_url signup params 2026-04-03 23:51:11 +07:00
bflatastic f2c386dcb9 Merge branch 'main' of https://github.com/storytold/storyteller-rust 2026-04-03 23:39:36 +07:00
bflatastic ffb8cbe433 landing videos updates 2026-04-03 23:39:09 +07:00
Brandon Thomas 5f062c4512 new optional signup params 2026-04-03 12:37:33 -04:00
Brandon Thomas 2442cda22f bump ArtCraft 0.21 -> 0.22 (#1296) 2026-04-03 11:36:17 -04:00
Brandon Thomas 0a534921ce fix mac build 2026-04-03 11:34:46 -04:00
Brandon Thomas 1fecc4405c Bump ArtCraft 0.20 -> 0.21 (#1295) 2026-04-03 11:05:47 -04:00
bflatastic cbca7e3cb4 confirm before deleting character alert dialog 2026-04-03 15:28:40 +07:00
BFlat d107b78498 characters (#1280)
- Create, list, delete characters for use as reference with seedance 2.0
- Characters are mentionable in the prompt box by using the @ sign
2026-04-03 15:19:41 +07:00
Brandon Thomas 702bdc8777 tauri characters via artcraft_router (#1293) 2026-04-03 03:37:04 -04:00
Brandon Thomas 4fe36781de characters job (#1292) 2026-04-03 02:50:04 -04:00
bflatastic 029375052d fix lightbox carousel not loading on second open 2026-04-03 12:06:21 +07:00
Brandon Thomas 72d680411f characters API and schema (#1290) 2026-04-03 00:17:03 -04:00
bflatastic 79a7443baa fixed library arrow keys navigation 2026-04-03 09:06:29 +07:00
Brandon Thomas 004a5c157a rich paging on both fal and seedance webhook handlers (#1289) 2026-04-02 03:51:46 -04:00
BFlat 63d3d63709 promptbox expand overflow bug fixed (#1288) 2026-04-02 12:45:22 +07:00
Brandon Thomas d6e23838ce advanced http errors (#1287) 2026-04-02 01:31:03 -04:00
BFlat 6785db1d59 task queue: group fail messages in tooltip, prompt message on every card type (#1286)
- grouped fail message with fail reason under one tooltip for cleaner ui
- prompt / copy prompt for every type of task card
- larger thumbnails, wider task queue dropdown
- removed prompt hover on card thumbnails
- marquee css updated
- other styling cleanups
2026-04-02 10:13:52 +07: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
896 changed files with 32596 additions and 12655 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
+63
View File
@@ -0,0 +1,63 @@
# 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};`
- Never use `println!` or `eprintln!` outside of tests; use `log` crate macros (`info!`, `warn!`, `error!`, `debug!`, `trace!`) instead
- 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
- When two crates export a type with the same name, alias with a suffix describing the source crate:
`use enums::...::CommonResolution as CommonResolutionEnum;`
`use artcraft_router::...::CommonResolution as CommonResolutionRouter;`
This avoids long fully-qualified paths in function signatures and bodies.
## 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
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO characters\nSET\n token = ?,\n character_type = ?,\n is_active = false,\n character_name = ?,\n maybe_description = ?,\n maybe_avatar_media_token = NULL,\n maybe_full_image_media_token = NULL,\n maybe_original_upload_media_token = ?,\n maybe_creator_user_token = ?,\n creator_ip_address = ?,\n kinovi_character_id = ?,\n kinovi_character_name = ?,\n maybe_kinovi_asset_id = NULL,\n maybe_generic_inference_job_token = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 10
},
"nullable": []
},
"hash": "2a19cc533815aa3325b940eafe56b9f014fedb3b360b954935d6ec13ff14302d"
}
@@ -1,12 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO users\nSET\n token = ?,\n \n is_temporary = ?,\n \n username = ?,\n display_name = ?,\n\n username_is_generated = ?,\n username_is_not_customized = ?,\n\n email_address = ?,\n email_gravatar_hash = ?,\n\n email_confirmed = FALSE,\n email_confirmed_by_google = ?,\n email_is_synthetic = ?,\n \n was_eagerly_provisioned = ?,\n\n profile_markdown = ?,\n profile_rendered_html = ?,\n user_role_slug = ?,\n\n password_hash = ?,\n is_without_password = ?,\n\n maybe_feature_flags = ?,\n\n ip_address_creation = ?,\n ip_address_last_login = ?,\n ip_address_last_update = ?,\n\n maybe_source = ?,\n\n maybe_signup_method = ?,\n\n maybe_referral_url = ?\n ",
"query": "\nINSERT INTO users\nSET\n token = ?,\n \n is_temporary = ?,\n \n username = ?,\n display_name = ?,\n\n username_is_generated = ?,\n username_is_not_customized = ?,\n\n email_address = ?,\n email_gravatar_hash = ?,\n\n email_confirmed = FALSE,\n email_confirmed_by_google = ?,\n email_is_synthetic = ?,\n \n was_eagerly_provisioned = ?,\n\n profile_markdown = ?,\n profile_rendered_html = ?,\n user_role_slug = ?,\n\n password_hash = ?,\n is_without_password = ?,\n\n maybe_feature_flags = ?,\n\n ip_address_creation = ?,\n ip_address_last_login = ?,\n ip_address_last_update = ?,\n\n maybe_source = ?,\n\n maybe_signup_method = ?,\n\n maybe_referral_url = ?,\n maybe_landing_url = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 23
"Right": 24
},
"nullable": []
},
"hash": "08996721482fe897c2721298c04cf0eba5fcf1d04d57397b8afab3dd59feaa8c"
"hash": "3aacc0d270a9073ee5a38595cc32ab7793e0e8b9ce3ad81f554e7198fd0fd509"
}
@@ -0,0 +1,157 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n id as `id: u64`,\n token as `token: tokens::tokens::characters::CharacterToken`,\n character_type as `character_type: enums::by_table::characters::character_type::CharacterType`,\n is_active as `is_active: bool`,\n character_name,\n maybe_description,\n maybe_avatar_media_token as `maybe_avatar_media_token: tokens::tokens::media_files::MediaFileToken`,\n maybe_full_image_media_token as `maybe_full_image_media_token: tokens::tokens::media_files::MediaFileToken`,\n maybe_original_upload_media_token as `maybe_original_upload_media_token: tokens::tokens::media_files::MediaFileToken`,\n maybe_creator_user_token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n kinovi_character_id,\n kinovi_character_name,\n maybe_kinovi_asset_id\nFROM characters\nWHERE maybe_creator_user_token = ?\n AND is_active = true\n AND deleted_at IS NULL\n AND id < ?\nORDER BY 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::characters::CharacterToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "character_type: enums::by_table::characters::character_type::CharacterType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 96
}
},
{
"ordinal": 3,
"name": "is_active: bool",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL | MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 4,
"name": "character_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 5,
"name": "maybe_description",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 2048
}
},
{
"ordinal": 6,
"name": "maybe_avatar_media_token: tokens::tokens::media_files::MediaFileToken",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "maybe_full_image_media_token: tokens::tokens::media_files::MediaFileToken",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 8,
"name": "maybe_original_upload_media_token: tokens::tokens::media_files::MediaFileToken",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 9,
"name": "maybe_creator_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 10,
"name": "kinovi_character_id",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 256
}
},
{
"ordinal": 11,
"name": "kinovi_character_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 12,
"name": "maybe_kinovi_asset_id",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 256
}
}
],
"parameters": {
"Right": 3
},
"nullable": [
false,
false,
false,
false,
true,
true,
true,
true,
true,
true,
true,
true,
true
]
},
"hash": "8c130ebd0d192355844863b3ebd44952aa8715eebe96375fb28f9f12baf7f9b1"
}
@@ -0,0 +1,47 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n jobs.token as `job_token: tokens::tokens::generic_inference_jobs::InferenceJobToken`,\n jobs.maybe_external_third_party_id as `kinovi_character_id`,\n jobs.maybe_creator_user_token as `maybe_creator_user_token: tokens::tokens::users::UserToken`\n\nFROM generic_inference_jobs as jobs\n\nWHERE jobs.maybe_external_third_party = ?\n AND jobs.job_type = ?\n AND jobs.status NOT IN ('complete_success', 'complete_failure')\n AND jobs.maybe_external_third_party_id IS NOT NULL\n\nLIMIT 25000\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "job_token: tokens::tokens::generic_inference_jobs::InferenceJobToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "kinovi_character_id",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 256
}
},
{
"ordinal": 2,
"name": "maybe_creator_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
}
],
"parameters": {
"Right": 2
},
"nullable": [
false,
true,
true
]
},
"hash": "9bd472515a1ec55a4b3eed9b37baea3a9740484172086b1797889a5f88b5750f"
}
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n jobs.token as `job_token: tokens::tokens::generic_inference_jobs::InferenceJobToken`,\n jobs.maybe_external_third_party_id as `order_id`,\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 jobs.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n jobs.maybe_prompt_token as `maybe_prompt_token: tokens::tokens::prompts::PromptToken`,\n jobs.maybe_wallet_ledger_entry_token as `maybe_wallet_ledger_entry_token: tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken`\n\nFROM generic_inference_jobs as jobs\n\nWHERE jobs.maybe_external_third_party = ?\n AND jobs.status NOT IN ('complete_success', 'complete_failure')\n AND jobs.maybe_external_third_party_id IS NOT NULL\n\nLIMIT 25000\n ",
"query": "\nSELECT\n jobs.token as `job_token: tokens::tokens::generic_inference_jobs::InferenceJobToken`,\n jobs.maybe_external_third_party_id as `order_id`,\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 jobs.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n jobs.maybe_prompt_token as `maybe_prompt_token: tokens::tokens::prompts::PromptToken`,\n jobs.maybe_wallet_ledger_entry_token as `maybe_wallet_ledger_entry_token: tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken`\n\nFROM generic_inference_jobs as jobs\n\nWHERE jobs.maybe_external_third_party = ?\n AND jobs.job_type = ?\n AND jobs.status NOT IN ('complete_success', 'complete_failure')\n AND jobs.maybe_external_third_party_id IS NOT NULL\n\nLIMIT 25000\n ",
"describe": {
"columns": [
{
@@ -85,7 +85,7 @@
}
],
"parameters": {
"Right": 1
"Right": 2
},
"nullable": [
false,
@@ -98,5 +98,5 @@
true
]
},
"hash": "cb33fd483f0fef7ec2a1f5950218f312a19e38c7971b88db949ccaa05bf7b7c4"
"hash": "a0002183d4d077b07bb0cd062ca95bf113d1564ce3195f0e62e531ce4297dd76"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE characters\nSET\n is_active = true,\n maybe_avatar_media_token = ?,\n maybe_full_image_media_token = ?,\n maybe_kinovi_asset_id = ?\nWHERE token = ?\n AND deleted_at IS NULL\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 4
},
"nullable": []
},
"hash": "abbd24f51fae54ba3cd54ec7e3caf1ed7121b244796331d56b2d7f20eb7d4b9b"
}
@@ -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 = NULL,\n\n maybe_wallet_ledger_entry_token = NULL,\n\n maybe_raw_inference_text = NULL,\n\n maybe_inference_args = NULL,\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": 12
},
"nullable": []
},
"hash": "b0ba0fe63908df3d66b4820ca47cbb773786e480464c84a278fe63b1fa8913b4"
}
@@ -0,0 +1,146 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n token as `token: tokens::tokens::characters::CharacterToken`,\n character_type as `character_type: enums::by_table::characters::character_type::CharacterType`,\n is_active as `is_active: bool`,\n character_name,\n maybe_description,\n maybe_avatar_media_token as `maybe_avatar_media_token: tokens::tokens::media_files::MediaFileToken`,\n maybe_full_image_media_token as `maybe_full_image_media_token: tokens::tokens::media_files::MediaFileToken`,\n maybe_original_upload_media_token as `maybe_original_upload_media_token: tokens::tokens::media_files::MediaFileToken`,\n maybe_creator_user_token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n kinovi_character_id,\n kinovi_character_name,\n maybe_kinovi_asset_id\nFROM characters\nWHERE token = ?\n AND deleted_at IS NULL\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token: tokens::tokens::characters::CharacterToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "character_type: enums::by_table::characters::character_type::CharacterType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 96
}
},
{
"ordinal": 2,
"name": "is_active: bool",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL | MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 3,
"name": "character_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 4,
"name": "maybe_description",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 2048
}
},
{
"ordinal": 5,
"name": "maybe_avatar_media_token: tokens::tokens::media_files::MediaFileToken",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 6,
"name": "maybe_full_image_media_token: tokens::tokens::media_files::MediaFileToken",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "maybe_original_upload_media_token: tokens::tokens::media_files::MediaFileToken",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 8,
"name": "maybe_creator_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 9,
"name": "kinovi_character_id",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 256
}
},
{
"ordinal": 10,
"name": "kinovi_character_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 11,
"name": "maybe_kinovi_asset_id",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 256
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
true,
true,
true,
true,
true,
true,
true,
true,
true
]
},
"hash": "e9078c593087df3da20dbd193cdad102d6bb3ae83ee81c8c4ad75fe184e03c92"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE characters\nSET\n character_name = ?,\n kinovi_character_name = ?,\n maybe_description = ?\nWHERE token = ?\n AND deleted_at IS NULL\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 4
},
"nullable": []
},
"hash": "f54e22efa17f3b8d36387dfd724e1fd0c88634fc8defa420ddd2de7e9103518c"
}
+15
View File
@@ -17,6 +17,8 @@ artcraft/
│ ├── 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
@@ -58,5 +60,18 @@ artcraft/
- Actix-web for HTTP services
- SQLx for MySQL and SQLite
- A mix of wreq and reqwest for Rust HTTP clients
- Never use `println!` or `eprintln!` outside of tests; use `log` crate macros instead
- When two crates export the same type name, alias imports with a suffix: `use foo::Bar as BarFoo;`
- 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
+45 -39
View File
@@ -508,7 +508,6 @@ version = "0.0.1"
dependencies = [
"anyhow",
"chrono",
"config",
"datetimes",
"dotenv",
"easyenv",
@@ -523,6 +522,7 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
"shared_env_var_config",
"sqlx",
"tokens",
"tokio",
@@ -727,7 +727,6 @@ dependencies = [
"anyhow",
"chrono",
"enums",
"enums_public",
"serde",
"serde_derive",
"serde_json",
@@ -748,7 +747,6 @@ dependencies = [
"cloudflare_errors",
"cookie 0.18.1",
"enums",
"enums_public",
"errors",
"log",
"mimetypes",
@@ -3133,7 +3131,6 @@ dependencies = [
"bucket_paths",
"clap 4.5.60",
"cloud_storage",
"config",
"easyenv",
"elasticsearch",
"enums",
@@ -3144,6 +3141,7 @@ dependencies = [
"mimetypes",
"mysql_queries",
"rand 0.9.2",
"shared_env_var_config",
"sqlx",
"storyteller_root",
"tokens",
@@ -3159,7 +3157,6 @@ dependencies = [
"bucket_paths",
"clap 4.5.60",
"cloud_storage",
"config",
"easyenv",
"enums",
"errors",
@@ -3167,6 +3164,7 @@ dependencies = [
"log",
"mimetypes",
"mysql_queries",
"shared_env_var_config",
"sqlx",
"tokens",
"tokio",
@@ -3438,6 +3436,7 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
"shared_env_var_config",
"sqlx",
"storyteller_root",
"subprocess",
@@ -3445,6 +3444,7 @@ dependencies = [
"tempdir",
"tokens",
"tokio",
"url",
"workspace-build-acceleration",
"zip 0.6.6",
]
@@ -3610,7 +3610,6 @@ version = "0.0.1"
dependencies = [
"bucket_paths",
"clap 4.5.60",
"config",
"easyenv",
"elasticsearch",
"elasticsearch_schema",
@@ -3622,6 +3621,7 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
"shared_env_var_config",
"sqlx",
"storyteller_root",
"strum",
@@ -3701,6 +3701,7 @@ dependencies = [
"serde_derive",
"serde_json",
"server_environment",
"shared_env_var_config",
"sqlx",
"workspace-build-acceleration",
]
@@ -3794,20 +3795,6 @@ dependencies = [
"workspace-build-acceleration",
]
[[package]]
name = "enums_public"
version = "0.0.1"
dependencies = [
"enums",
"serde",
"serde_derive",
"serde_json",
"strum",
"toml 1.0.7+spec-1.1.0",
"utoipa",
"workspace-build-acceleration",
]
[[package]]
name = "env"
version = "1.0.1"
@@ -3904,7 +3891,6 @@ dependencies = [
"anyhow",
"bootstrap",
"chrono",
"config",
"dotenv",
"easyenv",
"elasticsearch",
@@ -3923,6 +3909,7 @@ dependencies = [
"serde_derive",
"serde_json",
"server_environment",
"shared_env_var_config",
"sqlx",
"storyteller_root",
"tokens",
@@ -5163,6 +5150,12 @@ dependencies = [
"pin-project-lite",
]
[[package]]
name = "http-range"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573"
[[package]]
name = "http-types"
version = "2.12.0"
@@ -5758,6 +5751,7 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
"shared_env_var_config",
"sqlx",
"subprocess",
"subprocess_common",
@@ -6095,7 +6089,6 @@ dependencies = [
name = "jwt_signer"
version = "0.0.1"
dependencies = [
"errors",
"hmac 0.10.1",
"jwt",
"sha2 0.9.9",
@@ -6140,13 +6133,13 @@ dependencies = [
name = "kubectl-pod-cleanup"
version = "0.0.1"
dependencies = [
"config",
"easyenv",
"errors",
"log",
"once_cell",
"rand 0.8.5",
"regex",
"shared_env_var_config",
"workspace-build-acceleration",
]
@@ -6850,7 +6843,6 @@ dependencies = [
"bucket_paths",
"clap 4.5.60",
"cloud_storage",
"config",
"easyenv",
"enums",
"errors",
@@ -6861,6 +6853,7 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
"shared_env_var_config",
"sqlx",
"storyteller_root",
"strum",
@@ -8038,6 +8031,7 @@ dependencies = [
"errors",
"log",
"rootly_client",
"sha2 0.11.0-rc.5",
"tokio",
"workspace-build-acceleration",
]
@@ -8650,16 +8644,6 @@ dependencies = [
"syn 2.0.117",
]
[[package]]
name = "prompt_engineering"
version = "0.1.0"
dependencies = [
"once_cell",
"regex",
"speculoos",
"workspace-build-acceleration",
]
[[package]]
name = "prost"
version = "0.12.6"
@@ -9619,6 +9603,10 @@ dependencies = [
"workspace-build-acceleration",
]
[[package]]
name = "rootly_config"
version = "0.0.1"
[[package]]
name = "rsa"
version = "0.9.6"
@@ -10186,7 +10174,6 @@ dependencies = [
"bucket_paths",
"cloud_storage",
"concurrency",
"config",
"easyenv",
"enums",
"errors",
@@ -10194,12 +10181,16 @@ dependencies = [
"jobs_common",
"log",
"mysql_queries",
"pager",
"reqwest 0.12.23",
"rootly_client",
"rootly_config",
"seedance2pro_client",
"serde",
"serde_derive",
"serde_json",
"server_environment",
"shared_env_var_config",
"sqlx",
"tokens",
"tokio",
@@ -10700,6 +10691,13 @@ dependencies = [
"keccak",
]
[[package]]
name = "shared_env_var_config"
version = "0.0.1"
dependencies = [
"easyenv",
]
[[package]]
name = "shlex"
version = "1.3.0"
@@ -11235,7 +11233,6 @@ dependencies = [
"elasticsearch",
"elasticsearch_schema",
"enums",
"enums_public",
"errors",
"fal_client",
"ffmpeg_utils",
@@ -11266,7 +11263,6 @@ dependencies = [
"pager",
"password",
"primitives",
"prompt_engineering",
"r2d2",
"rand 0.9.2",
"redis 1.0.2",
@@ -11277,6 +11273,7 @@ dependencies = [
"resend-rs",
"reusable_types",
"rootly_client",
"rootly_config",
"rust-s3",
"rustls 0.23.36",
"seedance2pro_client",
@@ -11284,6 +11281,7 @@ dependencies = [
"serde_derive",
"serde_json",
"server_environment",
"shared_env_var_config",
"speculoos",
"sqlx",
"strum",
@@ -11828,6 +11826,7 @@ dependencies = [
"gtk",
"heck 0.5.0",
"http 1.3.1",
"http-range",
"jni 0.21.1",
"libc",
"log",
@@ -12863,6 +12862,7 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
"shared_env_var_config",
"sqlx",
"subprocess",
"tempdir",
@@ -12896,6 +12896,7 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
"shared_env_var_config",
"sqlx",
"tempdir",
"tokio",
@@ -13352,17 +13353,20 @@ dependencies = [
"bucket_paths",
"cloud_storage",
"concurrency",
"config",
"easyenv",
"errors",
"ffmpeg_utils",
"jobs_common",
"log",
"mysql_queries",
"pager",
"rootly_client",
"rootly_config",
"serde",
"serde_derive",
"serde_json",
"server_environment",
"shared_env_var_config",
"sqlx",
"tempdir",
"tokio",
@@ -13430,6 +13434,7 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
"shared_env_var_config",
"sqlx",
"subprocess",
"tempdir",
@@ -13460,6 +13465,7 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
"shared_env_var_config",
"sqlx",
"subprocess",
"tempdir",
@@ -14731,7 +14737,6 @@ dependencies = [
"bucket_paths",
"cloud_storage",
"concurrency",
"config",
"easyenv",
"enums",
"errors",
@@ -14744,6 +14749,7 @@ dependencies = [
"serde_derive",
"serde_json",
"server_environment",
"shared_env_var_config",
"sqlx",
"tokens",
"tokio",
+7 -4
View File
@@ -94,13 +94,16 @@ members = [
"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",
@@ -113,7 +116,6 @@ members = [
# Schema (public): common strongly-typed tokens, ids, payloads, etc.
"crates/schema/public/composite_identifiers",
"crates/schema/public/enums",
"crates/schema/public/enums_public",
"crates/schema/public/reusable_types", # TODO(bt, 2022-12-21): Deprecate
"crates/schema/public/tokens",
@@ -234,7 +236,6 @@ cookie_store = { path = "crates/lib/cookie_store" }
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" }
@@ -242,6 +243,8 @@ 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" }
images = { path = "crates/lib/files/images" }
jobs_common = { path = "crates/lib/jobs_common" }
@@ -321,7 +324,7 @@ 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"
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
DROP TABLE IF EXISTS characters;
@@ -0,0 +1,101 @@
-- 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 (private, not even used in queries)
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Public-facing "primary key" (PUBLIC)
token VARCHAR(32) NOT NULL,
-- The type or "features" of the character.
character_type VARCHAR(24) 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.
character_name VARCHAR(255) DEFAULT 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,
-- TEMPORARY FOR GOING FAST :
-- WE'LL NEED TO BREAK THIS INTO ANOTHER TABLE IF WE WANT TO SUPPORT MULTIPLE IMAGES.
-- Image the character was originally created with.
maybe_original_upload_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,
-- ========== KINOVI (TEMPORARY) ==========
-- TEMPORARY FOR GOING FAST :
-- IDEALLY WE MOVE THIS TO A SEPARATE TABLE.
-- The identifier in the third-party system.
-- e.g. Kinovi's "char_1774752056469_2wlxoq"
kinovi_character_id VARCHAR(64) DEFAULT NULL,
-- TEMPORARY FOR GOING FAST :
-- IDEALLY WE MOVE THIS TO A SEPARATE TABLE.
-- The name used by the third party.
-- Important for Kinovi since characters are referenced by name in prompts.
kinovi_character_name VARCHAR(255) DEFAULT NULL,
-- TEMPORARY FOR GOING FAST :
-- IDEALLY WE MOVE THIS TO A SEPARATE TABLE.
-- This might be the upstream third party of kinovi.
-- e.g. Kinovi's assetId "asset-20260329104101-kk5kl"
maybe_kinovi_asset_id VARCHAR(64) DEFAULT NULL,
-- TEMPORARY FOR GOING FAST :
-- IDEALLY WE MOVE THIS TO A SEPARATE TABLE.
-- Our job system token (if the character was created via a job).
maybe_generic_inference_job_token VARCHAR(32) DEFAULT NULL,
-- Maybe this doesn't exist
-- -- TEMPORARY FOR GOING FAST :
-- -- IDEALLY WE MOVE THIS TO A SEPARATE TABLE.
-- -- Third party's job system token (if any).
-- maybe_kinovi_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_type (character_type),
KEY index_maybe_creator_user_token (maybe_creator_user_token),
KEY index_maybe_creator_user_token_active (maybe_creator_user_token, is_active),
KEY index_is_active (is_active),
KEY index_kinovi_character_id (kinovi_character_id),
KEY index_maybe_generic_inference_job_token (maybe_generic_inference_job_token),
KEY index_created_at (created_at),
KEY index_deleted_at (deleted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,6 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE users
DROP COLUMN maybe_landing_url;
@@ -0,0 +1,6 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE users
ADD COLUMN maybe_landing_url VARCHAR(255) 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,104 @@
-- 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,
-- The type or "features" of the character.
character_type VARCHAR(24) 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.
character_name VARCHAR(255) DEFAULT 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,
-- TEMPORARY FOR GOING FAST :
-- WE'LL NEED TO BREAK THIS INTO ANOTHER TABLE IF WE WANT TO SUPPORT MULTIPLE IMAGES.
-- Image the character was originally created with.
maybe_original_upload_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,
-- ========== KINOVI (TEMPORARY) ==========
-- TEMPORARY FOR GOING FAST :
-- IDEALLY WE MOVE THIS TO A SEPARATE TABLE.
-- The identifier in the third-party system.
-- e.g. Kinovi's "char_1774752056469_2wlxoq"
kinovi_character_id VARCHAR(64) DEFAULT NULL,
-- TEMPORARY FOR GOING FAST :
-- IDEALLY WE MOVE THIS TO A SEPARATE TABLE.
-- The name used by the third party.
-- Important for Kinovi since characters are referenced by name in prompts.
kinovi_character_name VARCHAR(255) DEFAULT NULL,
-- TEMPORARY FOR GOING FAST :
-- IDEALLY WE MOVE THIS TO A SEPARATE TABLE.
-- This might be the upstream third party of kinovi.
-- e.g. Kinovi's assetId "asset-20260329104101-kk5kl"
maybe_kinovi_asset_id VARCHAR(64) DEFAULT NULL,
-- TEMPORARY FOR GOING FAST :
-- IDEALLY WE MOVE THIS TO A SEPARATE TABLE.
-- Our job system token (if the character was created via a job).
maybe_generic_inference_job_token VARCHAR(32) DEFAULT NULL,
-- Maybe this doesn't exist
-- -- TEMPORARY FOR GOING FAST :
-- -- IDEALLY WE MOVE THIS TO A SEPARATE TABLE.
-- -- Third party's job system token (if any).
-- maybe_kinovi_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_type (character_type),
KEY index_maybe_creator_user_token (maybe_creator_user_token),
KEY index_maybe_creator_user_token_active (maybe_creator_user_token, is_active),
KEY index_is_active (is_active),
KEY index_kinovi_character_id (kinovi_character_id),
KEY index_maybe_generic_inference_job_token (maybe_generic_inference_job_token),
KEY index_created_at (created_at),
KEY index_deleted_at (deleted_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.
@@ -222,8 +222,13 @@ CREATE TABLE users (
was_eagerly_provisioned BOOLEAN NOT NULL DEFAULT false,
-- The referral URL the user arrived from when signing up.
-- This helps us know what marketing is effective.
maybe_referral_url VARCHAR(255) DEFAULT NULL,
-- The actual URL the user first arrived at when signing up, including query params.
-- This helps us know what marketing is effective.
maybe_landing_url VARCHAR(255) DEFAULT NULL,
-- ========== MODERATION DETAILS ==========
-- Different than deleted.
@@ -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,3 @@
$kind: collection
name: characters
order: 4767
@@ -0,0 +1,16 @@
$kind: http-request
name: Create Character
url: "{{api_host}}/v1/character/create"
method: POST
body:
type: json
content: >-
{
"uuid_idempotency_token": "{{$randomUUID}}",
"model": "seedance_2p0",
//"image_media_token": "m_v2hjh936k72knmggmqqa2xfs9sge8k", // steampunk clown
//"image_media_token": "m_13m13fm33bw3cxvfrncyc6873z0dyy", // mochi on couch
"image_media_token": "m_cp20gcxsattt6j7699brs4ndqf803z", // t-rex
"character_name": "T-rex"
}
order: 1775175681198
@@ -0,0 +1,5 @@
$kind: http-request
name: Delete Character
url: "{{api_host}}/v1/character/character_c40dzeq9pa1qtfy19q9f1w"
method: DELETE
order: 76446840865701
@@ -0,0 +1,18 @@
$kind: http-request
name: Edit Character
url: "{{api_host}}/v1/character/edit"
method: POST
body:
type: json
content: |-
{
/// The character to edit.
"token": "character_4aj66rcqsbjmv3jp5ek4fc",
/// Updated name (if changing).
"updated_name": "Mochi",
/// Updated description (if changing).
"updated_description": "New Description"
}
order: 487436956121943
@@ -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,23 @@
$kind: http-request
name: Seedance 2.0 (character ref 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": "@Mochi is riding on the shoulder of @Steampunk Clown while they're walking through a crowded shopping mall in the sci-fi future. Retro 80's aesthetics while simultaneously futuristic and steam punk. @Mochi licks her lips and barks.",
"duration_seconds": 5,
"reference_character_tokens": ["character_beph3xd1z2m4kkbedra24f", "character_4aj66rcqsbjmv3jp5ek4fc"]
}
order: 3802
@@ -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
@@ -0,0 +1,22 @@
$kind: http-request
name: Upload Scene Snapshot
url: "{{api_host}}/v1/image_studio/scene_snapshot"
method: POST
headers:
- key: Accept
value: application/json
- key: Session
value: ""
disabled: true
body:
type: formdata
content:
- type: text
key: uuid_idempotency_token
value: "{{$randomUUID}}"
disabled: false
- type: file
key: snapshot
src: []
disabled: false
order: 1000
@@ -0,0 +1,2 @@
$kind: collection
order: 5000
@@ -0,0 +1,2 @@
$kind: collection
order: 1000
@@ -0,0 +1,25 @@
$kind: http-request
name: Enqueue Studio Gen2 (Dev)
url: "{{api_host}}/v1/studio_gen2/enqueue"
method: POST
headers:
- key: Accept
value: application/json
- key: Cookie
value: ""
disabled: true
body:
type: json
content: |-
{
"uuid_idempotency_token": "{{$randomUUID}}",
"image_file": "m_btkn9vng12j2bw9tm7dcbg8vp5bd3a",
"video_file": "m_12h6ymaj4szk7ffhdj01n7c8x0d7ds",
"debug_sleep_millis": 600000,
"debug_kill_old_jobs": true,
"skip_image_resize": true,
"tensor_image_width": 512,
"tensor_image_height": 768
}
order: 2000
@@ -0,0 +1,22 @@
$kind: http-request
name: Enqueue Studio Gen2 (Prod)
url: "{{api_host}}/v1/studio_gen2/enqueue"
method: POST
headers:
- key: Accept
value: application/json
- key: Cookie
value: ""
disabled: true
body:
type: json
content: |-
{
"uuid_idempotency_token": "{{$randomUUID}}",
"image_file": "m_5kdgmdrfm6psvyq4df7h50jwhc6be4",
"video_file": "m_hehnjnzkcf98gcmdx5g6ws85w7c2m3",
"output_width": 1024,
"output_height": 576,
"debug_sleep_millis": 600000
}
order: 3000
@@ -0,0 +1,24 @@
$kind: http-request
name: Enqueue Studio Gen2
url: "{{api_host}}/v1/studio_gen2/enqueue"
method: POST
headers:
- key: Accept
value: application/json
- key: Cookie
value: ""
disabled: true
body:
type: json
content: |-
{
"uuid_idempotency_token": "{{$randomUUID}}",
"image_file": "m_9b4bk5bqah5k1ek2p9tmr1726c85yb",
"video_file": "m_mzensqsx1fx82n7wqz3xknfw3qahfp",
"output_width": 512,
"output_height": 768,
"debug_sleep_millis": 60000,
"debug_kill_old_jobs": true,
"fps": 8
}
order: 1000
@@ -0,0 +1,6 @@
$kind: http-request
url: http://localhost:12345/v1/jobs/job/jinf_avdrxxv3dv04dfxh3jej57vbby2
method: DELETE
headers:
Accept: application/json
order: 6000
@@ -0,0 +1,6 @@
$kind: http-request
url: "{{api_host}}/v1/jobs/job/jinf_fr522a4fv7jwz59pta1cjh630cm"
method: DELETE
headers:
Accept: application/json
order: 5000
@@ -0,0 +1,6 @@
$kind: http-request
url: "{{api_host}}/v1/jobs/job/jinf_avdrxxv3dv04dfxh3jej57vbby2"
method: GET
headers:
Accept: application/json
order: 4000

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