Compare commits

..
Author SHA1 Message Date
Brandon Thomas 867eceae52 refresh access token 2025-12-19 03:20:16 -05:00
Brandon Thomas 5688d8cef7 worldlabs tauri (#933)
not finished: need refresh tokens and thumbnails
2025-12-18 22:50:36 -05:00
BFlat 6815040cb1 3d world page and separate store (#932) 2025-12-18 00:29:25 +07:00
Brandon Thomas 754a4da019 worldlabs client library (#931) 2025-12-17 00:21:56 -05:00
bflatastic 3a600fcb9f remove background ui styling center update 2025-12-16 23:15:27 +07:00
Tanish Manku 510589b758 Splat persistence and preview support (#930)
Branch name is misleading as it was originally meant to upload splats to
the endpoint. It results in HTTP400 as of now.
2025-12-15 23:46:48 -08:00
BFlat 7ee5a6aa9a Feature/remove bg mini app (#929)
- remove background mini app
- button in lightbox to remove background leads to mini app as well
2025-12-16 05:45:35 +07:00
Tanish Manku f5cd65be9c Temporarily give splats meshes a name (#928) 2025-12-10 22:29:01 -08:00
Tanish Manku fba1a65e95 Fix bone controls not appearing since 3JS update (#927) 2025-12-10 22:14:26 -08:00
218 changed files with 9904 additions and 259 deletions
Generated
+47
View File
@@ -698,6 +698,7 @@ dependencies = [
"url_utils",
"web_base64",
"workspace-build-acceleration",
"world_labs_client",
]
[[package]]
@@ -5151,6 +5152,14 @@ dependencies = [
"tokio-util",
]
[[package]]
name = "http_headers"
version = "0.0.1"
dependencies = [
"errors",
"workspace-build-acceleration",
]
[[package]]
name = "http_server_common"
version = "0.0.1"
@@ -14165,6 +14174,44 @@ dependencies = [
"zstd-sys",
]
[[package]]
name = "world_labs_client"
version = "0.0.1"
dependencies = [
"anyhow",
"base64 0.22.1",
"bstr",
"byteorder",
"chrono",
"cloudflare_errors",
"cloudflare_mitigation",
"cookie_store 0.0.1",
"env",
"env_logger",
"errors",
"filesys",
"futures 0.3.31",
"http_headers",
"indexmap 2.9.0",
"jwt_light",
"log",
"log4rs",
"once_cell",
"regex",
"scraper 0.24.0",
"serde",
"serde_json",
"sha2 0.11.0-rc.2",
"test_data",
"testing",
"tokio",
"url",
"uuid 1.18.1",
"workspace-build-acceleration",
"wreq",
"wreq-util",
]
[[package]]
name = "wreq"
version = "6.0.0-rc.20"
+4
View File
@@ -18,6 +18,7 @@ members = [
"crates/api_clients/openart_client",
"crates/api_clients/runwayml_client",
"crates/api_clients/thumbnail_generator",
"crates/api_clients/world_labs_client",
# CLI tools for operations, etc.
"crates/cli/devenv/dev-database-seed",
@@ -67,6 +68,7 @@ members = [
"crates/lib/files/media",
"crates/lib/files/mimetypes",
"crates/lib/files/videos",
"crates/lib/http_headers",
"crates/lib/idempotency",
"crates/lib/image_algorithms",
"crates/lib/jobs_common",
@@ -199,6 +201,7 @@ fal_client = { path = "crates/api_clients/fal_client" }
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" }
http_headers = { path = "crates/lib/http_headers" }
idempotency = { path = "crates/lib/idempotency" }
images = { path = "crates/lib/files/images" }
jwt_light = { path = "crates/lib/jwt_light" }
@@ -217,6 +220,7 @@ testing = { path = "crates/lib/testing" }
tokens = { path = "crates/schema/public/tokens" }
url_utils = { path = "crates/lib/url_utils" }
web_base64 = { path = "crates/lib/data/web_base64" }
world_labs_client = { path = "crates/api_clients/world_labs_client" }
# External libs
# Centrally pinned versions so that we can uniformly upgrade/downgrade versions across the workspace
@@ -0,0 +1,143 @@
use crate::credentials::storyteller_credential_set::StorytellerCredentialSet;
use crate::error::api_error::ApiError;
use crate::error::client_error::ClientError;
use crate::error::storyteller_error::StorytellerError;
use crate::utils::api_host::ApiHost;
use crate::utils::constants::{APPLICATION_JSON, USER_AGENT};
use crate::utils::filter_bad_response::filter_bad_response;
use crate::utils::http_get_anonymous::http_get_anonymous;
use chrono::{DateTime, Utc};
use enums::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums::by_table::media_files::media_file_class::MediaFileClass;
use enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums::by_table::media_files::media_file_type::MediaFileType;
use enums::by_table::model_weights::weights_category::WeightsCategory;
use enums::common::generation_provider::GenerationProvider;
use enums::common::visibility::Visibility;
use enums::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_public::by_table::model_weights::public_weights_types::PublicWeightsType;
use idempotency::uuid::generate_random_uuid;
use log::debug;
use reqwest::multipart::Form;
use reqwest::Client;
use serde_derive::{Deserialize, Serialize};
use std::fs::File;
use std::io::Read;
use std::path::Path;
use tokens::tokens::batch_generations::BatchGenerationToken;
use tokens::tokens::media_files::MediaFileToken;
use tokens::tokens::model_weights::ModelWeightToken;
use tokens::tokens::prompts::PromptToken;
use uuid::uuid;
pub struct LegacyUploadMediaFileFromFileArgs<'a, P: AsRef<Path>> {
pub api_host: &'a ApiHost,
pub maybe_creds: Option<&'a StorytellerCredentialSet>,
// NB: Path needs to be owned for the request.
pub path: P,
// /// If true, we should hide the image from the user's gallery.
// pub is_intermediate_system_file: bool,
// /// If provided, this is the prompt that this image is associated with.
// /// NOTE: Cannot set `is_intermediate_system_file = true` if this is set.
// pub maybe_prompt_token: Option<&'a PromptToken>,
// /// If provided, this is the service provider that created the image.
// /// NOTE: Cannot set `is_intermediate_system_file = true` if this is set.
// pub maybe_generation_provider: Option<GenerationProvider>,
// /// If provided, this groups the file into a batch
// /// TODO: This shouldn't be set clientside without the backend generating the token
// /// and cryptographically securing it. But we need to go fast here.
// pub maybe_batch_token: Option<&'a BatchGenerationToken>,
}
/// Upload using the legacy endpoint (spz, etc.)
pub async fn legacy_upload_media_file_from_file<P: AsRef<Path>>(
args: LegacyUploadMediaFileFromFileArgs<'_, P>,
) -> Result<UploadImageMediaFileSuccessResponse, StorytellerError> {
validate_args(&args)?;
let url = get_route(args.api_host);
debug!("Requesting {:?}", &url);
//let mut file = File::open(path)?;
let client = Client::builder()
.gzip(true)
.build()
.map_err(|err| StorytellerError::Client(ClientError::from(err)))?;
let mut form = Form::new()
.text("uuid_idempotency_token", generate_random_uuid())
.file("file", args.path)
.await
.map_err(|err| StorytellerError::Client(ClientError::from(err)))?;
//if args.is_intermediate_system_file {
// form = form.text("is_intermediate_system_file", "true");
//}
//if let Some(prompt_token) = &args.maybe_prompt_token {
// form = form.text("maybe_prompt_token", prompt_token.to_string());
//}
//if let Some(batch_token) = &args.maybe_batch_token {
// form = form.text("maybe_batch_token", batch_token.to_string());
//}
let mut request_builder = client.post(url)
.header("User-Agent", USER_AGENT)
.header("Accept", APPLICATION_JSON);
if let Some(creds) = args.maybe_creds {
if let Some(header) = &creds.maybe_as_cookie_header() {
request_builder = request_builder.header("Cookie", header);
}
}
let response = request_builder
.multipart(form)
.send()
.await
.map_err(|err| StorytellerError::Api(ApiError::from(err)))?;
let response = filter_bad_response(response).await?;
let response_body = &response.text().await
.map_err(|err| StorytellerError::Api(ApiError::from(err)))?;
let media_file = serde_json::from_str(&response_body)
.map_err(|err| StorytellerError::Api(ApiError::from(err)))?;
Ok(media_file)
}
fn get_route(api_host: &ApiHost) -> String {
let api_hostname_and_scheme = api_host.to_api_hostname_and_scheme();
format!("{}/v1/media_files/upload", api_hostname_and_scheme)
}
// TODO(bt,2025-04-22): Share API definitions between client and server in common crate.
#[derive(Deserialize, Debug)]
pub struct UploadImageMediaFileSuccessResponse {
pub success: bool,
pub media_file_token: MediaFileToken,
}
fn validate_args<P: AsRef<Path>>(
args: &LegacyUploadMediaFileFromFileArgs<'_, P>,
) -> Result<(), StorytellerError> {
// if args.is_intermediate_system_file && args.maybe_prompt_token.is_some() {
// return Err(StorytellerError::Client(ClientError::InvalidPreflightRequest(
// "Cannot set `is_intermediate_system_file` to true if `maybe_prompt_token` is provided."
// .to_string())));
// }
Ok(())
}
@@ -5,3 +5,4 @@ pub mod upload_image_media_file_from_bytes;
pub mod upload_image_media_file_from_file;
pub mod upload_new_engine_asset_from_file;
pub mod upload_video_media_file_from_file;
pub mod legacy_upload_media_file_from_file;
@@ -0,0 +1,55 @@
[package]
name = "world_labs_client"
edition = "2024"
version = "0.0.1"
publish = false
[package.metadata.cargo-udeps.ignore]
normal = ["workspace-build-acceleration"]
[lib]
name = "world_labs_client"
path = "src/lib.rs"
[dependencies]
# Workspace hack (faster compile times)
workspace-build-acceleration.workspace = true
# Internal
cloudflare_errors.workspace = true
cloudflare_mitigation.workspace = true
cookie_store.workspace = true
errors.workspace = true
filesys.workspace = true
http_headers.workspace = true
jwt_light.workspace = true
# External
anyhow.workspace = true
base64.workspace = true
bstr.workspace = true
byteorder = "1.5.0"
chrono.workspace = true
futures.workspace = true
indexmap.workspace = true
log.workspace = true
once_cell.workspace = true
regex.workspace = true
scraper = "0.24.0"
serde.workspace = true
serde_json.workspace = true
sha2.workspace = true
tokio = { version = "1", features = ["full"] }
url.workspace = true
uuid.workspace = true
wreq-util.workspace = true
wreq.workspace = true
[dev-dependencies]
filesys.workspace = true
test_data.workspace = true
testing.workspace = true
log4rs = "1.4.0"
env_logger.workspace = true
env.workspace = true
chrono.workspace = true
@@ -0,0 +1,26 @@
use uuid::Uuid;
/// Type for Image Input Object Ids
/// These are used to refer to worlds
/// These appear to be bare UUIDs.
#[derive(Clone, Debug)]
pub struct ImageInputObjectId(pub String);
impl ImageInputObjectId {
pub fn generate_new() -> Self {
let uuid = Uuid::new_v4().to_string();
Self(uuid)
}
pub fn from_str(s: &str) -> Self {
Self(s.to_string())
}
pub fn as_str(&self) -> &str {
&self.0
}
pub fn to_string(&self) -> String {
self.0.clone()
}
}
@@ -0,0 +1,26 @@
use uuid::Uuid;
/// Type for "meta" World IDs (not sure what to term this).
/// These are in the first run patch request
/// These appear to be bare UUIDs.
#[derive(Clone, Debug)]
pub struct MetaWorldObjectId(pub String);
impl MetaWorldObjectId {
pub fn generate_new() -> Self {
let uuid = Uuid::new_v4().to_string();
Self(uuid)
}
pub fn from_str(s: &str) -> Self {
Self(s.to_string())
}
pub fn as_str(&self) -> &str {
&self.0
}
pub fn to_string(&self) -> String {
self.0.clone()
}
}
@@ -0,0 +1,8 @@
pub mod image_input_object_id;
pub mod meta_world_object_id;
pub mod pano_object_id;
pub mod run_object;
pub mod run_object_id;
pub mod upload_mime_type;
pub mod upload_object_id;
pub mod world_id;
@@ -0,0 +1,26 @@
use uuid::Uuid;
/// Type for Pano Object Ids
/// These are used to refer to worlds
/// These appear to be bare UUIDs.
#[derive(Clone, Debug)]
pub struct PanoObjectId(pub String);
impl PanoObjectId {
pub fn generate_new() -> Self {
let uuid = Uuid::new_v4().to_string();
Self(uuid)
}
pub fn from_str(s: &str) -> Self {
Self(s.to_string())
}
pub fn as_str(&self) -> &str {
&self.0
}
pub fn to_string(&self) -> String {
self.0.clone()
}
}
@@ -0,0 +1,79 @@
use std::collections::HashMap;
use chrono::Utc;
use serde::{Deserialize, Serialize};
use serde_json::Value;
const RUN_MIME_TYPE: &str = "application/run+json";
const RUN_VERSION : &str = "0.0.1";
/// World Labs' API is very frontend driven
/// They send whole objects back to the frontend that the frontend is in charge of mutatingbjects or PATCH them back to the server (yuck):
/// - request #1 - create run
/// - request #6 - patch run after image upload
/// Gotta go fast?
#[derive(Serialize, Deserialize, Clone)]
pub struct RunObject {
/// The primary ID of the run.
/// This won't exist until we post it to the server.
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub metadata: RunObjectMetadata,
pub mime_type: String,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct RunObjectMetadata {
pub version: String,
#[serde(rename = "createdAt")]
pub created_at: u64,
#[serde(rename = "updatedAt")]
pub updated_at: u64,
#[serde(rename = "usesAdvancedEditing")]
pub uses_advanced_editing: bool,
#[serde(rename = "draftMode")]
pub draft_mode: bool,
/// Polymorphic set of ID-to-object mappings.
pub nodes: HashMap<String, Value>,
}
impl Default for RunObject {
fn default() -> Self {
let now = Utc::now();
let now = now.timestamp().unsigned_abs() * 1000; // Millisecond resolution
Self {
id: None,
metadata: RunObjectMetadata{
version: RUN_VERSION.to_string(),
created_at: now,
updated_at: now,
uses_advanced_editing: false,
draft_mode: false,
nodes: HashMap::new(),
},
mime_type: RUN_MIME_TYPE.to_string(),
}
}
}
#[cfg(test)]
mod tests {
use crate::api::api_types::run_object::RunObject;
#[test]
fn default_runobject() {
let object = RunObject::default();
assert!(object.id.is_none());
assert_eq!(&object.metadata.version, "0.0.1");
assert!(object.metadata.created_at > 1705433415549);
assert!(object.metadata.updated_at > 1705433415549);
assert_eq!(&object.mime_type, "application/run+json");
}
}
@@ -0,0 +1,15 @@
/// Type for Object IDs.
/// These are used to create inference runs and refer to the result
/// These appear to be bare UUIDs.
#[derive(Clone, Debug)]
pub struct RunObjectId(pub String);
impl RunObjectId {
pub fn from_str(s: &str) -> Self {
Self(s.to_string())
}
pub fn to_string(&self) -> String {
self.0.clone()
}
}
@@ -0,0 +1,21 @@
use serde::Serialize;
#[derive(Clone, Copy, Debug, Serialize)]
pub enum UploadMimeType {
#[serde(rename = "image/jpeg")]
ImageJpeg,
}
impl UploadMimeType {
pub fn content_type(&self) -> &'static str {
match self {
Self::ImageJpeg => "image/jpeg",
}
}
pub fn extension_without_period(&self) -> &'static str {
match self {
Self::ImageJpeg => "jpeg",
}
}
}
@@ -0,0 +1,15 @@
/// Type for Upload IDs.
/// These are used to upload images.
/// These appear to be bare UUIDs.
#[derive(Clone, Debug)]
pub struct UploadObjectId(pub String);
impl UploadObjectId {
pub fn as_str(&self) -> &str {
&self.0
}
pub fn to_string(&self) -> String {
self.0.clone()
}
}
@@ -0,0 +1,26 @@
use uuid::Uuid;
/// Type for World IDs.
/// These are used to refer to worlds
/// These appear to be bare UUIDs.
#[derive(Clone, Debug)]
pub struct WorldObjectId(pub String);
impl WorldObjectId {
pub fn new() -> Self {
let uuid = Uuid::new_v4().to_string();
Self(uuid)
}
pub fn from_str(s: &str) -> Self {
Self(s.to_string())
}
pub fn as_str(&self) -> &str {
&self.0
}
pub fn to_string(&self) -> String {
self.0.clone()
}
}
@@ -0,0 +1,6 @@
/// Referer header value
pub(crate) const REFERER_VALUE: &str = "https://marble.worldlabs.ai/";
/// Origin header value
pub(crate) const ORIGIN_VALUE: &str = "https://marble.worldlabs.ai/";
@@ -0,0 +1 @@
pub (crate) mod common_header_values;
@@ -0,0 +1,5 @@
pub mod api_types;
pub mod requests;
pub (crate) mod common;
pub mod utils;
@@ -0,0 +1,10 @@
Free accounts start with 7,000 credits
This supports "up to 4 world generations" according to the pricing page.
After one gen, credits are at 5,420. (Used 1580 credits.)
request_flow_4 - chromium on linux, private browsing
@@ -0,0 +1,20 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyMDg0MiwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzIwODQyLCJleHAiOjE3NjUzMjQ0NDIsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.SHy8_FpsekZ3LvRdwfDMqW1BDdBHVfJO78x0xtJuIhsKKrUCD88eb256MsAKFb_ak6mujk7GjzajUtkcV-JiZhxElzQ_lu1kQiOoSWcnmuXe8Pm1trx-NN1DUGLbVj2CopdmsRmX2Fs_hFgXd4KhGmcaiqKxEVKZGoq2vB4Bs2kvIjA7u3bqAdS75BsJ5kaxvvIrqY7WjmpVb2LWr6uZIaSZa2BFZi_CAs8rGFV7cO9zg3xGD8MKwG6DmJbopYrtHHECxHbYCe1f-HS5eXCN_tJFIq7CHV9RSyv3KkT5Da9yOIeDP8YBATxTLNWqdkq3h-mXmkFvgL7-n49-aqcIgA' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-4c2ae3c,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=f6a6fcf2cd474d488082c00a8f915ab6,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.8715408597022593,sentry-sample_rate=1' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'origin: https://marble.worldlabs.ai' \
-H 'pragma: no-cache' \
-H 'priority: u=1, i' \
-H 'referer: https://marble.worldlabs.ai/' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Chromium";v="142"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Linux"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'sentry-trace: f6a6fcf2cd474d488082c00a8f915ab6-811b3fc3ecdaaff5-1' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36' \
--data-raw '{"metadata":{"version":"0.0.1","createdAt":1765323283075,"updatedAt":1765323283075,"useAdvancedEditing":false,"draftMode":false,"nodes":{}},"mime_type":"application/run+json"}'
@@ -0,0 +1,19 @@
{
"context": null,
"id": "10ad82a1-5f61-447f-b162-e3da0ef3e5b5",
"display_name": null,
"owner_id": "sVgAQDyH3BfYOBfF6epWTjLHygX2",
"status": "CREATED",
"created_at": 1765323283,
"updated_at": 1765323283,
"object_uri": null,
"mime_type": "application/run+json",
"metadata": {
"version": "0.0.1",
"createdAt": 1765323283075,
"updatedAt": 1765323283075,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {}
}
}
@@ -0,0 +1,20 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyMDg0MiwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzIwODQyLCJleHAiOjE3NjUzMjQ0NDIsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.SHy8_FpsekZ3LvRdwfDMqW1BDdBHVfJO78x0xtJuIhsKKrUCD88eb256MsAKFb_ak6mujk7GjzajUtkcV-JiZhxElzQ_lu1kQiOoSWcnmuXe8Pm1trx-NN1DUGLbVj2CopdmsRmX2Fs_hFgXd4KhGmcaiqKxEVKZGoq2vB4Bs2kvIjA7u3bqAdS75BsJ5kaxvvIrqY7WjmpVb2LWr6uZIaSZa2BFZi_CAs8rGFV7cO9zg3xGD8MKwG6DmJbopYrtHHECxHbYCe1f-HS5eXCN_tJFIq7CHV9RSyv3KkT5Da9yOIeDP8YBATxTLNWqdkq3h-mXmkFvgL7-n49-aqcIgA' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-4c2ae3c,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=f6a6fcf2cd474d488082c00a8f915ab6,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.8715408597022593,sentry-sample_rate=1' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'origin: https://marble.worldlabs.ai' \
-H 'pragma: no-cache' \
-H 'priority: u=1, i' \
-H 'referer: https://marble.worldlabs.ai/' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Chromium";v="142"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Linux"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'sentry-trace: f6a6fcf2cd474d488082c00a8f915ab6-b9e78b9b380dd719-1' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36' \
--data-raw '{"display_name":"uploaded_image_1ed9f547-5527-48d3-b5df-aab476532317.jpeg","mime_type":"image/jpeg"}'
@@ -0,0 +1,12 @@
{
"context": null,
"id": "25ddd6ab-931c-480b-a817-cfbb562da980",
"display_name": "uploaded_image_1ed9f547-5527-48d3-b5df-aab476532317.jpeg",
"owner_id": "sVgAQDyH3BfYOBfF6epWTjLHygX2",
"status": "CREATED",
"created_at": 1765323283,
"updated_at": 1765323283,
"object_uri": null,
"mime_type": "image/jpeg",
"metadata": null
}
@@ -0,0 +1,20 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/recaption2' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyMDg0MiwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzIwODQyLCJleHAiOjE3NjUzMjQ0NDIsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.SHy8_FpsekZ3LvRdwfDMqW1BDdBHVfJO78x0xtJuIhsKKrUCD88eb256MsAKFb_ak6mujk7GjzajUtkcV-JiZhxElzQ_lu1kQiOoSWcnmuXe8Pm1trx-NN1DUGLbVj2CopdmsRmX2Fs_hFgXd4KhGmcaiqKxEVKZGoq2vB4Bs2kvIjA7u3bqAdS75BsJ5kaxvvIrqY7WjmpVb2LWr6uZIaSZa2BFZi_CAs8rGFV7cO9zg3xGD8MKwG6DmJbopYrtHHECxHbYCe1f-HS5eXCN_tJFIq7CHV9RSyv3KkT5Da9yOIeDP8YBATxTLNWqdkq3h-mXmkFvgL7-n49-aqcIgA' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-4c2ae3c,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=f6a6fcf2cd474d488082c00a8f915ab6,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.8715408597022593,sentry-sample_rate=1' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'origin: https://marble.worldlabs.ai' \
-H 'pragma: no-cache' \
-H 'priority: u=1, i' \
-H 'referer: https://marble.worldlabs.ai/' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Chromium";v="142"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Linux"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'sentry-trace: f6a6fcf2cd474d488082c00a8f915ab6-a84e4b29068074a0-1' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36' \
--data-raw '{"world_prompt":{"type":"image","image_prompt":{"uri":"https://cdn.marble.worldlabs.ai/object/25ddd6ab-931c-480b-a817-cfbb562da980/asset.jpg"},"text_prompt":""},"user_caption":"","context":{"run_id":"10ad82a1-5f61-447f-b162-e3da0ef3e5b5"}}'
@@ -0,0 +1,4 @@
{
"caption": "The scene is a somber and gothic graveyard at night, captured in a realistic, almost cinematic style, evoking a mood of quiet contemplation and melancholy. Numerous headstones and crypts of varying sizes and designs emerge from the overgrown grass, their weathered surfaces suggesting a long history. Tall, dark trees with skeletal branches stand against the cloudy night sky, their leaves barely visible, enhancing the scene's desolate atmosphere. A full, luminous moon hangs high in the sky, casting soft, ethereal light over the entire graveyard, illuminating the intricate carvings on some of the older monuments and the subtle textures of the ground. The ground itself is a mix of patchy grass and fallen leaves, indicating a neglected or aged burial ground, with small, indistinct flora growing in scattered clusters. Pathways, possibly made of worn earth or gravel, wind between the graves, though they are largely obscured by the low light and foliage. A low, stone wall or barrier might enclose the graveyard on one side, separating it from an unseen, silent world beyond. The moon remains a singular, dominant light source, creating long, soft shadows that stretch across the uneven terrain of the cemetery. ",
"title": "Moonlit Graveyard Vigil"
}
@@ -0,0 +1,20 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyMDg0MiwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzIwODQyLCJleHAiOjE3NjUzMjQ0NDIsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.SHy8_FpsekZ3LvRdwfDMqW1BDdBHVfJO78x0xtJuIhsKKrUCD88eb256MsAKFb_ak6mujk7GjzajUtkcV-JiZhxElzQ_lu1kQiOoSWcnmuXe8Pm1trx-NN1DUGLbVj2CopdmsRmX2Fs_hFgXd4KhGmcaiqKxEVKZGoq2vB4Bs2kvIjA7u3bqAdS75BsJ5kaxvvIrqY7WjmpVb2LWr6uZIaSZa2BFZi_CAs8rGFV7cO9zg3xGD8MKwG6DmJbopYrtHHECxHbYCe1f-HS5eXCN_tJFIq7CHV9RSyv3KkT5Da9yOIeDP8YBATxTLNWqdkq3h-mXmkFvgL7-n49-aqcIgA' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-4c2ae3c,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=f6a6fcf2cd474d488082c00a8f915ab6,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.8715408597022593,sentry-sample_rate=1' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'origin: https://marble.worldlabs.ai' \
-H 'pragma: no-cache' \
-H 'priority: u=1, i' \
-H 'referer: https://marble.worldlabs.ai/' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Chromium";v="142"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Linux"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'sentry-trace: f6a6fcf2cd474d488082c00a8f915ab6-aae165f4896b6b44-1' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36' \
--data-raw $'{"permission":{"public":true},"generation_input":{"model":"Marble 0.1-plus","prompt":{"type":"image","image_prompt":{"uri":"https://cdn.marble.worldlabs.ai/object/25ddd6ab-931c-480b-a817-cfbb562da980/asset.jpg"},"text_prompt":"The scene is a somber and gothic graveyard at night, captured in a realistic, almost cinematic style, evoking a mood of quiet contemplation and melancholy. Numerous headstones and crypts of varying sizes and designs emerge from the overgrown grass, their weathered surfaces suggesting a long history. Tall, dark trees with skeletal branches stand against the cloudy night sky, their leaves barely visible, enhancing the scene\'s desolate atmosphere. A full, luminous moon hangs high in the sky, casting soft, ethereal light over the entire graveyard, illuminating the intricate carvings on some of the older monuments and the subtle textures of the ground. The ground itself is a mix of patchy grass and fallen leaves, indicating a neglected or aged burial ground, with small, indistinct flora growing in scattered clusters. Pathways, possibly made of worn earth or gravel, wind between the graves, though they are largely obscured by the low light and foliage. A low, stone wall or barrier might enclose the graveyard on one side, separating it from an unseen, silent world beyond. The moon remains a singular, dominant light source, creating long, soft shadows that stretch across the uneven terrain of the cemetery. "}},"context":{"run_id":"10ad82a1-5f61-447f-b162-e3da0ef3e5b5"}}'
@@ -0,0 +1,37 @@
{
"context": {
"run_id": "10ad82a1-5f61-447f-b162-e3da0ef3e5b5",
"project_id": null
},
"id": "323bfcc0-086a-4822-acc5-b38b4ddc624d",
"display_name": null,
"status": "INITIALIZING",
"error": null,
"owner_id": "sVgAQDyH3BfYOBfF6epWTjLHygX2",
"created_at": 1765323290,
"updated_at": 1765323290,
"permission": {
"public": true,
"allowed_readers": [],
"allowed_writers": []
},
"stats": null,
"application_data": null,
"generation_input": {
"model": "Marble 0.1-plus",
"seed": null,
"prompt": {
"type": "image",
"text_prompt": "The scene is a somber and gothic graveyard at night, captured in a realistic, almost cinematic style, evoking a mood of quiet contemplation and melancholy. Numerous headstones and crypts of varying sizes and designs emerge from the overgrown grass, their weathered surfaces suggesting a long history. Tall, dark trees with skeletal branches stand against the cloudy night sky, their leaves barely visible, enhancing the scene's desolate atmosphere. A full, luminous moon hangs high in the sky, casting soft, ethereal light over the entire graveyard, illuminating the intricate carvings on some of the older monuments and the subtle textures of the ground. The ground itself is a mix of patchy grass and fallen leaves, indicating a neglected or aged burial ground, with small, indistinct flora growing in scattered clusters. Pathways, possibly made of worn earth or gravel, wind between the graves, though they are largely obscured by the low light and foliage. A low, stone wall or barrier might enclose the graveyard on one side, separating it from an unseen, silent world beyond. The moon remains a singular, dominant light source, creating long, soft shadows that stretch across the uneven terrain of the cemetery. ",
"image_prompt": {
"uri": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/307390d3_image_prompt_sanitized.png",
"data_base64": null,
"extension": "png"
},
"is_pano": null
}
},
"tags": null,
"hq_mesh_export_op_id": null,
"generation_output": null
}
@@ -0,0 +1,18 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds/323bfcc0-086a-4822-acc5-b38b4ddc624d' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyMDg0MiwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzIwODQyLCJleHAiOjE3NjUzMjQ0NDIsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.SHy8_FpsekZ3LvRdwfDMqW1BDdBHVfJO78x0xtJuIhsKKrUCD88eb256MsAKFb_ak6mujk7GjzajUtkcV-JiZhxElzQ_lu1kQiOoSWcnmuXe8Pm1trx-NN1DUGLbVj2CopdmsRmX2Fs_hFgXd4KhGmcaiqKxEVKZGoq2vB4Bs2kvIjA7u3bqAdS75BsJ5kaxvvIrqY7WjmpVb2LWr6uZIaSZa2BFZi_CAs8rGFV7cO9zg3xGD8MKwG6DmJbopYrtHHECxHbYCe1f-HS5eXCN_tJFIq7CHV9RSyv3KkT5Da9yOIeDP8YBATxTLNWqdkq3h-mXmkFvgL7-n49-aqcIgA' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-4c2ae3c,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=f6a6fcf2cd474d488082c00a8f915ab6,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.8715408597022593,sentry-sample_rate=1' \
-H 'cache-control: no-cache' \
-H 'origin: https://marble.worldlabs.ai' \
-H 'pragma: no-cache' \
-H 'priority: u=1, i' \
-H 'referer: https://marble.worldlabs.ai/' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Chromium";v="142"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Linux"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'sentry-trace: f6a6fcf2cd474d488082c00a8f915ab6-89ca6b5ba7e2d026-1' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36'
@@ -0,0 +1,39 @@
{
"context": null,
"id": "323bfcc0-086a-4822-acc5-b38b4ddc624d",
"display_name": null,
"status": "INITIALIZING",
"error": null,
"owner_id": "sVgAQDyH3BfYOBfF6epWTjLHygX2",
"created_at": 1765323290,
"updated_at": 1765323290,
"permission": {
"public": true,
"allowed_readers": [],
"allowed_writers": []
},
"stats": null,
"application_data": {
"owner_username": "victorv",
"owner_display_name": "Victor Voice",
"reactions": null,
"pinned": false
},
"generation_input": {
"model": "Marble 0.1-plus",
"seed": null,
"prompt": {
"type": "image",
"text_prompt": "The scene is a somber and gothic graveyard at night, captured in a realistic, almost cinematic style, evoking a mood of quiet contemplation and melancholy. Numerous headstones and crypts of varying sizes and designs emerge from the overgrown grass, their weathered surfaces suggesting a long history. Tall, dark trees with skeletal branches stand against the cloudy night sky, their leaves barely visible, enhancing the scene's desolate atmosphere. A full, luminous moon hangs high in the sky, casting soft, ethereal light over the entire graveyard, illuminating the intricate carvings on some of the older monuments and the subtle textures of the ground. The ground itself is a mix of patchy grass and fallen leaves, indicating a neglected or aged burial ground, with small, indistinct flora growing in scattered clusters. Pathways, possibly made of worn earth or gravel, wind between the graves, though they are largely obscured by the low light and foliage. A low, stone wall or barrier might enclose the graveyard on one side, separating it from an unseen, silent world beyond. The moon remains a singular, dominant light source, creating long, soft shadows that stretch across the uneven terrain of the cemetery. ",
"image_prompt": {
"uri": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/307390d3_image_prompt_sanitized.png",
"data_base64": null,
"extension": null
},
"is_pano": false
}
},
"tags": null,
"hq_mesh_export_op_id": null,
"generation_output": null
}
@@ -0,0 +1,18 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds/323bfcc0-086a-4822-acc5-b38b4ddc624d' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyMDg0MiwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzIwODQyLCJleHAiOjE3NjUzMjQ0NDIsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.SHy8_FpsekZ3LvRdwfDMqW1BDdBHVfJO78x0xtJuIhsKKrUCD88eb256MsAKFb_ak6mujk7GjzajUtkcV-JiZhxElzQ_lu1kQiOoSWcnmuXe8Pm1trx-NN1DUGLbVj2CopdmsRmX2Fs_hFgXd4KhGmcaiqKxEVKZGoq2vB4Bs2kvIjA7u3bqAdS75BsJ5kaxvvIrqY7WjmpVb2LWr6uZIaSZa2BFZi_CAs8rGFV7cO9zg3xGD8MKwG6DmJbopYrtHHECxHbYCe1f-HS5eXCN_tJFIq7CHV9RSyv3KkT5Da9yOIeDP8YBATxTLNWqdkq3h-mXmkFvgL7-n49-aqcIgA' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-4c2ae3c,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=f6a6fcf2cd474d488082c00a8f915ab6,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.8715408597022593,sentry-sample_rate=1' \
-H 'cache-control: no-cache' \
-H 'origin: https://marble.worldlabs.ai' \
-H 'pragma: no-cache' \
-H 'priority: u=1, i' \
-H 'referer: https://marble.worldlabs.ai/' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Chromium";v="142"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Linux"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'sentry-trace: f6a6fcf2cd474d488082c00a8f915ab6-85cd442793fc9124-1' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36'
@@ -0,0 +1,59 @@
{
"context": null,
"id": "323bfcc0-086a-4822-acc5-b38b4ddc624d",
"display_name": null,
"status": "SUCCEEDED",
"error": null,
"owner_id": "sVgAQDyH3BfYOBfF6epWTjLHygX2",
"created_at": 1765323290,
"updated_at": 1765323554,
"permission": {
"public": true,
"allowed_readers": [],
"allowed_writers": []
},
"stats": null,
"application_data": {
"owner_username": "victorv",
"owner_display_name": "Victor Voice",
"reactions": null,
"pinned": false
},
"generation_input": {
"model": "Marble 0.1-plus",
"seed": null,
"prompt": {
"type": "image",
"text_prompt": "The scene is a somber and gothic graveyard at night, captured in a realistic, almost cinematic style, evoking a mood of quiet contemplation and melancholy. Numerous headstones and crypts of varying sizes and designs emerge from the overgrown grass, their weathered surfaces suggesting a long history. Tall, dark trees with skeletal branches stand against the cloudy night sky, their leaves barely visible, enhancing the scene's desolate atmosphere. A full, luminous moon hangs high in the sky, casting soft, ethereal light over the entire graveyard, illuminating the intricate carvings on some of the older monuments and the subtle textures of the ground. The ground itself is a mix of patchy grass and fallen leaves, indicating a neglected or aged burial ground, with small, indistinct flora growing in scattered clusters. Pathways, possibly made of worn earth or gravel, wind between the graves, though they are largely obscured by the low light and foliage. A low, stone wall or barrier might enclose the graveyard on one side, separating it from an unseen, silent world beyond. The moon remains a singular, dominant light source, creating long, soft shadows that stretch across the uneven terrain of the cemetery. ",
"image_prompt": {
"uri": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/307390d3_image_prompt_sanitized.png",
"data_base64": null,
"extension": null
},
"is_pano": false
}
},
"tags": null,
"hq_mesh_export_op_id": null,
"generation_output": {
"ply_url": null,
"wlg_url": null,
"cond_image_url": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/307390d3_image_prompt_sanitized.png",
"mpi_url": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/17b7b9f7-1448-4e03-a244-ac51b87bc1a2_dust_mpi",
"minimap_url": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/4e373e4c-b7c2-4122-aa7f-a27cf6377f8d_minimap.png",
"minimap_metadata": "[0.0, 1.486802339553833, 13.666599082946778]",
"spz_urls": {
"500k": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/514bcf69-1f9e-4fa1-ba82-5e3eacd3aa0e_ceramic_500k.spz",
"full_res": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/7a169623-8993-448d-b0c4-a9780287d0ce_ceramic.spz",
"100k": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/044f6002-c5d9-4064-a690-1ff1a6bb40e2_dust_100k.spz"
},
"skypano_url": null,
"posed_cond_image": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/d42c648a-37a0-4b50-aa53-15210783dd23_cond_image",
"collider_mesh_url": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/bab46ac0.glb",
"hq_mesh_url": null,
"full_res_mesh_url": null,
"posed_cubemaps_url": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/84fb4783-e74f-4676-b825-84834a349437_cubemaps",
"posed_panos_url": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/d51d9ddd-bf33-4ce6-a1e0-b35bacde335b_panos",
"panos_metadata": null
}
}
@@ -0,0 +1,21 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/10ad82a1-5f61-447f-b162-e3da0ef3e5b5' \
-X 'PATCH' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyMDg0MiwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzIwODQyLCJleHAiOjE3NjUzMjQ0NDIsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.SHy8_FpsekZ3LvRdwfDMqW1BDdBHVfJO78x0xtJuIhsKKrUCD88eb256MsAKFb_ak6mujk7GjzajUtkcV-JiZhxElzQ_lu1kQiOoSWcnmuXe8Pm1trx-NN1DUGLbVj2CopdmsRmX2Fs_hFgXd4KhGmcaiqKxEVKZGoq2vB4Bs2kvIjA7u3bqAdS75BsJ5kaxvvIrqY7WjmpVb2LWr6uZIaSZa2BFZi_CAs8rGFV7cO9zg3xGD8MKwG6DmJbopYrtHHECxHbYCe1f-HS5eXCN_tJFIq7CHV9RSyv3KkT5Da9yOIeDP8YBATxTLNWqdkq3h-mXmkFvgL7-n49-aqcIgA' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-4c2ae3c,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=f6a6fcf2cd474d488082c00a8f915ab6,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.8715408597022593,sentry-sample_rate=1' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'origin: https://marble.worldlabs.ai' \
-H 'pragma: no-cache' \
-H 'priority: u=1, i' \
-H 'referer: https://marble.worldlabs.ai/' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Chromium";v="142"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Linux"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'sentry-trace: f6a6fcf2cd474d488082c00a8f915ab6-b96d44935a8cf5a1-1' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36' \
--data-raw $'{"object":{"metadata":{"version":"0.0.1","name":"Moonlit Graveyard Vigil","createdAt":1765323283075,"updatedAt":1765323555619,"useAdvancedEditing":false,"draftMode":false,"nodes":{"5046e0da-ce2c-428f-a5d8-3b99143d4ce3":{"id":"5046e0da-ce2c-428f-a5d8-3b99143d4ce3","type":"input","parentId":null,"source":{"type":"image","image_url":"https://cdn.marble.worldlabs.ai/object/25ddd6ab-931c-480b-a817-cfbb562da980/asset.jpg"},"createdAt":1765323289174,"title":"Moonlit Graveyard Vigil","caption":"The scene is a somber and gothic graveyard at night, captured in a realistic, almost cinematic style, evoking a mood of quiet contemplation and melancholy. Numerous headstones and crypts of varying sizes and designs emerge from the overgrown grass, their weathered surfaces suggesting a long history. Tall, dark trees with skeletal branches stand against the cloudy night sky, their leaves barely visible, enhancing the scene\'s desolate atmosphere. A full, luminous moon hangs high in the sky, casting soft, ethereal light over the entire graveyard, illuminating the intricate carvings on some of the older monuments and the subtle textures of the ground. The ground itself is a mix of patchy grass and fallen leaves, indicating a neglected or aged burial ground, with small, indistinct flora growing in scattered clusters. Pathways, possibly made of worn earth or gravel, wind between the graves, though they are largely obscured by the low light and foliage. A low, stone wall or barrier might enclose the graveyard on one side, separating it from an unseen, silent world beyond. The moon remains a singular, dominant light source, creating long, soft shadows that stretch across the uneven terrain of the cemetery. "},"e132bc85-ecf1-4126-b466-f8c281ebaabf":{"id":"e132bc85-ecf1-4126-b466-f8c281ebaabf","type":"pano","parentId":"5046e0da-ce2c-428f-a5d8-3b99143d4ce3","source":{"type":"generate_world","url":"https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/d51d9ddd-bf33-4ce6-a1e0-b35bacde335b_panos/rgb_0.png","world_id":"323bfcc0-086a-4822-acc5-b38b4ddc624d","status":"complete"},"createdAt":1765323290361},"5d90764a-7356-4c0c-b819-8c6fbdfa4300":{"id":"5d90764a-7356-4c0c-b819-8c6fbdfa4300","type":"world","parentId":"e132bc85-ecf1-4126-b466-f8c281ebaabf","source":{"type":"generate_world","world_id":"323bfcc0-086a-4822-acc5-b38b4ddc624d","spz_urls":{"500k":"https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/514bcf69-1f9e-4fa1-ba82-5e3eacd3aa0e_ceramic_500k.spz","full_res":"https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/7a169623-8993-448d-b0c4-a9780287d0ce_ceramic.spz","100k":"https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/044f6002-c5d9-4064-a690-1ff1a6bb40e2_dust_100k.spz"},"posed_cubemaps_url":"https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/84fb4783-e74f-4676-b825-84834a349437_cubemaps","minimap_url":"https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/4e373e4c-b7c2-4122-aa7f-a27cf6377f8d_minimap.png","minimap_metadata":"[0.0, 1.486802339553833, 13.666599082946778]","status":"complete","mpi_url":"https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/17b7b9f7-1448-4e03-a244-ac51b87bc1a2_dust_mpi","cond_image_url":"https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/307390d3_image_prompt_sanitized.png"},"createdAt":1765323290361}}}},"update_mask":["metadata"]}'
@@ -0,0 +1,66 @@
{
"context": null,
"id": "10ad82a1-5f61-447f-b162-e3da0ef3e5b5",
"display_name": null,
"owner_id": "sVgAQDyH3BfYOBfF6epWTjLHygX2",
"status": "CREATED",
"created_at": 1765323283,
"updated_at": 1765323555,
"object_uri": null,
"mime_type": "application/run+json",
"metadata": {
"version": "0.0.1",
"name": "Moonlit Graveyard Vigil",
"createdAt": 1765323283075,
"updatedAt": 1765323555619,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {
"5046e0da-ce2c-428f-a5d8-3b99143d4ce3": {
"id": "5046e0da-ce2c-428f-a5d8-3b99143d4ce3",
"type": "input",
"parentId": null,
"source": {
"type": "image",
"image_url": "https://cdn.marble.worldlabs.ai/object/25ddd6ab-931c-480b-a817-cfbb562da980/asset.jpg"
},
"createdAt": 1765323289174,
"title": "Moonlit Graveyard Vigil",
"caption": "The scene is a somber and gothic graveyard at night, captured in a realistic, almost cinematic style, evoking a mood of quiet contemplation and melancholy. Numerous headstones and crypts of varying sizes and designs emerge from the overgrown grass, their weathered surfaces suggesting a long history. Tall, dark trees with skeletal branches stand against the cloudy night sky, their leaves barely visible, enhancing the scene's desolate atmosphere. A full, luminous moon hangs high in the sky, casting soft, ethereal light over the entire graveyard, illuminating the intricate carvings on some of the older monuments and the subtle textures of the ground. The ground itself is a mix of patchy grass and fallen leaves, indicating a neglected or aged burial ground, with small, indistinct flora growing in scattered clusters. Pathways, possibly made of worn earth or gravel, wind between the graves, though they are largely obscured by the low light and foliage. A low, stone wall or barrier might enclose the graveyard on one side, separating it from an unseen, silent world beyond. The moon remains a singular, dominant light source, creating long, soft shadows that stretch across the uneven terrain of the cemetery. "
},
"e132bc85-ecf1-4126-b466-f8c281ebaabf": {
"id": "e132bc85-ecf1-4126-b466-f8c281ebaabf",
"type": "pano",
"parentId": "5046e0da-ce2c-428f-a5d8-3b99143d4ce3",
"source": {
"type": "generate_world",
"url": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/d51d9ddd-bf33-4ce6-a1e0-b35bacde335b_panos/rgb_0.png",
"world_id": "323bfcc0-086a-4822-acc5-b38b4ddc624d",
"status": "complete"
},
"createdAt": 1765323290361
},
"5d90764a-7356-4c0c-b819-8c6fbdfa4300": {
"id": "5d90764a-7356-4c0c-b819-8c6fbdfa4300",
"type": "world",
"parentId": "e132bc85-ecf1-4126-b466-f8c281ebaabf",
"source": {
"type": "generate_world",
"world_id": "323bfcc0-086a-4822-acc5-b38b4ddc624d",
"spz_urls": {
"500k": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/514bcf69-1f9e-4fa1-ba82-5e3eacd3aa0e_ceramic_500k.spz",
"full_res": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/7a169623-8993-448d-b0c4-a9780287d0ce_ceramic.spz",
"100k": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/044f6002-c5d9-4064-a690-1ff1a6bb40e2_dust_100k.spz"
},
"posed_cubemaps_url": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/84fb4783-e74f-4676-b825-84834a349437_cubemaps",
"minimap_url": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/4e373e4c-b7c2-4122-aa7f-a27cf6377f8d_minimap.png",
"minimap_metadata": "[0.0, 1.486802339553833, 13.666599082946778]",
"status": "complete",
"mpi_url": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/17b7b9f7-1448-4e03-a244-ac51b87bc1a2_dust_mpi",
"cond_image_url": "https://cdn.marble.worldlabs.ai/323bfcc0-086a-4822-acc5-b38b4ddc624d/307390d3_image_prompt_sanitized.png"
},
"createdAt": 1765323290361
}
}
}
}
@@ -0,0 +1,20 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyMDg0MiwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzIwODQyLCJleHAiOjE3NjUzMjQ0NDIsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.SHy8_FpsekZ3LvRdwfDMqW1BDdBHVfJO78x0xtJuIhsKKrUCD88eb256MsAKFb_ak6mujk7GjzajUtkcV-JiZhxElzQ_lu1kQiOoSWcnmuXe8Pm1trx-NN1DUGLbVj2CopdmsRmX2Fs_hFgXd4KhGmcaiqKxEVKZGoq2vB4Bs2kvIjA7u3bqAdS75BsJ5kaxvvIrqY7WjmpVb2LWr6uZIaSZa2BFZi_CAs8rGFV7cO9zg3xGD8MKwG6DmJbopYrtHHECxHbYCe1f-HS5eXCN_tJFIq7CHV9RSyv3KkT5Da9yOIeDP8YBATxTLNWqdkq3h-mXmkFvgL7-n49-aqcIgA' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-4c2ae3c,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=3ea3cefa133447398d3d1b50923b158e,sentry-org_id=4509005975388160,sentry-replay_id=7da3fa2dd40d412fbc41559247f02342,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.5897258369230949,sentry-sample_rate=1' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'origin: https://marble.worldlabs.ai' \
-H 'pragma: no-cache' \
-H 'priority: u=1, i' \
-H 'referer: https://marble.worldlabs.ai/' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Chromium";v="142"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Linux"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'sentry-trace: 3ea3cefa133447398d3d1b50923b158e-a2647f414a7b9652-1' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36' \
--data-raw '{"metadata":{"version":"0.0.1","createdAt":1765324283470,"updatedAt":1765324283470,"useAdvancedEditing":false,"draftMode":false,"nodes":{}},"mime_type":"application/run+json"}'
@@ -0,0 +1,17 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds/3e8d210f-28ea-4375-92d8-3ee6f14db61d' \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyNTM3NCwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzI1Mzc0LCJleHAiOjE3NjUzMjg5NzQsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.U_mp4iAw14poJz11UFKg3QVO6TSfE8Gps6VqLhg4GLLumjilgnuyD8mnKFznRFX0R-OyBf8mugVk59zfy4BugeZ0cXRkm1FWHqR9BVJZ9BQoEobXw4RqHkUvtgSe2qnx8a4fLUVp5zxNPpXfEjLAdcG4YnNwdZ7-TxyCDvO3U_WHkG3aAJup1q5KOqURDeYoQ7m7THeobyM3pnmDO03GIMdYgLV3Lnpvk6FTprtsV8SxWr8ZJ-Cy1g_I9wtKcB4B5bIFLjfV4r8W_-uq_g5ddbri-Yy28Ah97jxFIFOVChbPSbQpS-TRshW6M2cM5Y2EhGudpgVQBM-Tekco9fGSRw' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Sec-GPC: 1' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'TE: trailers'
@@ -0,0 +1 @@
{"context":null,"id":"3e8d210f-28ea-4375-92d8-3ee6f14db61d","display_name":null,"status":"INITIALIZING","error":null,"owner_id":"sVgAQDyH3BfYOBfF6epWTjLHygX2","created_at":1765325564,"updated_at":1765325564,"permission":{"public":true,"allowed_readers":[],"allowed_writers":[]},"stats":null,"application_data":{"owner_username":"victorv","owner_display_name":"Victor Voice","reactions":null,"pinned":false},"generation_input":{"model":"Marble 0.1-plus","seed":null,"prompt":{"type":"image","text_prompt":"The scene is a cozy A-frame cabin interior, rendered in a realistic style, exuding warmth and rustic charm, creating a tranquil and inviting atmosphere. A prominent wooden A-frame structure defines the architecture, featuring angled timber beams that converge towards the peak of the ceiling. The walls and ceiling are paneled with warm-toned wooden planks, creating a consistent and enveloping aesthetic throughout the space. A large, floor-to-ceiling window dominates one wall, offering an expansive view of a lush forest with tall trees and autumnal foliage outside, suggesting the cabin is nestled deep within nature. A plush bed occupies a significant portion of the floor space, adorned with a dark grey duvet, numerous pillows, and a rust-colored throw blanket, inviting comfort and relaxation. A cream-colored faux fur rug rests on the wooden floor beside the bed, adding texture and a soft landing. A black wood-burning stove with a visible fire provides heat and a focal point for the room, situated near the large window. The floor is made of polished light wood planks. On the other side of the cabin, a continuation of the wooden paneling and A-frame structure mirrors the visible portion, maintaining architectural consistency. Another large window, identical in style and size to the visible one, would likely offer a similar forest view on the opposite side of the cabin, bathing the entire space in natural light filtered through the trees. A small, rustic armchair with a woven texture would be positioned near the stove on the opposite side, providing an additional seating area for enjoying the warmth. A stack of neatly chopped firewood is arranged next to the stove, ready for use, emphasizing the cabin's rustic functionality. ","image_prompt":{"uri":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/5c5474e3_image_prompt_sanitized.png","data_base64":null,"extension":null},"is_pano":false}},"tags":null,"hq_mesh_export_op_id":null,"generation_output":null}
@@ -0,0 +1,20 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'content-type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyNTM3NCwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzI1Mzc0LCJleHAiOjE3NjUzMjg5NzQsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.U_mp4iAw14poJz11UFKg3QVO6TSfE8Gps6VqLhg4GLLumjilgnuyD8mnKFznRFX0R-OyBf8mugVk59zfy4BugeZ0cXRkm1FWHqR9BVJZ9BQoEobXw4RqHkUvtgSe2qnx8a4fLUVp5zxNPpXfEjLAdcG4YnNwdZ7-TxyCDvO3U_WHkG3aAJup1q5KOqURDeYoQ7m7THeobyM3pnmDO03GIMdYgLV3Lnpvk6FTprtsV8SxWr8ZJ-Cy1g_I9wtKcB4B5bIFLjfV4r8W_-uq_g5ddbri-Yy28Ah97jxFIFOVChbPSbQpS-TRshW6M2cM5Y2EhGudpgVQBM-Tekco9fGSRw' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Sec-GPC: 1' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=0' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'TE: trailers' \
--data-raw '{"metadata":{"version":"0.0.1","createdAt":1765325556528,"updatedAt":1765325556528,"useAdvancedEditing":false,"draftMode":false,"nodes":{}},"mime_type":"application/run+json"}'
@@ -0,0 +1,11 @@
{
"metadata": {
"version": "0.0.1",
"createdAt": 1765325556528,
"updatedAt": 1765325556528,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {}
},
"mime_type": "application/run+json"
}
@@ -0,0 +1,19 @@
{
"context": null,
"id": "a37a82a4-0b39-47e1-acf9-07a65888d5be",
"display_name": null,
"owner_id": "sVgAQDyH3BfYOBfF6epWTjLHygX2",
"status": "CREATED",
"created_at": 1765325556,
"updated_at": 1765325556,
"object_uri": null,
"mime_type": "application/run+json",
"metadata": {
"version": "0.0.1",
"createdAt": 1765325556528,
"updatedAt": 1765325556528,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {}
}
}
@@ -0,0 +1,20 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'content-type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyNTM3NCwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzI1Mzc0LCJleHAiOjE3NjUzMjg5NzQsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.U_mp4iAw14poJz11UFKg3QVO6TSfE8Gps6VqLhg4GLLumjilgnuyD8mnKFznRFX0R-OyBf8mugVk59zfy4BugeZ0cXRkm1FWHqR9BVJZ9BQoEobXw4RqHkUvtgSe2qnx8a4fLUVp5zxNPpXfEjLAdcG4YnNwdZ7-TxyCDvO3U_WHkG3aAJup1q5KOqURDeYoQ7m7THeobyM3pnmDO03GIMdYgLV3Lnpvk6FTprtsV8SxWr8ZJ-Cy1g_I9wtKcB4B5bIFLjfV4r8W_-uq_g5ddbri-Yy28Ah97jxFIFOVChbPSbQpS-TRshW6M2cM5Y2EhGudpgVQBM-Tekco9fGSRw' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Sec-GPC: 1' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'TE: trailers' \
--data-raw '{"display_name":"uploaded_image_7e2fb65f-819a-486b-9609-f782ad4d244f.jpeg","mime_type":"image/jpeg"}'
@@ -0,0 +1,4 @@
{
"display_name": "uploaded_image_7e2fb65f-819a-486b-9609-f782ad4d244f.jpeg",
"mime_type": "image/jpeg"
}
@@ -0,0 +1,12 @@
{
"context": null,
"id": "cf326bd0-b7eb-454c-b433-54f36eb4d5a6",
"display_name": "uploaded_image_7e2fb65f-819a-486b-9609-f782ad4d244f.jpeg",
"owner_id": "sVgAQDyH3BfYOBfF6epWTjLHygX2",
"status": "CREATED",
"created_at": 1765325556,
"updated_at": 1765325556,
"object_uri": null,
"mime_type": "image/jpeg",
"metadata": null
}
@@ -0,0 +1,17 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds/3e8d210f-28ea-4375-92d8-3ee6f14db61d' \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyNTM3NCwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzI1Mzc0LCJleHAiOjE3NjUzMjg5NzQsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.U_mp4iAw14poJz11UFKg3QVO6TSfE8Gps6VqLhg4GLLumjilgnuyD8mnKFznRFX0R-OyBf8mugVk59zfy4BugeZ0cXRkm1FWHqR9BVJZ9BQoEobXw4RqHkUvtgSe2qnx8a4fLUVp5zxNPpXfEjLAdcG4YnNwdZ7-TxyCDvO3U_WHkG3aAJup1q5KOqURDeYoQ7m7THeobyM3pnmDO03GIMdYgLV3Lnpvk6FTprtsV8SxWr8ZJ-Cy1g_I9wtKcB4B5bIFLjfV4r8W_-uq_g5ddbri-Yy28Ah97jxFIFOVChbPSbQpS-TRshW6M2cM5Y2EhGudpgVQBM-Tekco9fGSRw' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Sec-GPC: 1' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'TE: trailers'
@@ -0,0 +1 @@
{"context":null,"id":"3e8d210f-28ea-4375-92d8-3ee6f14db61d","display_name":null,"status":"SUCCEEDED","error":null,"owner_id":"sVgAQDyH3BfYOBfF6epWTjLHygX2","created_at":1765325564,"updated_at":1765325831,"permission":{"public":true,"allowed_readers":[],"allowed_writers":[]},"stats":null,"application_data":{"owner_username":"victorv","owner_display_name":"Victor Voice","reactions":null,"pinned":false},"generation_input":{"model":"Marble 0.1-plus","seed":null,"prompt":{"type":"image","text_prompt":"The scene is a cozy A-frame cabin interior, rendered in a realistic style, exuding warmth and rustic charm, creating a tranquil and inviting atmosphere. A prominent wooden A-frame structure defines the architecture, featuring angled timber beams that converge towards the peak of the ceiling. The walls and ceiling are paneled with warm-toned wooden planks, creating a consistent and enveloping aesthetic throughout the space. A large, floor-to-ceiling window dominates one wall, offering an expansive view of a lush forest with tall trees and autumnal foliage outside, suggesting the cabin is nestled deep within nature. A plush bed occupies a significant portion of the floor space, adorned with a dark grey duvet, numerous pillows, and a rust-colored throw blanket, inviting comfort and relaxation. A cream-colored faux fur rug rests on the wooden floor beside the bed, adding texture and a soft landing. A black wood-burning stove with a visible fire provides heat and a focal point for the room, situated near the large window. The floor is made of polished light wood planks. On the other side of the cabin, a continuation of the wooden paneling and A-frame structure mirrors the visible portion, maintaining architectural consistency. Another large window, identical in style and size to the visible one, would likely offer a similar forest view on the opposite side of the cabin, bathing the entire space in natural light filtered through the trees. A small, rustic armchair with a woven texture would be positioned near the stove on the opposite side, providing an additional seating area for enjoying the warmth. A stack of neatly chopped firewood is arranged next to the stove, ready for use, emphasizing the cabin's rustic functionality. ","image_prompt":{"uri":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/5c5474e3_image_prompt_sanitized.png","data_base64":null,"extension":null},"is_pano":false}},"tags":null,"hq_mesh_export_op_id":null,"generation_output":{"ply_url":null,"wlg_url":null,"cond_image_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/5c5474e3_image_prompt_sanitized.png","mpi_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/942b0d8e-2f83-413a-a0a0-98693d719be9_dust_mpi","minimap_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/b110166c-31b6-463d-a6bc-ca383343bb78_minimap.png","minimap_metadata":"[-1.6852229833602905, 1.5322132110595703, 14.28858642578125]","spz_urls":{"500k":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/dcfef0e9-cad9-481b-888e-c0cd6a6cd897_ceramic_500k.spz","full_res":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/f86b7139-412c-49b8-9c8c-e0c7363ec5d2_ceramic.spz","100k":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/6a63455b-1534-483a-a433-c33f8341acbf_dust_100k.spz"},"skypano_url":null,"posed_cond_image":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/4e0a67f9-9d13-465b-8c04-2d69681315ae_cond_image","collider_mesh_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/ff0e4ac5.glb","hq_mesh_url":null,"full_res_mesh_url":null,"posed_cubemaps_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/1b6d0eff-bb70-4a85-a9c3-7c115a9ddc76_cubemaps","posed_panos_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/9b7df6b9-cf45-46a1-b131-0b0f07d9ffd0_panos","panos_metadata":null}}
@@ -0,0 +1,20 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/a37a82a4-0b39-47e1-acf9-07a65888d5be' \
-X PATCH \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'content-type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyNTM3NCwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzI1Mzc0LCJleHAiOjE3NjUzMjg5NzQsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.U_mp4iAw14poJz11UFKg3QVO6TSfE8Gps6VqLhg4GLLumjilgnuyD8mnKFznRFX0R-OyBf8mugVk59zfy4BugeZ0cXRkm1FWHqR9BVJZ9BQoEobXw4RqHkUvtgSe2qnx8a4fLUVp5zxNPpXfEjLAdcG4YnNwdZ7-TxyCDvO3U_WHkG3aAJup1q5KOqURDeYoQ7m7THeobyM3pnmDO03GIMdYgLV3Lnpvk6FTprtsV8SxWr8ZJ-Cy1g_I9wtKcB4B5bIFLjfV4r8W_-uq_g5ddbri-Yy28Ah97jxFIFOVChbPSbQpS-TRshW6M2cM5Y2EhGudpgVQBM-Tekco9fGSRw' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Sec-GPC: 1' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'TE: trailers' \
--data-raw $'{"object":{"metadata":{"version":"0.0.1","name":"Cozy A-frame Cabin Retreat","createdAt":1765325556528,"updatedAt":1765325836734,"useAdvancedEditing":false,"draftMode":false,"nodes":{"bcb8d155-0117-4d20-85cf-aa76627996e8":{"id":"bcb8d155-0117-4d20-85cf-aa76627996e8","type":"input","parentId":null,"source":{"type":"image","image_url":"https://cdn.marble.worldlabs.ai/object/cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg"},"createdAt":1765325562986,"title":"Cozy A-frame Cabin Retreat","caption":"The scene is a cozy A-frame cabin interior, rendered in a realistic style, exuding warmth and rustic charm, creating a tranquil and inviting atmosphere. A prominent wooden A-frame structure defines the architecture, featuring angled timber beams that converge towards the peak of the ceiling. The walls and ceiling are paneled with warm-toned wooden planks, creating a consistent and enveloping aesthetic throughout the space. A large, floor-to-ceiling window dominates one wall, offering an expansive view of a lush forest with tall trees and autumnal foliage outside, suggesting the cabin is nestled deep within nature. A plush bed occupies a significant portion of the floor space, adorned with a dark grey duvet, numerous pillows, and a rust-colored throw blanket, inviting comfort and relaxation. A cream-colored faux fur rug rests on the wooden floor beside the bed, adding texture and a soft landing. A black wood-burning stove with a visible fire provides heat and a focal point for the room, situated near the large window. The floor is made of polished light wood planks. On the other side of the cabin, a continuation of the wooden paneling and A-frame structure mirrors the visible portion, maintaining architectural consistency. Another large window, identical in style and size to the visible one, would likely offer a similar forest view on the opposite side of the cabin, bathing the entire space in natural light filtered through the trees. A small, rustic armchair with a woven texture would be positioned near the stove on the opposite side, providing an additional seating area for enjoying the warmth. A stack of neatly chopped firewood is arranged next to the stove, ready for use, emphasizing the cabin\'s rustic functionality. "},"b62ec969-b045-4f4e-8926-5f4c2f067b60":{"id":"b62ec969-b045-4f4e-8926-5f4c2f067b60","type":"pano","parentId":"bcb8d155-0117-4d20-85cf-aa76627996e8","source":{"type":"generate_world","url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/9b7df6b9-cf45-46a1-b131-0b0f07d9ffd0_panos/rgb_0.png","world_id":"3e8d210f-28ea-4375-92d8-3ee6f14db61d","status":"complete"},"createdAt":1765325565022},"42bf7afb-bf2f-434e-b5a3-573b48ac849a":{"id":"42bf7afb-bf2f-434e-b5a3-573b48ac849a","type":"world","parentId":"b62ec969-b045-4f4e-8926-5f4c2f067b60","source":{"type":"generate_world","world_id":"3e8d210f-28ea-4375-92d8-3ee6f14db61d","spz_urls":{"500k":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/dcfef0e9-cad9-481b-888e-c0cd6a6cd897_ceramic_500k.spz","full_res":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/f86b7139-412c-49b8-9c8c-e0c7363ec5d2_ceramic.spz","100k":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/6a63455b-1534-483a-a433-c33f8341acbf_dust_100k.spz"},"posed_cubemaps_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/1b6d0eff-bb70-4a85-a9c3-7c115a9ddc76_cubemaps","minimap_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/b110166c-31b6-463d-a6bc-ca383343bb78_minimap.png","minimap_metadata":"[-1.6852229833602905, 1.5322132110595703, 14.28858642578125]","status":"complete","mpi_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/942b0d8e-2f83-413a-a0a0-98693d719be9_dust_mpi","cond_image_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/5c5474e3_image_prompt_sanitized.png"},"createdAt":1765325565022}}}},"update_mask":["metadata"]}'
@@ -0,0 +1 @@
{"context":null,"id":"a37a82a4-0b39-47e1-acf9-07a65888d5be","display_name":null,"owner_id":"sVgAQDyH3BfYOBfF6epWTjLHygX2","status":"CREATED","created_at":1765325556,"updated_at":1765325836,"object_uri":null,"mime_type":"application/run+json","metadata":{"version":"0.0.1","name":"Cozy A-frame Cabin Retreat","createdAt":1765325556528,"updatedAt":1765325836734,"useAdvancedEditing":false,"draftMode":false,"nodes":{"bcb8d155-0117-4d20-85cf-aa76627996e8":{"id":"bcb8d155-0117-4d20-85cf-aa76627996e8","type":"input","parentId":null,"source":{"type":"image","image_url":"https://cdn.marble.worldlabs.ai/object/cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg"},"createdAt":1765325562986,"title":"Cozy A-frame Cabin Retreat","caption":"The scene is a cozy A-frame cabin interior, rendered in a realistic style, exuding warmth and rustic charm, creating a tranquil and inviting atmosphere. A prominent wooden A-frame structure defines the architecture, featuring angled timber beams that converge towards the peak of the ceiling. The walls and ceiling are paneled with warm-toned wooden planks, creating a consistent and enveloping aesthetic throughout the space. A large, floor-to-ceiling window dominates one wall, offering an expansive view of a lush forest with tall trees and autumnal foliage outside, suggesting the cabin is nestled deep within nature. A plush bed occupies a significant portion of the floor space, adorned with a dark grey duvet, numerous pillows, and a rust-colored throw blanket, inviting comfort and relaxation. A cream-colored faux fur rug rests on the wooden floor beside the bed, adding texture and a soft landing. A black wood-burning stove with a visible fire provides heat and a focal point for the room, situated near the large window. The floor is made of polished light wood planks. On the other side of the cabin, a continuation of the wooden paneling and A-frame structure mirrors the visible portion, maintaining architectural consistency. Another large window, identical in style and size to the visible one, would likely offer a similar forest view on the opposite side of the cabin, bathing the entire space in natural light filtered through the trees. A small, rustic armchair with a woven texture would be positioned near the stove on the opposite side, providing an additional seating area for enjoying the warmth. A stack of neatly chopped firewood is arranged next to the stove, ready for use, emphasizing the cabin's rustic functionality. "},"b62ec969-b045-4f4e-8926-5f4c2f067b60":{"id":"b62ec969-b045-4f4e-8926-5f4c2f067b60","type":"pano","parentId":"bcb8d155-0117-4d20-85cf-aa76627996e8","source":{"type":"generate_world","url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/9b7df6b9-cf45-46a1-b131-0b0f07d9ffd0_panos/rgb_0.png","world_id":"3e8d210f-28ea-4375-92d8-3ee6f14db61d","status":"complete"},"createdAt":1765325565022},"42bf7afb-bf2f-434e-b5a3-573b48ac849a":{"id":"42bf7afb-bf2f-434e-b5a3-573b48ac849a","type":"world","parentId":"b62ec969-b045-4f4e-8926-5f4c2f067b60","source":{"type":"generate_world","world_id":"3e8d210f-28ea-4375-92d8-3ee6f14db61d","spz_urls":{"500k":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/dcfef0e9-cad9-481b-888e-c0cd6a6cd897_ceramic_500k.spz","full_res":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/f86b7139-412c-49b8-9c8c-e0c7363ec5d2_ceramic.spz","100k":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/6a63455b-1534-483a-a433-c33f8341acbf_dust_100k.spz"},"posed_cubemaps_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/1b6d0eff-bb70-4a85-a9c3-7c115a9ddc76_cubemaps","minimap_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/b110166c-31b6-463d-a6bc-ca383343bb78_minimap.png","minimap_metadata":"[-1.6852229833602905, 1.5322132110595703, 14.28858642578125]","status":"complete","mpi_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/942b0d8e-2f83-413a-a0a0-98693d719be9_dust_mpi","cond_image_url":"https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/5c5474e3_image_prompt_sanitized.png"},"createdAt":1765325565022}}}}
@@ -0,0 +1,19 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/cf326bd0-b7eb-454c-b433-54f36eb4d5a6:upload' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyNTM3NCwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzI1Mzc0LCJleHAiOjE3NjUzMjg5NzQsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.U_mp4iAw14poJz11UFKg3QVO6TSfE8Gps6VqLhg4GLLumjilgnuyD8mnKFznRFX0R-OyBf8mugVk59zfy4BugeZ0cXRkm1FWHqR9BVJZ9BQoEobXw4RqHkUvtgSe2qnx8a4fLUVp5zxNPpXfEjLAdcG4YnNwdZ7-TxyCDvO3U_WHkG3aAJup1q5KOqURDeYoQ7m7THeobyM3pnmDO03GIMdYgLV3Lnpvk6FTprtsV8SxWr8ZJ-Cy1g_I9wtKcB4B5bIFLjfV4r8W_-uq_g5ddbri-Yy28Ah97jxFIFOVChbPSbQpS-TRshW6M2cM5Y2EhGudpgVQBM-Tekco9fGSRw' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Sec-GPC: 1' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'Content-Length: 0' \
-H 'TE: trailers'
@@ -0,0 +1,9 @@
{
"upload_id": "cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg",
"upload_url": "https://storage.googleapis.com/wlt-training-gsc-marble-assets-prod/temp/objects/cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wlt-training-gsc-sa%40wlt-training-gsc.iam.gserviceaccount.com%2F20251210%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20251210T001237Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=content-type%3Bhost%3Bx-goog-content-length-range&X-Goog-Signature=338a4058e69f0f4d717e64ffbd9ac5609b63a67a43a9cb5027a65822edafee2dcf6769dafda8d82f812b0a009c53af77df6c8163e2d884bee2ab1a33ce63894e43f5faac07553528feadcc009f71f9b6195f6a2f73c1c3f8e5772a63d53c7c0ffc937d3c96b221cf760367bf435318f6c463b029d7879f26064acb5ab8e404d18a16b9263a0157b4edcfffe840b682a6e8198f342dcee51b928f235e1618aa98fdd7ee55bca8f27017738037b81b3041f12a72903c0decbc0d83b3fd39bb0edd3b750441bc21e9a226723876e4a52164b61659678e24f8af001451fa84a14c01b372d71cd55abaacd67e2b32df55f65a49f6ba0640b5239ab23b7eb45ad30d54",
"required_headers": {
"Content-Type": "image/jpeg",
"x-goog-content-length-range": "0,1048576000"
},
"curl_example": "curl -X PUT -H 'Content-Type: image/jpeg' -H 'x-goog-content-length-range: 0,1048576000' --upload-file my-file 'https://storage.googleapis.com/wlt-training-gsc-marble-assets-prod/temp/objects/cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wlt-training-gsc-sa%40wlt-training-gsc.iam.gserviceaccount.com%2F20251210%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20251210T001237Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=content-type%3Bhost%3Bx-goog-content-length-range&X-Goog-Signature=338a4058e69f0f4d717e64ffbd9ac5609b63a67a43a9cb5027a65822edafee2dcf6769dafda8d82f812b0a009c53af77df6c8163e2d884bee2ab1a33ce63894e43f5faac07553528feadcc009f71f9b6195f6a2f73c1c3f8e5772a63d53c7c0ffc937d3c96b221cf760367bf435318f6c463b029d7879f26064acb5ab8e404d18a16b9263a0157b4edcfffe840b682a6e8198f342dcee51b928f235e1618aa98fdd7ee55bca8f27017738037b81b3041f12a72903c0decbc0d83b3fd39bb0edd3b750441bc21e9a226723876e4a52164b61659678e24f8af001451fa84a14c01b372d71cd55abaacd67e2b32df55f65a49f6ba0640b5239ab23b7eb45ad30d54'"
}
@@ -0,0 +1,19 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/cf326bd0-b7eb-454c-b433-54f36eb4d5a6:complete' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyNTM3NCwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzI1Mzc0LCJleHAiOjE3NjUzMjg5NzQsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.U_mp4iAw14poJz11UFKg3QVO6TSfE8Gps6VqLhg4GLLumjilgnuyD8mnKFznRFX0R-OyBf8mugVk59zfy4BugeZ0cXRkm1FWHqR9BVJZ9BQoEobXw4RqHkUvtgSe2qnx8a4fLUVp5zxNPpXfEjLAdcG4YnNwdZ7-TxyCDvO3U_WHkG3aAJup1q5KOqURDeYoQ7m7THeobyM3pnmDO03GIMdYgLV3Lnpvk6FTprtsV8SxWr8ZJ-Cy1g_I9wtKcB4B5bIFLjfV4r8W_-uq_g5ddbri-Yy28Ah97jxFIFOVChbPSbQpS-TRshW6M2cM5Y2EhGudpgVQBM-Tekco9fGSRw' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Sec-GPC: 1' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'Content-Length: 0' \
-H 'TE: trailers'
@@ -0,0 +1,12 @@
{
"context": null,
"id": "cf326bd0-b7eb-454c-b433-54f36eb4d5a6",
"display_name": "uploaded_image_7e2fb65f-819a-486b-9609-f782ad4d244f.jpeg",
"owner_id": "sVgAQDyH3BfYOBfF6epWTjLHygX2",
"status": "READY",
"created_at": 1765325556,
"updated_at": 1765325558,
"object_uri": "https://cdn.marble.worldlabs.ai/object/cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg",
"mime_type": "image/jpeg",
"metadata": null
}
@@ -0,0 +1,20 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/recaption2' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'content-type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyNTM3NCwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzI1Mzc0LCJleHAiOjE3NjUzMjg5NzQsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.U_mp4iAw14poJz11UFKg3QVO6TSfE8Gps6VqLhg4GLLumjilgnuyD8mnKFznRFX0R-OyBf8mugVk59zfy4BugeZ0cXRkm1FWHqR9BVJZ9BQoEobXw4RqHkUvtgSe2qnx8a4fLUVp5zxNPpXfEjLAdcG4YnNwdZ7-TxyCDvO3U_WHkG3aAJup1q5KOqURDeYoQ7m7THeobyM3pnmDO03GIMdYgLV3Lnpvk6FTprtsV8SxWr8ZJ-Cy1g_I9wtKcB4B5bIFLjfV4r8W_-uq_g5ddbri-Yy28Ah97jxFIFOVChbPSbQpS-TRshW6M2cM5Y2EhGudpgVQBM-Tekco9fGSRw' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Sec-GPC: 1' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'TE: trailers' \
--data-raw '{"world_prompt":{"type":"image","image_prompt":{"uri":"https://cdn.marble.worldlabs.ai/object/cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg"},"text_prompt":""},"user_caption":"","context":{"run_id":"a37a82a4-0b39-47e1-acf9-07a65888d5be"}}'
@@ -0,0 +1,13 @@
{
"world_prompt": {
"type": "image",
"image_prompt": {
"uri": "https://cdn.marble.worldlabs.ai/object/cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg"
},
"text_prompt": ""
},
"user_caption": "",
"context": {
"run_id": "a37a82a4-0b39-47e1-acf9-07a65888d5be"
}
}
@@ -0,0 +1,4 @@
{
"caption": "The scene is a cozy A-frame cabin interior, rendered in a realistic style, exuding warmth and rustic charm, creating a tranquil and inviting atmosphere. A prominent wooden A-frame structure defines the architecture, featuring angled timber beams that converge towards the peak of the ceiling. The walls and ceiling are paneled with warm-toned wooden planks, creating a consistent and enveloping aesthetic throughout the space. A large, floor-to-ceiling window dominates one wall, offering an expansive view of a lush forest with tall trees and autumnal foliage outside, suggesting the cabin is nestled deep within nature. A plush bed occupies a significant portion of the floor space, adorned with a dark grey duvet, numerous pillows, and a rust-colored throw blanket, inviting comfort and relaxation. A cream-colored faux fur rug rests on the wooden floor beside the bed, adding texture and a soft landing. A black wood-burning stove with a visible fire provides heat and a focal point for the room, situated near the large window. The floor is made of polished light wood planks. On the other side of the cabin, a continuation of the wooden paneling and A-frame structure mirrors the visible portion, maintaining architectural consistency. Another large window, identical in style and size to the visible one, would likely offer a similar forest view on the opposite side of the cabin, bathing the entire space in natural light filtered through the trees. A small, rustic armchair with a woven texture would be positioned near the stove on the opposite side, providing an additional seating area for enjoying the warmth. A stack of neatly chopped firewood is arranged next to the stove, ready for use, emphasizing the cabin's rustic functionality. ",
"title": "Cozy A-frame Cabin Retreat"
}
@@ -0,0 +1,20 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'content-type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyNTM3NCwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzI1Mzc0LCJleHAiOjE3NjUzMjg5NzQsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.U_mp4iAw14poJz11UFKg3QVO6TSfE8Gps6VqLhg4GLLumjilgnuyD8mnKFznRFX0R-OyBf8mugVk59zfy4BugeZ0cXRkm1FWHqR9BVJZ9BQoEobXw4RqHkUvtgSe2qnx8a4fLUVp5zxNPpXfEjLAdcG4YnNwdZ7-TxyCDvO3U_WHkG3aAJup1q5KOqURDeYoQ7m7THeobyM3pnmDO03GIMdYgLV3Lnpvk6FTprtsV8SxWr8ZJ-Cy1g_I9wtKcB4B5bIFLjfV4r8W_-uq_g5ddbri-Yy28Ah97jxFIFOVChbPSbQpS-TRshW6M2cM5Y2EhGudpgVQBM-Tekco9fGSRw' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Sec-GPC: 1' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'TE: trailers' \
--data-raw $'{"permission":{"public":true},"generation_input":{"model":"Marble 0.1-plus","prompt":{"type":"image","image_prompt":{"uri":"https://cdn.marble.worldlabs.ai/object/cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg"},"text_prompt":"The scene is a cozy A-frame cabin interior, rendered in a realistic style, exuding warmth and rustic charm, creating a tranquil and inviting atmosphere. A prominent wooden A-frame structure defines the architecture, featuring angled timber beams that converge towards the peak of the ceiling. The walls and ceiling are paneled with warm-toned wooden planks, creating a consistent and enveloping aesthetic throughout the space. A large, floor-to-ceiling window dominates one wall, offering an expansive view of a lush forest with tall trees and autumnal foliage outside, suggesting the cabin is nestled deep within nature. A plush bed occupies a significant portion of the floor space, adorned with a dark grey duvet, numerous pillows, and a rust-colored throw blanket, inviting comfort and relaxation. A cream-colored faux fur rug rests on the wooden floor beside the bed, adding texture and a soft landing. A black wood-burning stove with a visible fire provides heat and a focal point for the room, situated near the large window. The floor is made of polished light wood planks. On the other side of the cabin, a continuation of the wooden paneling and A-frame structure mirrors the visible portion, maintaining architectural consistency. Another large window, identical in style and size to the visible one, would likely offer a similar forest view on the opposite side of the cabin, bathing the entire space in natural light filtered through the trees. A small, rustic armchair with a woven texture would be positioned near the stove on the opposite side, providing an additional seating area for enjoying the warmth. A stack of neatly chopped firewood is arranged next to the stove, ready for use, emphasizing the cabin\'s rustic functionality. "}},"context":{"run_id":"a37a82a4-0b39-47e1-acf9-07a65888d5be"}}'
@@ -0,0 +1,18 @@
{
"permission": {
"public": true
},
"generation_input": {
"model": "Marble 0.1-plus",
"prompt": {
"type": "image",
"image_prompt": {
"uri": "https://cdn.marble.worldlabs.ai/object/cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg"
},
"text_prompt": "The scene is a cozy A-frame cabin interior, rendered in a realistic style, exuding warmth and rustic charm, creating a tranquil and inviting atmosphere. A prominent wooden A-frame structure defines the architecture, featuring angled timber beams that converge towards the peak of the ceiling. The walls and ceiling are paneled with warm-toned wooden planks, creating a consistent and enveloping aesthetic throughout the space. A large, floor-to-ceiling window dominates one wall, offering an expansive view of a lush forest with tall trees and autumnal foliage outside, suggesting the cabin is nestled deep within nature. A plush bed occupies a significant portion of the floor space, adorned with a dark grey duvet, numerous pillows, and a rust-colored throw blanket, inviting comfort and relaxation. A cream-colored faux fur rug rests on the wooden floor beside the bed, adding texture and a soft landing. A black wood-burning stove with a visible fire provides heat and a focal point for the room, situated near the large window. The floor is made of polished light wood planks. On the other side of the cabin, a continuation of the wooden paneling and A-frame structure mirrors the visible portion, maintaining architectural consistency. Another large window, identical in style and size to the visible one, would likely offer a similar forest view on the opposite side of the cabin, bathing the entire space in natural light filtered through the trees. A small, rustic armchair with a woven texture would be positioned near the stove on the opposite side, providing an additional seating area for enjoying the warmth. A stack of neatly chopped firewood is arranged next to the stove, ready for use, emphasizing the cabin's rustic functionality. "
}
},
"context": {
"run_id": "a37a82a4-0b39-47e1-acf9-07a65888d5be"
}
}
@@ -0,0 +1,37 @@
{
"context": {
"run_id": "a37a82a4-0b39-47e1-acf9-07a65888d5be",
"project_id": null
},
"id": "3e8d210f-28ea-4375-92d8-3ee6f14db61d",
"display_name": null,
"status": "INITIALIZING",
"error": null,
"owner_id": "sVgAQDyH3BfYOBfF6epWTjLHygX2",
"created_at": 1765325564,
"updated_at": 1765325564,
"permission": {
"public": true,
"allowed_readers": [],
"allowed_writers": []
},
"stats": null,
"application_data": null,
"generation_input": {
"model": "Marble 0.1-plus",
"seed": null,
"prompt": {
"type": "image",
"text_prompt": "The scene is a cozy A-frame cabin interior, rendered in a realistic style, exuding warmth and rustic charm, creating a tranquil and inviting atmosphere. A prominent wooden A-frame structure defines the architecture, featuring angled timber beams that converge towards the peak of the ceiling. The walls and ceiling are paneled with warm-toned wooden planks, creating a consistent and enveloping aesthetic throughout the space. A large, floor-to-ceiling window dominates one wall, offering an expansive view of a lush forest with tall trees and autumnal foliage outside, suggesting the cabin is nestled deep within nature. A plush bed occupies a significant portion of the floor space, adorned with a dark grey duvet, numerous pillows, and a rust-colored throw blanket, inviting comfort and relaxation. A cream-colored faux fur rug rests on the wooden floor beside the bed, adding texture and a soft landing. A black wood-burning stove with a visible fire provides heat and a focal point for the room, situated near the large window. The floor is made of polished light wood planks. On the other side of the cabin, a continuation of the wooden paneling and A-frame structure mirrors the visible portion, maintaining architectural consistency. Another large window, identical in style and size to the visible one, would likely offer a similar forest view on the opposite side of the cabin, bathing the entire space in natural light filtered through the trees. A small, rustic armchair with a woven texture would be positioned near the stove on the opposite side, providing an additional seating area for enjoying the warmth. A stack of neatly chopped firewood is arranged next to the stove, ready for use, emphasizing the cabin's rustic functionality. ",
"image_prompt": {
"uri": "https://cdn.marble.worldlabs.ai/3e8d210f-28ea-4375-92d8-3ee6f14db61d/5c5474e3_image_prompt_sanitized.png",
"data_base64": null,
"extension": "png"
},
"is_pano": null
}
},
"tags": null,
"hq_mesh_export_op_id": null,
"generation_output": null
}
@@ -0,0 +1,20 @@
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/a37a82a4-0b39-47e1-acf9-07a65888d5be' \
-X PATCH \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'content-type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVmljdG9yIFZvaWNlIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0t3MGFhWEtZU3F5LVhra242OXlkSUpGR25KQTM3UzEzWHZqTlk0ZDl4Q3pVektVdz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTMyNTM3NCwidXNlcl9pZCI6InNWZ0FRRHlIM0JmWU9CZkY2ZXBXVGpMSHlnWDIiLCJzdWIiOiJzVmdBUUR5SDNCZllPQmZGNmVwV1RqTEh5Z1gyIiwiaWF0IjoxNzY1MzI1Mzc0LCJleHAiOjE3NjUzMjg5NzQsImVtYWlsIjoidmljdG9ydm9pY2U4OUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNjQ1OTMwMDE5ODYxOTg4ODgzNiJdLCJlbWFpbCI6WyJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.U_mp4iAw14poJz11UFKg3QVO6TSfE8Gps6VqLhg4GLLumjilgnuyD8mnKFznRFX0R-OyBf8mugVk59zfy4BugeZ0cXRkm1FWHqR9BVJZ9BQoEobXw4RqHkUvtgSe2qnx8a4fLUVp5zxNPpXfEjLAdcG4YnNwdZ7-TxyCDvO3U_WHkG3aAJup1q5KOqURDeYoQ7m7THeobyM3pnmDO03GIMdYgLV3Lnpvk6FTprtsV8SxWr8ZJ-Cy1g_I9wtKcB4B5bIFLjfV4r8W_-uq_g5ddbri-Yy28Ah97jxFIFOVChbPSbQpS-TRshW6M2cM5Y2EhGudpgVQBM-Tekco9fGSRw' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Sec-GPC: 1' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'TE: trailers' \
--data-raw $'{"object":{"metadata":{"version":"0.0.1","name":"Cozy A-frame Cabin Retreat","createdAt":1765325556528,"updatedAt":1765325565023,"useAdvancedEditing":false,"draftMode":false,"nodes":{"bcb8d155-0117-4d20-85cf-aa76627996e8":{"id":"bcb8d155-0117-4d20-85cf-aa76627996e8","type":"input","parentId":null,"source":{"type":"image","image_url":"https://cdn.marble.worldlabs.ai/object/cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg"},"createdAt":1765325562986,"title":"Cozy A-frame Cabin Retreat","caption":"The scene is a cozy A-frame cabin interior, rendered in a realistic style, exuding warmth and rustic charm, creating a tranquil and inviting atmosphere. A prominent wooden A-frame structure defines the architecture, featuring angled timber beams that converge towards the peak of the ceiling. The walls and ceiling are paneled with warm-toned wooden planks, creating a consistent and enveloping aesthetic throughout the space. A large, floor-to-ceiling window dominates one wall, offering an expansive view of a lush forest with tall trees and autumnal foliage outside, suggesting the cabin is nestled deep within nature. A plush bed occupies a significant portion of the floor space, adorned with a dark grey duvet, numerous pillows, and a rust-colored throw blanket, inviting comfort and relaxation. A cream-colored faux fur rug rests on the wooden floor beside the bed, adding texture and a soft landing. A black wood-burning stove with a visible fire provides heat and a focal point for the room, situated near the large window. The floor is made of polished light wood planks. On the other side of the cabin, a continuation of the wooden paneling and A-frame structure mirrors the visible portion, maintaining architectural consistency. Another large window, identical in style and size to the visible one, would likely offer a similar forest view on the opposite side of the cabin, bathing the entire space in natural light filtered through the trees. A small, rustic armchair with a woven texture would be positioned near the stove on the opposite side, providing an additional seating area for enjoying the warmth. A stack of neatly chopped firewood is arranged next to the stove, ready for use, emphasizing the cabin\'s rustic functionality. "},"b62ec969-b045-4f4e-8926-5f4c2f067b60":{"id":"b62ec969-b045-4f4e-8926-5f4c2f067b60","type":"pano","parentId":"bcb8d155-0117-4d20-85cf-aa76627996e8","source":{"type":"generate_world","world_id":"3e8d210f-28ea-4375-92d8-3ee6f14db61d","status":"pending"},"createdAt":1765325565022},"42bf7afb-bf2f-434e-b5a3-573b48ac849a":{"id":"42bf7afb-bf2f-434e-b5a3-573b48ac849a","type":"world","parentId":"b62ec969-b045-4f4e-8926-5f4c2f067b60","source":{"type":"generate_world","world_id":"3e8d210f-28ea-4375-92d8-3ee6f14db61d","posed_cubemaps_url":"","minimap_url":"","minimap_metadata":"","status":"pending"},"createdAt":1765325565022}}}},"update_mask":["metadata"]}'
@@ -0,0 +1,54 @@
{
"object": {
"metadata": {
"version": "0.0.1",
"name": "Cozy A-frame Cabin Retreat",
"createdAt": 1765325556528,
"updatedAt": 1765325565023,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {
"bcb8d155-0117-4d20-85cf-aa76627996e8": {
"id": "bcb8d155-0117-4d20-85cf-aa76627996e8",
"type": "input",
"parentId": null,
"source": {
"type": "image",
"image_url": "https://cdn.marble.worldlabs.ai/object/cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg"
},
"createdAt": 1765325562986,
"title": "Cozy A-frame Cabin Retreat",
"caption": "The scene is a cozy A-frame cabin interior, rendered in a realistic style, exuding warmth and rustic charm, creating a tranquil and inviting atmosphere. A prominent wooden A-frame structure defines the architecture, featuring angled timber beams that converge towards the peak of the ceiling. The walls and ceiling are paneled with warm-toned wooden planks, creating a consistent and enveloping aesthetic throughout the space. A large, floor-to-ceiling window dominates one wall, offering an expansive view of a lush forest with tall trees and autumnal foliage outside, suggesting the cabin is nestled deep within nature. A plush bed occupies a significant portion of the floor space, adorned with a dark grey duvet, numerous pillows, and a rust-colored throw blanket, inviting comfort and relaxation. A cream-colored faux fur rug rests on the wooden floor beside the bed, adding texture and a soft landing. A black wood-burning stove with a visible fire provides heat and a focal point for the room, situated near the large window. The floor is made of polished light wood planks. On the other side of the cabin, a continuation of the wooden paneling and A-frame structure mirrors the visible portion, maintaining architectural consistency. Another large window, identical in style and size to the visible one, would likely offer a similar forest view on the opposite side of the cabin, bathing the entire space in natural light filtered through the trees. A small, rustic armchair with a woven texture would be positioned near the stove on the opposite side, providing an additional seating area for enjoying the warmth. A stack of neatly chopped firewood is arranged next to the stove, ready for use, emphasizing the cabins rustic functionality. "
},
"b62ec969-b045-4f4e-8926-5f4c2f067b60": {
"id": "b62ec969-b045-4f4e-8926-5f4c2f067b60",
"type": "pano",
"parentId": "bcb8d155-0117-4d20-85cf-aa76627996e8",
"source": {
"type": "generate_world",
"world_id": "3e8d210f-28ea-4375-92d8-3ee6f14db61d",
"status": "pending"
},
"createdAt": 1765325565022
},
"42bf7afb-bf2f-434e-b5a3-573b48ac849a": {
"id": "42bf7afb-bf2f-434e-b5a3-573b48ac849a",
"type": "world",
"parentId": "b62ec969-b045-4f4e-8926-5f4c2f067b60",
"source": {
"type": "generate_world",
"world_id": "3e8d210f-28ea-4375-92d8-3ee6f14db61d",
"posed_cubemaps_url": "",
"minimap_url": "",
"minimap_metadata": "",
"status": "pending"
},
"createdAt": 1765325565022
}
}
}
},
"update_mask": [
"metadata"
]
}
@@ -0,0 +1,58 @@
{
"context": null,
"id": "a37a82a4-0b39-47e1-acf9-07a65888d5be",
"display_name": null,
"owner_id": "sVgAQDyH3BfYOBfF6epWTjLHygX2",
"status": "CREATED",
"created_at": 1765325556,
"updated_at": 1765325565,
"object_uri": null,
"mime_type": "application/run+json",
"metadata": {
"version": "0.0.1",
"name": "Cozy A-frame Cabin Retreat",
"createdAt": 1765325556528,
"updatedAt": 1765325565023,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {
"bcb8d155-0117-4d20-85cf-aa76627996e8": {
"id": "bcb8d155-0117-4d20-85cf-aa76627996e8",
"type": "input",
"parentId": null,
"source": {
"type": "image",
"image_url": "https://cdn.marble.worldlabs.ai/object/cf326bd0-b7eb-454c-b433-54f36eb4d5a6/asset.jpg"
},
"createdAt": 1765325562986,
"title": "Cozy A-frame Cabin Retreat",
"caption": "The scene is a cozy A-frame cabin interior, rendered in a realistic style, exuding warmth and rustic charm, creating a tranquil and inviting atmosphere. A prominent wooden A-frame structure defines the architecture, featuring angled timber beams that converge towards the peak of the ceiling. The walls and ceiling are paneled with warm-toned wooden planks, creating a consistent and enveloping aesthetic throughout the space. A large, floor-to-ceiling window dominates one wall, offering an expansive view of a lush forest with tall trees and autumnal foliage outside, suggesting the cabin is nestled deep within nature. A plush bed occupies a significant portion of the floor space, adorned with a dark grey duvet, numerous pillows, and a rust-colored throw blanket, inviting comfort and relaxation. A cream-colored faux fur rug rests on the wooden floor beside the bed, adding texture and a soft landing. A black wood-burning stove with a visible fire provides heat and a focal point for the room, situated near the large window. The floor is made of polished light wood planks. On the other side of the cabin, a continuation of the wooden paneling and A-frame structure mirrors the visible portion, maintaining architectural consistency. Another large window, identical in style and size to the visible one, would likely offer a similar forest view on the opposite side of the cabin, bathing the entire space in natural light filtered through the trees. A small, rustic armchair with a woven texture would be positioned near the stove on the opposite side, providing an additional seating area for enjoying the warmth. A stack of neatly chopped firewood is arranged next to the stove, ready for use, emphasizing the cabins rustic functionality. "
},
"b62ec969-b045-4f4e-8926-5f4c2f067b60": {
"id": "b62ec969-b045-4f4e-8926-5f4c2f067b60",
"type": "pano",
"parentId": "bcb8d155-0117-4d20-85cf-aa76627996e8",
"source": {
"type": "generate_world",
"world_id": "3e8d210f-28ea-4375-92d8-3ee6f14db61d",
"status": "pending"
},
"createdAt": 1765325565022
},
"42bf7afb-bf2f-434e-b5a3-573b48ac849a": {
"id": "42bf7afb-bf2f-434e-b5a3-573b48ac849a",
"type": "world",
"parentId": "b62ec969-b045-4f4e-8926-5f4c2f067b60",
"source": {
"type": "generate_world",
"world_id": "3e8d210f-28ea-4375-92d8-3ee6f14db61d",
"posed_cubemaps_url": "",
"minimap_url": "",
"minimap_metadata": "",
"status": "pending"
},
"createdAt": 1765325565022
}
}
}
}
@@ -0,0 +1,62 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects
fetch("https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects", {
"headers": {
"accept": "*/*",
"accept-language": "en-US,en;q=0.9",
"authorization": "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVm9jb2RlcyBWb2NvZGVzIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0x6Mi0yT2FBbTBNUXhSNmo4Q05yLVBvOF9Yci1hcnlBVGlDbjRjMGlfVHVEbUxfZz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTQzMzEwOCwidXNlcl9pZCI6ImhkWXRlM3JWcldic3dKWkVnbEw1Q2RtS2Z4djEiLCJzdWIiOiJoZFl0ZTNyVnJXYnN3SlpFZ2xMNUNkbUtmeHYxIiwiaWF0IjoxNzY1NDMzMTA4LCJleHAiOjE3NjU0MzY3MDgsImVtYWlsIjoidm9jb2RlczIwMjBAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImZpcmViYXNlIjp7ImlkZW50aXRpZXMiOnsiZ29vZ2xlLmNvbSI6WyIxMTMxMDE5Njc2MTIzOTY3OTM3NzciXSwiZW1haWwiOlsidm9jb2RlczIwMjBAZ21haWwuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoiZ29vZ2xlLmNvbSJ9fQ.Q5yHeLfkTZb6DigaHmjwcejZNPw4byf0QAo-5z7FnZ2UJKfQINcwSQlXRTpDj-t4J8I5WlVBmqX9CM3UtSlQ4lJyc5UI2r5MPUri7Djl8NItKF0QEZhf-MO10crXuEG2IMNsiePrMjy9fDgHzOywA2HNpyJluZu9vgZqZxT4Nol11gcsxBssk7k-YWJR7Ig-pUgRzqkM0BgdX2HRad_gI2Fe7oH6s1cw1lJ157wYL-ltAH-diVWLuwlxolc7BeRDOEuqLlHtQgd4zVvVPrcOOSwwxOSPChgAaafERLBwaTBbFe3M0xqbdvPb7IU58LA-E3HlXyFsXcDf6m5anOyhrQ",
"baggage": "sentry-environment=prod,sentry-release=rel-5f2dd5e,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=59eba427c8e042aaae0b9d30f7f3aa4f,sentry-org_id=4509005975388160,sentry-replay_id=ada67eaa105f47049ac59d52f38232dd,sentry-transaction=%2F(auth)%2Fonboarding,sentry-sampled=true,sentry-sample_rand=0.7143690752789659,sentry-sample_rate=1",
"cache-control": "no-cache",
"content-type": "application/json",
"pragma": "no-cache",
"priority": "u=1, i",
"sec-ch-ua": "\"Not_A Brand\";v=\"99\", \"Chromium\";v=\"142\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Linux\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"sentry-trace": "59eba427c8e042aaae0b9d30f7f3aa4f-81eca8557b198888-1"
},
"referrer": "https://marble.worldlabs.ai/",
"body": "{\"metadata\":{\"version\":\"0.0.1\",\"createdAt\":1765433415549,\"updatedAt\":1765433415549,\"useAdvancedEditing\":false,\"draftMode\":false,\"nodes\":{}},\"mime_type\":\"application/run+json\"}",
"method": "POST",
"mode": "cors",
"credentials": "include"
});
Request Body:
{
"metadata": {
"version": "0.0.1",
"createdAt": 1765433415549,
"updatedAt": 1765433415549,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {}
},
"mime_type": "application/run+json"
}
Response:
{
"context":null,
"id":"6623842d-3669-49b9-976f-5b239c24e353",
"display_name":null,
"owner_id":"hdYte3rVrWbswJZEglL5CdmKfxv1",
"status":"CREATED",
"created_at":1765433415,
"updated_at":1765433415,
"object_uri":null,
"mime_type":"application/run+json",
"metadata":{
"version":"0.0.1",
"createdAt":1765433415549,
"updatedAt":1765433415549,
"useAdvancedEditing":false,
"draftMode":false,
"nodes":{}
}
}
@@ -0,0 +1,52 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects
fetch("https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects", {
"headers": {
"accept": "*/*",
"accept-language": "en-US,en;q=0.9",
"authorization": "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVm9jb2RlcyBWb2NvZGVzIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0x6Mi0yT2FBbTBNUXhSNmo4Q05yLVBvOF9Yci1hcnlBVGlDbjRjMGlfVHVEbUxfZz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTQzMzEwOCwidXNlcl9pZCI6ImhkWXRlM3JWcldic3dKWkVnbEw1Q2RtS2Z4djEiLCJzdWIiOiJoZFl0ZTNyVnJXYnN3SlpFZ2xMNUNkbUtmeHYxIiwiaWF0IjoxNzY1NDMzMTA4LCJleHAiOjE3NjU0MzY3MDgsImVtYWlsIjoidm9jb2RlczIwMjBAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImZpcmViYXNlIjp7ImlkZW50aXRpZXMiOnsiZ29vZ2xlLmNvbSI6WyIxMTMxMDE5Njc2MTIzOTY3OTM3NzciXSwiZW1haWwiOlsidm9jb2RlczIwMjBAZ21haWwuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoiZ29vZ2xlLmNvbSJ9fQ.Q5yHeLfkTZb6DigaHmjwcejZNPw4byf0QAo-5z7FnZ2UJKfQINcwSQlXRTpDj-t4J8I5WlVBmqX9CM3UtSlQ4lJyc5UI2r5MPUri7Djl8NItKF0QEZhf-MO10crXuEG2IMNsiePrMjy9fDgHzOywA2HNpyJluZu9vgZqZxT4Nol11gcsxBssk7k-YWJR7Ig-pUgRzqkM0BgdX2HRad_gI2Fe7oH6s1cw1lJ157wYL-ltAH-diVWLuwlxolc7BeRDOEuqLlHtQgd4zVvVPrcOOSwwxOSPChgAaafERLBwaTBbFe3M0xqbdvPb7IU58LA-E3HlXyFsXcDf6m5anOyhrQ",
"baggage": "sentry-environment=prod,sentry-release=rel-5f2dd5e,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=59eba427c8e042aaae0b9d30f7f3aa4f,sentry-org_id=4509005975388160,sentry-replay_id=ada67eaa105f47049ac59d52f38232dd,sentry-transaction=%2F(auth)%2Fonboarding,sentry-sampled=true,sentry-sample_rand=0.7143690752789659,sentry-sample_rate=1",
"cache-control": "no-cache",
"content-type": "application/json",
"pragma": "no-cache",
"priority": "u=1, i",
"sec-ch-ua": "\"Not_A Brand\";v=\"99\", \"Chromium\";v=\"142\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Linux\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"sentry-trace": "59eba427c8e042aaae0b9d30f7f3aa4f-96c7b63a77da1719-1"
},
"referrer": "https://marble.worldlabs.ai/",
"body": "{\"display_name\":\"uploaded_image_f21c0e52-5202-43eb-ba46-121860ae8265.jpeg\",\"mime_type\":\"image/jpeg\"}",
"method": "POST",
"mode": "cors",
"credentials": "include"
});
Request Payload:
{
"display_name": "uploaded_image_f21c0e52-5202-43eb-ba46-121860ae8265.jpeg",
"mime_type": "image/jpeg"
}
Response:
{"context":null,"id":"ee33d03e-b153-4d56-a7cb-a08bf86bd20e","display_name":"uploaded_image_f21c0e52-5202-43eb-ba46-121860ae8265.jpeg","owner_id":"hdYte3rVrWbswJZEglL5CdmKfxv1","status":"CREATED","created_at":1765433415,"updated_at":1765433415,"object_uri":null,"mime_type":"image/jpeg","metadata":null}
Response Printed:
{
"context": null,
"id": "ee33d03e-b153-4d56-a7cb-a08bf86bd20e",
"display_name": "uploaded_image_f21c0e52-5202-43eb-ba46-121860ae8265.jpeg",
"owner_id": "hdYte3rVrWbswJZEglL5CdmKfxv1",
"status": "CREATED",
"created_at": 1765433415,
"updated_at": 1765433415,
"object_uri": null,
"mime_type": "image/jpeg",
"metadata": null
}
@@ -0,0 +1,41 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/ee33d03e-b153-4d56-a7cb-a08bf86bd20e:upload
fetch("https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/ee33d03e-b153-4d56-a7cb-a08bf86bd20e:upload", {
"headers": {
"accept": "*/*",
"accept-language": "en-US,en;q=0.9",
"authorization": "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVm9jb2RlcyBWb2NvZGVzIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0x6Mi0yT2FBbTBNUXhSNmo4Q05yLVBvOF9Yci1hcnlBVGlDbjRjMGlfVHVEbUxfZz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTQzMzEwOCwidXNlcl9pZCI6ImhkWXRlM3JWcldic3dKWkVnbEw1Q2RtS2Z4djEiLCJzdWIiOiJoZFl0ZTNyVnJXYnN3SlpFZ2xMNUNkbUtmeHYxIiwiaWF0IjoxNzY1NDMzMTA4LCJleHAiOjE3NjU0MzY3MDgsImVtYWlsIjoidm9jb2RlczIwMjBAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImZpcmViYXNlIjp7ImlkZW50aXRpZXMiOnsiZ29vZ2xlLmNvbSI6WyIxMTMxMDE5Njc2MTIzOTY3OTM3NzciXSwiZW1haWwiOlsidm9jb2RlczIwMjBAZ21haWwuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoiZ29vZ2xlLmNvbSJ9fQ.Q5yHeLfkTZb6DigaHmjwcejZNPw4byf0QAo-5z7FnZ2UJKfQINcwSQlXRTpDj-t4J8I5WlVBmqX9CM3UtSlQ4lJyc5UI2r5MPUri7Djl8NItKF0QEZhf-MO10crXuEG2IMNsiePrMjy9fDgHzOywA2HNpyJluZu9vgZqZxT4Nol11gcsxBssk7k-YWJR7Ig-pUgRzqkM0BgdX2HRad_gI2Fe7oH6s1cw1lJ157wYL-ltAH-diVWLuwlxolc7BeRDOEuqLlHtQgd4zVvVPrcOOSwwxOSPChgAaafERLBwaTBbFe3M0xqbdvPb7IU58LA-E3HlXyFsXcDf6m5anOyhrQ",
"baggage": "sentry-environment=prod,sentry-release=rel-5f2dd5e,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=59eba427c8e042aaae0b9d30f7f3aa4f,sentry-org_id=4509005975388160,sentry-replay_id=ada67eaa105f47049ac59d52f38232dd,sentry-transaction=%2F(auth)%2Fonboarding,sentry-sampled=true,sentry-sample_rand=0.7143690752789659,sentry-sample_rate=1",
"cache-control": "no-cache",
"pragma": "no-cache",
"priority": "u=1, i",
"sec-ch-ua": "\"Not_A Brand\";v=\"99\", \"Chromium\";v=\"142\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Linux\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"sentry-trace": "59eba427c8e042aaae0b9d30f7f3aa4f-b77b4ae878caa9c8-1"
},
"referrer": "https://marble.worldlabs.ai/",
"body": null,
"method": "POST",
"mode": "cors",
"credentials": "include"
});
Response:
{"upload_id":"ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg","upload_url":"https://storage.googleapis.com/wlt-training-gsc-marble-assets-prod/temp/objects/ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wlt-training-gsc-sa%40wlt-training-gsc.iam.gserviceaccount.com%2F20251211%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20251211T061016Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=content-type%3Bhost%3Bx-goog-content-length-range&X-Goog-Signature=8c494d7afd19eea9820fc1d629d8b10cc76410c34f98c440665a0e2a7bf6980e6fadaa4a271c335de485780ee645dfb8b2f956cd8cc17fb1878581f5b39331208197579f9976bc6d21e75df1828c3bd5aba5bf21b91100f3c583b76ab2f0ce5fba32c671eaac860cfd43d4ecc31f509a83b1c30a8336d81fd1c9cd9fc9283ed4e8978c7a6418dc3ac3da51384041a5e3b7255b7bd67bdbbad5f65e87ef883d0dac9018caded615be46914b0d298fdc651bf1a77bef1d44d23ab416446c9dab42d9d82dc78ceab67379ad143dd99173fdfbbd7997a5b47673fc960cf511b76a6d1f941274a8bce456a16809c4f2752517f468611f67bf9eb1fab35e0d3280bdaa","required_headers":{"Content-Type":"image/jpeg","x-goog-content-length-range":"0,1048576000"},"curl_example":"curl -X PUT -H 'Content-Type: image/jpeg' -H 'x-goog-content-length-range: 0,1048576000' --upload-file my-file 'https://storage.googleapis.com/wlt-training-gsc-marble-assets-prod/temp/objects/ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wlt-training-gsc-sa%40wlt-training-gsc.iam.gserviceaccount.com%2F20251211%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20251211T061016Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=content-type%3Bhost%3Bx-goog-content-length-range&X-Goog-Signature=8c494d7afd19eea9820fc1d629d8b10cc76410c34f98c440665a0e2a7bf6980e6fadaa4a271c335de485780ee645dfb8b2f956cd8cc17fb1878581f5b39331208197579f9976bc6d21e75df1828c3bd5aba5bf21b91100f3c583b76ab2f0ce5fba32c671eaac860cfd43d4ecc31f509a83b1c30a8336d81fd1c9cd9fc9283ed4e8978c7a6418dc3ac3da51384041a5e3b7255b7bd67bdbbad5f65e87ef883d0dac9018caded615be46914b0d298fdc651bf1a77bef1d44d23ab416446c9dab42d9d82dc78ceab67379ad143dd99173fdfbbd7997a5b47673fc960cf511b76a6d1f941274a8bce456a16809c4f2752517f468611f67bf9eb1fab35e0d3280bdaa'"}
Response Pretty Printed:
{
"upload_id": "ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg",
"upload_url": "https://storage.googleapis.com/wlt-training-gsc-marble-assets-prod/temp/objects/ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wlt-training-gsc-sa%40wlt-training-gsc.iam.gserviceaccount.com%2F20251211%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20251211T061016Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=content-type%3Bhost%3Bx-goog-content-length-range&X-Goog-Signature=8c494d7afd19eea9820fc1d629d8b10cc76410c34f98c440665a0e2a7bf6980e6fadaa4a271c335de485780ee645dfb8b2f956cd8cc17fb1878581f5b39331208197579f9976bc6d21e75df1828c3bd5aba5bf21b91100f3c583b76ab2f0ce5fba32c671eaac860cfd43d4ecc31f509a83b1c30a8336d81fd1c9cd9fc9283ed4e8978c7a6418dc3ac3da51384041a5e3b7255b7bd67bdbbad5f65e87ef883d0dac9018caded615be46914b0d298fdc651bf1a77bef1d44d23ab416446c9dab42d9d82dc78ceab67379ad143dd99173fdfbbd7997a5b47673fc960cf511b76a6d1f941274a8bce456a16809c4f2752517f468611f67bf9eb1fab35e0d3280bdaa",
"required_headers": {
"Content-Type": "image/jpeg",
"x-goog-content-length-range": "0,1048576000"
},
"curl_example": "curl -X PUT -H 'Content-Type: image/jpeg' -H 'x-goog-content-length-range: 0,1048576000' --upload-file my-file 'https://storage.googleapis.com/wlt-training-gsc-marble-assets-prod/temp/objects/ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wlt-training-gsc-sa%40wlt-training-gsc.iam.gserviceaccount.com%2F20251211%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20251211T061016Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=content-type%3Bhost%3Bx-goog-content-length-range&X-Goog-Signature=8c494d7afd19eea9820fc1d629d8b10cc76410c34f98c440665a0e2a7bf6980e6fadaa4a271c335de485780ee645dfb8b2f956cd8cc17fb1878581f5b39331208197579f9976bc6d21e75df1828c3bd5aba5bf21b91100f3c583b76ab2f0ce5fba32c671eaac860cfd43d4ecc31f509a83b1c30a8336d81fd1c9cd9fc9283ed4e8978c7a6418dc3ac3da51384041a5e3b7255b7bd67bdbbad5f65e87ef883d0dac9018caded615be46914b0d298fdc651bf1a77bef1d44d23ab416446c9dab42d9d82dc78ceab67379ad143dd99173fdfbbd7997a5b47673fc960cf511b76a6d1f941274a8bce456a16809c4f2752517f468611f67bf9eb1fab35e0d3280bdaa'"
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,44 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/ee33d03e-b153-4d56-a7cb-a08bf86bd20e:complete
fetch("https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/ee33d03e-b153-4d56-a7cb-a08bf86bd20e:complete", {
"headers": {
"accept": "*/*",
"accept-language": "en-US,en;q=0.9",
"authorization": "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVm9jb2RlcyBWb2NvZGVzIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0x6Mi0yT2FBbTBNUXhSNmo4Q05yLVBvOF9Yci1hcnlBVGlDbjRjMGlfVHVEbUxfZz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTQzMzEwOCwidXNlcl9pZCI6ImhkWXRlM3JWcldic3dKWkVnbEw1Q2RtS2Z4djEiLCJzdWIiOiJoZFl0ZTNyVnJXYnN3SlpFZ2xMNUNkbUtmeHYxIiwiaWF0IjoxNzY1NDMzMTA4LCJleHAiOjE3NjU0MzY3MDgsImVtYWlsIjoidm9jb2RlczIwMjBAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImZpcmViYXNlIjp7ImlkZW50aXRpZXMiOnsiZ29vZ2xlLmNvbSI6WyIxMTMxMDE5Njc2MTIzOTY3OTM3NzciXSwiZW1haWwiOlsidm9jb2RlczIwMjBAZ21haWwuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoiZ29vZ2xlLmNvbSJ9fQ.Q5yHeLfkTZb6DigaHmjwcejZNPw4byf0QAo-5z7FnZ2UJKfQINcwSQlXRTpDj-t4J8I5WlVBmqX9CM3UtSlQ4lJyc5UI2r5MPUri7Djl8NItKF0QEZhf-MO10crXuEG2IMNsiePrMjy9fDgHzOywA2HNpyJluZu9vgZqZxT4Nol11gcsxBssk7k-YWJR7Ig-pUgRzqkM0BgdX2HRad_gI2Fe7oH6s1cw1lJ157wYL-ltAH-diVWLuwlxolc7BeRDOEuqLlHtQgd4zVvVPrcOOSwwxOSPChgAaafERLBwaTBbFe3M0xqbdvPb7IU58LA-E3HlXyFsXcDf6m5anOyhrQ",
"baggage": "sentry-environment=prod,sentry-release=rel-5f2dd5e,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=59eba427c8e042aaae0b9d30f7f3aa4f,sentry-org_id=4509005975388160,sentry-replay_id=ada67eaa105f47049ac59d52f38232dd,sentry-transaction=%2F(auth)%2Fonboarding,sentry-sampled=true,sentry-sample_rand=0.7143690752789659,sentry-sample_rate=1",
"cache-control": "no-cache",
"pragma": "no-cache",
"priority": "u=1, i",
"sec-ch-ua": "\"Not_A Brand\";v=\"99\", \"Chromium\";v=\"142\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Linux\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"sentry-trace": "59eba427c8e042aaae0b9d30f7f3aa4f-87ab2d9c0dd400ab-1"
},
"referrer": "https://marble.worldlabs.ai/",
"body": null,
"method": "POST",
"mode": "cors",
"credentials": "include"
});
Response:
{"context":null,"id":"ee33d03e-b153-4d56-a7cb-a08bf86bd20e","display_name":"uploaded_image_f21c0e52-5202-43eb-ba46-121860ae8265.jpeg","owner_id":"hdYte3rVrWbswJZEglL5CdmKfxv1","status":"READY","created_at":1765433416,"updated_at":1765433417,"object_uri":"https://cdn.marble.worldlabs.ai/object/ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg","mime_type":"image/jpeg","metadata":null}
Response Pretty Print:
{
"context": null,
"id": "ee33d03e-b153-4d56-a7cb-a08bf86bd20e",
"display_name": "uploaded_image_f21c0e52-5202-43eb-ba46-121860ae8265.jpeg",
"owner_id": "hdYte3rVrWbswJZEglL5CdmKfxv1",
"status": "READY",
"created_at": 1765433416,
"updated_at": 1765433417,
"object_uri": "https://cdn.marble.worldlabs.ai/object/ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg",
"mime_type": "image/jpeg",
"metadata": null
}
@@ -0,0 +1,165 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/6623842d-3669-49b9-976f-5b239c24e353
fetch("https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/6623842d-3669-49b9-976f-5b239c24e353", {
"headers": {
"accept": "*/*",
"accept-language": "en-US,en;q=0.9",
"authorization": "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk1MTg5MTkxMTA3NjA1NDM0NGUxNWUyNTY0MjViYjQyNWVlYjNhNWMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiVm9jb2RlcyBWb2NvZGVzIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0x6Mi0yT2FBbTBNUXhSNmo4Q05yLVBvOF9Yci1hcnlBVGlDbjRjMGlfVHVEbUxfZz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2NTQzMzEwOCwidXNlcl9pZCI6ImhkWXRlM3JWcldic3dKWkVnbEw1Q2RtS2Z4djEiLCJzdWIiOiJoZFl0ZTNyVnJXYnN3SlpFZ2xMNUNkbUtmeHYxIiwiaWF0IjoxNzY1NDMzMTA4LCJleHAiOjE3NjU0MzY3MDgsImVtYWlsIjoidm9jb2RlczIwMjBAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImZpcmViYXNlIjp7ImlkZW50aXRpZXMiOnsiZ29vZ2xlLmNvbSI6WyIxMTMxMDE5Njc2MTIzOTY3OTM3NzciXSwiZW1haWwiOlsidm9jb2RlczIwMjBAZ21haWwuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoiZ29vZ2xlLmNvbSJ9fQ.Q5yHeLfkTZb6DigaHmjwcejZNPw4byf0QAo-5z7FnZ2UJKfQINcwSQlXRTpDj-t4J8I5WlVBmqX9CM3UtSlQ4lJyc5UI2r5MPUri7Djl8NItKF0QEZhf-MO10crXuEG2IMNsiePrMjy9fDgHzOywA2HNpyJluZu9vgZqZxT4Nol11gcsxBssk7k-YWJR7Ig-pUgRzqkM0BgdX2HRad_gI2Fe7oH6s1cw1lJ157wYL-ltAH-diVWLuwlxolc7BeRDOEuqLlHtQgd4zVvVPrcOOSwwxOSPChgAaafERLBwaTBbFe3M0xqbdvPb7IU58LA-E3HlXyFsXcDf6m5anOyhrQ",
"baggage": "sentry-environment=prod,sentry-release=rel-5f2dd5e,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=59eba427c8e042aaae0b9d30f7f3aa4f,sentry-org_id=4509005975388160,sentry-replay_id=ada67eaa105f47049ac59d52f38232dd,sentry-transaction=%2F(auth)%2Fonboarding,sentry-sampled=true,sentry-sample_rand=0.7143690752789659,sentry-sample_rate=1",
"cache-control": "no-cache",
"content-type": "application/json",
"pragma": "no-cache",
"priority": "u=1, i",
"sec-ch-ua": "\"Not_A Brand\";v=\"99\", \"Chromium\";v=\"142\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Linux\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"sentry-trace": "59eba427c8e042aaae0b9d30f7f3aa4f-b681b158a45c6f06-1"
},
"referrer": "https://marble.worldlabs.ai/",
"body": "{\"object\":{\"metadata\":{\"version\":\"0.0.1\",\"createdAt\":1765433415549,\"updatedAt\":1765433417487,\"useAdvancedEditing\":false,\"draftMode\":false,\"nodes\":{\"9b864e10-5a9b-46a1-8a94-2b571649a60d\":{\"id\":\"9b864e10-5a9b-46a1-8a94-2b571649a60d\",\"type\":\"input\",\"parentId\":null,\"source\":{\"type\":\"image\",\"image_url\":\"https://cdn.marble.worldlabs.ai/object/ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg\"},\"createdAt\":1765433417487},\"22b9587b-2b4d-49c2-a6eb-e985d890e7db\":{\"id\":\"22b9587b-2b4d-49c2-a6eb-e985d890e7db\",\"type\":\"pano\",\"parentId\":\"9b864e10-5a9b-46a1-8a94-2b571649a60d\",\"source\":{\"type\":\"generate_world\",\"world_id\":\"pending\",\"status\":\"pending\"},\"createdAt\":1765433417487},\"8e63a168-0c85-470d-b655-b185e0e13fee\":{\"id\":\"8e63a168-0c85-470d-b655-b185e0e13fee\",\"type\":\"world\",\"parentId\":\"22b9587b-2b4d-49c2-a6eb-e985d890e7db\",\"source\":{\"type\":\"generate_world\",\"world_id\":\"pending\",\"posed_cubemaps_url\":\"\",\"minimap_url\":\"\",\"minimap_metadata\":\"\",\"status\":\"pending\"},\"createdAt\":1765433417487}}}},\"update_mask\":[\"metadata\"]}",
"method": "PATCH",
"mode": "cors",
"credentials": "include"
});
Request Payload:
{"object":{"metadata":{"version":"0.0.1","createdAt":1765433415549,"updatedAt":1765433417487,"useAdvancedEditing":false,"draftMode":false,"nodes":{"9b864e10-5a9b-46a1-8a94-2b571649a60d":{"id":"9b864e10-5a9b-46a1-8a94-2b571649a60d","type":"input","parentId":null,"source":{"type":"image","image_url":"https://cdn.marble.worldlabs.ai/object/ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg"},"createdAt":1765433417487},"22b9587b-2b4d-49c2-a6eb-e985d890e7db":{"id":"22b9587b-2b4d-49c2-a6eb-e985d890e7db","type":"pano","parentId":"9b864e10-5a9b-46a1-8a94-2b571649a60d","source":{"type":"generate_world","world_id":"pending","status":"pending"},"createdAt":1765433417487},"8e63a168-0c85-470d-b655-b185e0e13fee":{"id":"8e63a168-0c85-470d-b655-b185e0e13fee","type":"world","parentId":"22b9587b-2b4d-49c2-a6eb-e985d890e7db","source":{"type":"generate_world","world_id":"pending","posed_cubemaps_url":"","minimap_url":"","minimap_metadata":"","status":"pending"},"createdAt":1765433417487}}}},"update_mask":["metadata"]}
Request Payload Pretty Print:
{
"object": {
"metadata": {
"version": "0.0.1",
"createdAt": 1765433415549,
"updatedAt": 1765433417487,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {
// This is a new UUID that gets used downstream -
"9b864e10-5a9b-46a1-8a94-2b571649a60d": {
"id": "9b864e10-5a9b-46a1-8a94-2b571649a60d",
"type": "input",
"parentId": null,
"source": {
"type": "image",
"image_url": "https://cdn.marble.worldlabs.ai/object/ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg"
},
"createdAt": 1765433417487
},
"22b9587b-2b4d-49c2-a6eb-e985d890e7db": {
"id": "22b9587b-2b4d-49c2-a6eb-e985d890e7db",
"type": "pano",
"parentId": "9b864e10-5a9b-46a1-8a94-2b571649a60d",
"source": {
"type": "generate_world",
"world_id": "pending",
"status": "pending"
},
"createdAt": 1765433417487
},
"8e63a168-0c85-470d-b655-b185e0e13fee": {
"id": "8e63a168-0c85-470d-b655-b185e0e13fee",
"type": "world",
"parentId": "22b9587b-2b4d-49c2-a6eb-e985d890e7db",
"source": {
"type": "generate_world",
"world_id": "pending",
"posed_cubemaps_url": "",
"minimap_url": "",
"minimap_metadata": "",
"status": "pending"
},
"createdAt": 1765433417487
}
}
}
},
"update_mask": [
"metadata"
]
}
Notes:
- First node, `9b864e10-5a9b-46a1-8a94-2b571649a60d`, appears to be synthetic.
- Second node, `22b9587b-2b4d-49c2-a6eb-e985d890e7db`, appears to be synthetic.
Response:
{"context":null,"id":"6623842d-3669-49b9-976f-5b239c24e353","display_name":null,"owner_id":"hdYte3rVrWbswJZEglL5CdmKfxv1","status":"CREATED","created_at":1765433415,"updated_at":1765433417,"object_uri":null,"mime_type":"application/run+json","metadata":{"version":"0.0.1","createdAt":1765433415549,"updatedAt":1765433417487,"useAdvancedEditing":false,"draftMode":false,"nodes":{"9b864e10-5a9b-46a1-8a94-2b571649a60d":{"id":"9b864e10-5a9b-46a1-8a94-2b571649a60d","type":"input","parentId":null,"source":{"type":"image","image_url":"https://cdn.marble.worldlabs.ai/object/ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg"},"createdAt":1765433417487},"22b9587b-2b4d-49c2-a6eb-e985d890e7db":{"id":"22b9587b-2b4d-49c2-a6eb-e985d890e7db","type":"pano","parentId":"9b864e10-5a9b-46a1-8a94-2b571649a60d","source":{"type":"generate_world","world_id":"pending","status":"pending"},"createdAt":1765433417487},"8e63a168-0c85-470d-b655-b185e0e13fee":{"id":"8e63a168-0c85-470d-b655-b185e0e13fee","type":"world","parentId":"22b9587b-2b4d-49c2-a6eb-e985d890e7db","source":{"type":"generate_world","world_id":"pending","posed_cubemaps_url":"","minimap_url":"","minimap_metadata":"","status":"pending"},"createdAt":1765433417487}}}}
Response Pretty Print:
{
"context": null,
"id": "6623842d-3669-49b9-976f-5b239c24e353",
"display_name": null,
"owner_id": "hdYte3rVrWbswJZEglL5CdmKfxv1",
"status": "CREATED",
"created_at": 1765433415,
"updated_at": 1765433417,
"object_uri": null,
"mime_type": "application/run+json",
"metadata": {
"version": "0.0.1",
"createdAt": 1765433415549,
"updatedAt": 1765433417487,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {
"9b864e10-5a9b-46a1-8a94-2b571649a60d": {
"id": "9b864e10-5a9b-46a1-8a94-2b571649a60d",
"type": "input",
"parentId": null,
"source": {
"type": "image",
"image_url": "https://cdn.marble.worldlabs.ai/object/ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg"
},
"createdAt": 1765433417487
},
"22b9587b-2b4d-49c2-a6eb-e985d890e7db": {
"id": "22b9587b-2b4d-49c2-a6eb-e985d890e7db",
"type": "pano",
"parentId": "9b864e10-5a9b-46a1-8a94-2b571649a60d",
"source": {
"type": "generate_world",
"world_id": "pending",
"status": "pending"
},
"createdAt": 1765433417487
},
"8e63a168-0c85-470d-b655-b185e0e13fee": {
"id": "8e63a168-0c85-470d-b655-b185e0e13fee",
"type": "world",
"parentId": "22b9587b-2b4d-49c2-a6eb-e985d890e7db",
"source": {
"type": "generate_world",
"world_id": "pending",
"posed_cubemaps_url": "",
"minimap_url": "",
"minimap_metadata": "",
"status": "pending"
},
"createdAt": 1765433417487
}
}
}
}
The URL is accessible in the browser:
https://cdn.marble.worldlabs.ai/object/ee33d03e-b153-4d56-a7cb-a08bf86bd20e/asset.jpg
@@ -0,0 +1,81 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds/d60cfa21-5506-43de-9a9c-0707fc17a5ec
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds/d60cfa21-5506-43de-9a9c-0707fc17a5ec' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4MTFiMDdmMjhiODQxZjRiNDllNDgyNTg1ZmQ2NmQ1NWUzOGRiNWQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vd2x0LXRyYWluaW5nLWdzYyIsImF1ZCI6IndsdC10cmFpbmluZy1nc2MiLCJhdXRoX3RpbWUiOjE3NjU3NTY0OTYsInVzZXJfaWQiOiJDQXJKSjJQUUZGZDhsMlJmOHVwdFpobDg2ZDMzIiwic3ViIjoiQ0FySkoyUFFGRmQ4bDJSZjh1cHRaaGw4NmQzMyIsImlhdCI6MTc2NTc1NjQ5NiwiZXhwIjoxNzY1NzYwMDk2LCJlbWFpbCI6InNhYmFsaWQyMzRAY3JzYXkuY29tIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImVtYWlsIjpbInNhYmFsaWQyMzRAY3JzYXkuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.XWTpmC30BtMCLYfUISHyHuqScL2E-T9uUhZGpbZlcaT0VxJpMTFlDuXAgQKRK1xlnwvmypaKZQizyzOl-CjxtA_W_9iiOfPvbZ66gG1ry7XLYtqT8rxunuEX0MldiTdZznHuB7oiel03GiR1cc74B-4RYeNhjm7VCVpMOVw2zyQ75f8y2aylDDk-3BLoir_cnEru-K97l8ywrcTLCosaAaT-7SkKre_UeIZuuC-MDbw2Ccq3tWNC4oZaHaxKZLuDDRmkapPvN8HJ2rubG506AQ1O007f6N2zHbJDmxgm1niDMuOLGNbOp7XDelxIBS_cRGEPhSJfCjmuGnkRAk4zdw' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-3d78b11,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=602e8913a9bb4f9f94d2e730b1637158,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.1775266372869313,sentry-sample_rate=1' \
-H 'sentry-trace: 602e8913a9bb4f9f94d2e730b1637158-a612671b9027c513-1' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'TE: trailers'
Response:
{"context":null,"id":"d60cfa21-5506-43de-9a9c-0707fc17a5ec","display_name":null,"status":"INITIALIZING","error":null,"owner_id":"CArJJ2PQFFd8l2Rf8uptZhl86d33","created_at":1765756778,"updated_at":1765756778,"permission":{"public":true,"allowed_readers":[],"allowed_writers":[]},"stats":null,"application_data":{"owner_username":"Sabalid","owner_display_name":"Sabalid","reactions":null,"pinned":false},"generation_input":{"model":"Marble 0.1-plus","seed":null,"prompt":{"type":"image","text_prompt":"The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. ","image_prompt":{"uri":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/c3edfcf7_image_prompt_sanitized.png","data_base64":null,"extension":null},"is_pano":false}},"tags":null,"hq_mesh_export_op_id":null,"generation_output":null}
Response Pretty Print:
{
"context": null,
"id": "d60cfa21-5506-43de-9a9c-0707fc17a5ec",
"display_name": null,
"status": "INITIALIZING",
"error": null,
"owner_id": "CArJJ2PQFFd8l2Rf8uptZhl86d33",
"created_at": 1765756778,
"updated_at": 1765756778,
"permission": {
"public": true,
"allowed_readers": [],
"allowed_writers": []
},
"stats": null,
"application_data": {
"owner_username": "Sabalid",
"owner_display_name": "Sabalid",
"reactions": null,
"pinned": false
},
"generation_input": {
"model": "Marble 0.1-plus",
"seed": null,
"prompt": {
"type": "image",
"text_prompt": "The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. ",
"image_prompt": {
"uri": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/c3edfcf7_image_prompt_sanitized.png",
"data_base64": null,
"extension": null
},
"is_pano": false
}
},
"tags": null,
"hq_mesh_export_op_id": null,
"generation_output": null
}
=====================
IDs/UUIDs/Filenames thus far:
- CArJJ2PQFFd8l2Rf8uptZhl86d33 - returned in first request; "owner ID"
- 79795b32-e44d-4333-bac1-05b2c9a3ea12 - returned in first request; "run ID"
- uploaded_image_d008d227-9564-46f1-ba4e-9fcede900901.jpeg - sent in second request, `display_name` - `"upload filename"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf - returned in second request, "upload id"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg - returned in third request, "upload id" with asset.jpg filename suffix
- https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg - returned in fifth request, `object_uri` of upload
- bc17252b-811e-49d7-be3e-b7c538df9d30 - returned in 6th request, "type=input id source type image", used as parent of "pano"
- 82f6b488-8afe-4311-9022-80ad5789ad92 - returned in 6th request, "type=pano id", used as parent of "world"
- f08ec501-601c-47c6-a104-402d1820b8f0 - returned in 6th request, "type=world id"
- d60cfa21-5506-43de-9a9c-0707fc17a5ec - returned in 8th request, "world id"
- https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/c3edfcf7_image_prompt_sanitized.png - returned in 8th request, "image prompt"
@@ -0,0 +1,87 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds/d60cfa21-5506-43de-9a9c-0707fc17a5ec
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds/d60cfa21-5506-43de-9a9c-0707fc17a5ec' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4MTFiMDdmMjhiODQxZjRiNDllNDgyNTg1ZmQ2NmQ1NWUzOGRiNWQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vd2x0LXRyYWluaW5nLWdzYyIsImF1ZCI6IndsdC10cmFpbmluZy1nc2MiLCJhdXRoX3RpbWUiOjE3NjU3NTY0OTYsInVzZXJfaWQiOiJDQXJKSjJQUUZGZDhsMlJmOHVwdFpobDg2ZDMzIiwic3ViIjoiQ0FySkoyUFFGRmQ4bDJSZjh1cHRaaGw4NmQzMyIsImlhdCI6MTc2NTc1NjQ5NiwiZXhwIjoxNzY1NzYwMDk2LCJlbWFpbCI6InNhYmFsaWQyMzRAY3JzYXkuY29tIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImVtYWlsIjpbInNhYmFsaWQyMzRAY3JzYXkuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.XWTpmC30BtMCLYfUISHyHuqScL2E-T9uUhZGpbZlcaT0VxJpMTFlDuXAgQKRK1xlnwvmypaKZQizyzOl-CjxtA_W_9iiOfPvbZ66gG1ry7XLYtqT8rxunuEX0MldiTdZznHuB7oiel03GiR1cc74B-4RYeNhjm7VCVpMOVw2zyQ75f8y2aylDDk-3BLoir_cnEru-K97l8ywrcTLCosaAaT-7SkKre_UeIZuuC-MDbw2Ccq3tWNC4oZaHaxKZLuDDRmkapPvN8HJ2rubG506AQ1O007f6N2zHbJDmxgm1niDMuOLGNbOp7XDelxIBS_cRGEPhSJfCjmuGnkRAk4zdw' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-3d78b11,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=602e8913a9bb4f9f94d2e730b1637158,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.1775266372869313,sentry-sample_rate=1' \
-H 'sentry-trace: 602e8913a9bb4f9f94d2e730b1637158-bb87f52cf597e7f2-1' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'TE: trailers'
Response:
{"context":null,"id":"d60cfa21-5506-43de-9a9c-0707fc17a5ec","display_name":null,"status":"SUCCEEDED","error":null,"owner_id":"CArJJ2PQFFd8l2Rf8uptZhl86d33","created_at":1765756778,"updated_at":1765757084,"permission":{"public":true,"allowed_readers":[],"allowed_writers":[]},"stats":null,"application_data":{"owner_username":"Sabalid","owner_display_name":"Sabalid","reactions":null,"pinned":false},"generation_input":{"model":"Marble 0.1-plus","seed":null,"prompt":{"type":"image","text_prompt":"The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. ","image_prompt":{"uri":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/c3edfcf7_image_prompt_sanitized.png","data_base64":null,"extension":null},"is_pano":false}},"tags":null,"hq_mesh_export_op_id":null,"generation_output":{"ply_url":null,"wlg_url":null,"cond_image_url":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/c3edfcf7_image_prompt_sanitized.png","mpi_url":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/98fe3c48-1bbc-47c4-9566-e8c5148ea2f9_dust_mpi","minimap_url":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/9f1d6596-c3bb-4dfd-ad87-3c017d1bf14c_minimap.png","minimap_metadata":"[0.0, 2.499943256378174, 18.699874114990237]","spz_urls":{"500k":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/2fd338ed-3221-4aef-bff5-63cbdc0e5704_ceramic_500k.spz","full_res":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/1002dd35-fcad-4eeb-ba15-0d113c1778d8_ceramic.spz","100k":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/67f1291c-7aec-42fe-8c36-092383c1f326_dust_100k.spz"},"skypano_url":null,"posed_cond_image":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/9a62b2f9-9c14-4909-9368-e2e7ff4550db_cond_image","collider_mesh_url":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/ddcd9298.glb","hq_mesh_url":null,"full_res_mesh_url":null,"semantics_metadata":null,"posed_cubemaps_url":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/dba9fbb9-ed62-4be0-9196-d052eee06b82_cubemaps","posed_panos_url":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/f11182b6-61b1-4e31-87c6-23e1f74c675c_panos","panos_metadata":null}}
Response Pretty print:
{
"context": null,
"id": "d60cfa21-5506-43de-9a9c-0707fc17a5ec",
"display_name": null,
"status": "SUCCEEDED",
"error": null,
"owner_id": "CArJJ2PQFFd8l2Rf8uptZhl86d33",
"created_at": 1765756778,
"updated_at": 1765757084,
"permission": {
"public": true,
"allowed_readers": [],
"allowed_writers": []
},
"stats": null,
"application_data": {
"owner_username": "Sabalid",
"owner_display_name": "Sabalid",
"reactions": null,
"pinned": false
},
"generation_input": {
"model": "Marble 0.1-plus",
"seed": null,
"prompt": {
"type": "image",
"text_prompt": "The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. ",
"image_prompt": {
"uri": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/c3edfcf7_image_prompt_sanitized.png",
"data_base64": null,
"extension": null
},
"is_pano": false
}
},
"tags": null,
"hq_mesh_export_op_id": null,
"generation_output": {
"ply_url": null,
"wlg_url": null,
"cond_image_url": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/c3edfcf7_image_prompt_sanitized.png",
"mpi_url": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/98fe3c48-1bbc-47c4-9566-e8c5148ea2f9_dust_mpi",
"minimap_url": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/9f1d6596-c3bb-4dfd-ad87-3c017d1bf14c_minimap.png",
"minimap_metadata": "[0.0, 2.499943256378174, 18.699874114990237]",
"spz_urls": {
"500k": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/2fd338ed-3221-4aef-bff5-63cbdc0e5704_ceramic_500k.spz",
"full_res": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/1002dd35-fcad-4eeb-ba15-0d113c1778d8_ceramic.spz",
"100k": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/67f1291c-7aec-42fe-8c36-092383c1f326_dust_100k.spz"
},
"skypano_url": null,
"posed_cond_image": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/9a62b2f9-9c14-4909-9368-e2e7ff4550db_cond_image",
"collider_mesh_url": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/ddcd9298.glb",
"hq_mesh_url": null,
"full_res_mesh_url": null,
"semantics_metadata": null,
"posed_cubemaps_url": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/dba9fbb9-ed62-4be0-9196-d052eee06b82_cubemaps",
"posed_panos_url": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/f11182b6-61b1-4e31-87c6-23e1f74c675c_panos",
"panos_metadata": null
}
}
@@ -0,0 +1,68 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4MTFiMDdmMjhiODQxZjRiNDllNDgyNTg1ZmQ2NmQ1NWUzOGRiNWQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vd2x0LXRyYWluaW5nLWdzYyIsImF1ZCI6IndsdC10cmFpbmluZy1nc2MiLCJhdXRoX3RpbWUiOjE3NjU3NTY0OTYsInVzZXJfaWQiOiJDQXJKSjJQUUZGZDhsMlJmOHVwdFpobDg2ZDMzIiwic3ViIjoiQ0FySkoyUFFGRmQ4bDJSZjh1cHRaaGw4NmQzMyIsImlhdCI6MTc2NTc1NjQ5NiwiZXhwIjoxNzY1NzYwMDk2LCJlbWFpbCI6InNhYmFsaWQyMzRAY3JzYXkuY29tIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImVtYWlsIjpbInNhYmFsaWQyMzRAY3JzYXkuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.XWTpmC30BtMCLYfUISHyHuqScL2E-T9uUhZGpbZlcaT0VxJpMTFlDuXAgQKRK1xlnwvmypaKZQizyzOl-CjxtA_W_9iiOfPvbZ66gG1ry7XLYtqT8rxunuEX0MldiTdZznHuB7oiel03GiR1cc74B-4RYeNhjm7VCVpMOVw2zyQ75f8y2aylDDk-3BLoir_cnEru-K97l8ywrcTLCosaAaT-7SkKre_UeIZuuC-MDbw2Ccq3tWNC4oZaHaxKZLuDDRmkapPvN8HJ2rubG506AQ1O007f6N2zHbJDmxgm1niDMuOLGNbOp7XDelxIBS_cRGEPhSJfCjmuGnkRAk4zdw' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-3d78b11,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=602e8913a9bb4f9f94d2e730b1637158,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.1775266372869313,sentry-sample_rate=1' \
-H 'content-type: application/json' \
-H 'sentry-trace: 602e8913a9bb4f9f94d2e730b1637158-b07b0c3b15b2edc4-1' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=0' \
-H 'TE: trailers' \
--data-raw '{"metadata":{"version":"0.0.1","createdAt":1765756772176,"updatedAt":1765756772176,"useAdvancedEditing":false,"draftMode":false,"nodes":{}},"mime_type":"application/run+json"}'
Request Body:
{
"metadata": {
"version": "0.0.1",
"createdAt": 1765756772176,
"updatedAt": 1765756772176,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {}
},
"mime_type": "application/run+json"
}
Response:
{"context":null,"id":"79795b32-e44d-4333-bac1-05b2c9a3ea12","display_name":null,"owner_id":"CArJJ2PQFFd8l2Rf8uptZhl86d33","status":"CREATED","created_at":1765756772,"updated_at":1765756772,"object_uri":null,"mime_type":"application/run+json","metadata":{"version":"0.0.1","createdAt":1765756772176,"updatedAt":1765756772176,"useAdvancedEditing":false,"draftMode":false,"nodes":{}}}
Response Pretty:
{
"context": null,
"id": "79795b32-e44d-4333-bac1-05b2c9a3ea12",
"display_name": null,
"owner_id": "CArJJ2PQFFd8l2Rf8uptZhl86d33",
"status": "CREATED",
"created_at": 1765756772,
"updated_at": 1765756772,
"object_uri": null,
"mime_type": "application/run+json",
"metadata": {
"version": "0.0.1",
"createdAt": 1765756772176,
"updatedAt": 1765756772176,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {}
}
}
=====================
IDs/UUIDs thus far:
- CArJJ2PQFFd8l2Rf8uptZhl86d33 - returned in first request; "owner ID"
- 79795b32-e44d-4333-bac1-05b2c9a3ea12 - returned in first request; "run ID"
@@ -0,0 +1,50 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4MTFiMDdmMjhiODQxZjRiNDllNDgyNTg1ZmQ2NmQ1NWUzOGRiNWQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vd2x0LXRyYWluaW5nLWdzYyIsImF1ZCI6IndsdC10cmFpbmluZy1nc2MiLCJhdXRoX3RpbWUiOjE3NjU3NTY0OTYsInVzZXJfaWQiOiJDQXJKSjJQUUZGZDhsMlJmOHVwdFpobDg2ZDMzIiwic3ViIjoiQ0FySkoyUFFGRmQ4bDJSZjh1cHRaaGw4NmQzMyIsImlhdCI6MTc2NTc1NjQ5NiwiZXhwIjoxNzY1NzYwMDk2LCJlbWFpbCI6InNhYmFsaWQyMzRAY3JzYXkuY29tIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImVtYWlsIjpbInNhYmFsaWQyMzRAY3JzYXkuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.XWTpmC30BtMCLYfUISHyHuqScL2E-T9uUhZGpbZlcaT0VxJpMTFlDuXAgQKRK1xlnwvmypaKZQizyzOl-CjxtA_W_9iiOfPvbZ66gG1ry7XLYtqT8rxunuEX0MldiTdZznHuB7oiel03GiR1cc74B-4RYeNhjm7VCVpMOVw2zyQ75f8y2aylDDk-3BLoir_cnEru-K97l8ywrcTLCosaAaT-7SkKre_UeIZuuC-MDbw2Ccq3tWNC4oZaHaxKZLuDDRmkapPvN8HJ2rubG506AQ1O007f6N2zHbJDmxgm1niDMuOLGNbOp7XDelxIBS_cRGEPhSJfCjmuGnkRAk4zdw' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-3d78b11,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=602e8913a9bb4f9f94d2e730b1637158,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.1775266372869313,sentry-sample_rate=1' \
-H 'content-type: application/json' \
-H 'sentry-trace: 602e8913a9bb4f9f94d2e730b1637158-8cbdfa4093efb320-1' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'TE: trailers' \
--data-raw '{"display_name":"uploaded_image_d008d227-9564-46f1-ba4e-9fcede900901.jpeg","mime_type":"image/jpeg"}'
Response:
{"context":null,"id":"13ca760c-8ef9-4bf5-acc3-5a507fad3abf","display_name":"uploaded_image_d008d227-9564-46f1-ba4e-9fcede900901.jpeg","owner_id":"CArJJ2PQFFd8l2Rf8uptZhl86d33","status":"CREATED","created_at":1765756772,"updated_at":1765756772,"object_uri":null,"mime_type":"image/jpeg","metadata":null}
Response Pretty:
{
"context": null,
"id": "13ca760c-8ef9-4bf5-acc3-5a507fad3abf",
"display_name": "uploaded_image_d008d227-9564-46f1-ba4e-9fcede900901.jpeg",
"owner_id": "CArJJ2PQFFd8l2Rf8uptZhl86d33",
"status": "CREATED",
"created_at": 1765756772,
"updated_at": 1765756772,
"object_uri": null,
"mime_type": "image/jpeg",
"metadata": null
}
=====================
IDs/UUIDs/Filenames thus far:
- CArJJ2PQFFd8l2Rf8uptZhl86d33 - returned in first request; "owner ID"
- 79795b32-e44d-4333-bac1-05b2c9a3ea12 - returned in first request; "run ID"
- uploaded_image_d008d227-9564-46f1-ba4e-9fcede900901.jpeg - sent in second request, `display_name` - `"upload filename"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf - returned in second request, "upload id" (???)
@@ -0,0 +1,48 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/13ca760c-8ef9-4bf5-acc3-5a507fad3abf:upload
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/13ca760c-8ef9-4bf5-acc3-5a507fad3abf:upload' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4MTFiMDdmMjhiODQxZjRiNDllNDgyNTg1ZmQ2NmQ1NWUzOGRiNWQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vd2x0LXRyYWluaW5nLWdzYyIsImF1ZCI6IndsdC10cmFpbmluZy1nc2MiLCJhdXRoX3RpbWUiOjE3NjU3NTY0OTYsInVzZXJfaWQiOiJDQXJKSjJQUUZGZDhsMlJmOHVwdFpobDg2ZDMzIiwic3ViIjoiQ0FySkoyUFFGRmQ4bDJSZjh1cHRaaGw4NmQzMyIsImlhdCI6MTc2NTc1NjQ5NiwiZXhwIjoxNzY1NzYwMDk2LCJlbWFpbCI6InNhYmFsaWQyMzRAY3JzYXkuY29tIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImVtYWlsIjpbInNhYmFsaWQyMzRAY3JzYXkuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.XWTpmC30BtMCLYfUISHyHuqScL2E-T9uUhZGpbZlcaT0VxJpMTFlDuXAgQKRK1xlnwvmypaKZQizyzOl-CjxtA_W_9iiOfPvbZ66gG1ry7XLYtqT8rxunuEX0MldiTdZznHuB7oiel03GiR1cc74B-4RYeNhjm7VCVpMOVw2zyQ75f8y2aylDDk-3BLoir_cnEru-K97l8ywrcTLCosaAaT-7SkKre_UeIZuuC-MDbw2Ccq3tWNC4oZaHaxKZLuDDRmkapPvN8HJ2rubG506AQ1O007f6N2zHbJDmxgm1niDMuOLGNbOp7XDelxIBS_cRGEPhSJfCjmuGnkRAk4zdw' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-3d78b11,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=602e8913a9bb4f9f94d2e730b1637158,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.1775266372869313,sentry-sample_rate=1' \
-H 'sentry-trace: 602e8913a9bb4f9f94d2e730b1637158-b8b8cd20f8f5248e-1' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'Content-Length: 0' \
-H 'TE: trailers'
Response:
{"upload_id":"13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg","upload_url":"https://storage.googleapis.com/wlt-training-gsc-marble-assets-prod/temp/objects/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wlt-training-gsc-sa%40wlt-training-gsc.iam.gserviceaccount.com%2F20251214%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20251214T235932Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=content-type%3Bhost%3Bx-goog-content-length-range&X-Goog-Signature=0add84395f6752011ef8f90f4a65a3ce772af0591abc76b8e97149954c1325f936d4c09cfed949210ccd864b80fbb440d302cb1b2af4c08c568c8cb7d8ecbca5461f3de3350d2c36a21412808c2c2bb078fd2444f22ed2879aa3541b60bccffcb26d6c2c4a2628458c1a778bd5839c34029e1ff6b3a4ff8896d05016560f24ab7aa875a2991e9028c313ae0872403b77cd1001b0312a81b156311310215d0128d8148b37df579ca3f125a310622193c8c50afe4d0b0e6d985ed77508a26b63d74e2246630e31874a5e271ab97d485c348b319e30c9f1982fa5f6c4f060babef6beec62f563cef57b601f86e9071c5fce00fc90be145f042c363700ee8f741d85","required_headers":{"Content-Type":"image/jpeg","x-goog-content-length-range":"0,1048576000"},"curl_example":"curl -X PUT -H 'Content-Type: image/jpeg' -H 'x-goog-content-length-range: 0,1048576000' --upload-file my-file 'https://storage.googleapis.com/wlt-training-gsc-marble-assets-prod/temp/objects/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wlt-training-gsc-sa%40wlt-training-gsc.iam.gserviceaccount.com%2F20251214%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20251214T235932Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=content-type%3Bhost%3Bx-goog-content-length-range&X-Goog-Signature=0add84395f6752011ef8f90f4a65a3ce772af0591abc76b8e97149954c1325f936d4c09cfed949210ccd864b80fbb440d302cb1b2af4c08c568c8cb7d8ecbca5461f3de3350d2c36a21412808c2c2bb078fd2444f22ed2879aa3541b60bccffcb26d6c2c4a2628458c1a778bd5839c34029e1ff6b3a4ff8896d05016560f24ab7aa875a2991e9028c313ae0872403b77cd1001b0312a81b156311310215d0128d8148b37df579ca3f125a310622193c8c50afe4d0b0e6d985ed77508a26b63d74e2246630e31874a5e271ab97d485c348b319e30c9f1982fa5f6c4f060babef6beec62f563cef57b601f86e9071c5fce00fc90be145f042c363700ee8f741d85'"}
Response Pretty:
{
"upload_id": "13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg",
"upload_url": "https://storage.googleapis.com/wlt-training-gsc-marble-assets-prod/temp/objects/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wlt-training-gsc-sa%40wlt-training-gsc.iam.gserviceaccount.com%2F20251214%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20251214T235932Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=content-type%3Bhost%3Bx-goog-content-length-range&X-Goog-Signature=0add84395f6752011ef8f90f4a65a3ce772af0591abc76b8e97149954c1325f936d4c09cfed949210ccd864b80fbb440d302cb1b2af4c08c568c8cb7d8ecbca5461f3de3350d2c36a21412808c2c2bb078fd2444f22ed2879aa3541b60bccffcb26d6c2c4a2628458c1a778bd5839c34029e1ff6b3a4ff8896d05016560f24ab7aa875a2991e9028c313ae0872403b77cd1001b0312a81b156311310215d0128d8148b37df579ca3f125a310622193c8c50afe4d0b0e6d985ed77508a26b63d74e2246630e31874a5e271ab97d485c348b319e30c9f1982fa5f6c4f060babef6beec62f563cef57b601f86e9071c5fce00fc90be145f042c363700ee8f741d85",
"required_headers": {
"Content-Type": "image/jpeg",
"x-goog-content-length-range": "0,1048576000"
},
"curl_example": "curl -X PUT -H 'Content-Type: image/jpeg' -H 'x-goog-content-length-range: 0,1048576000' --upload-file my-file 'https://storage.googleapis.com/wlt-training-gsc-marble-assets-prod/temp/objects/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wlt-training-gsc-sa%40wlt-training-gsc.iam.gserviceaccount.com%2F20251214%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20251214T235932Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=content-type%3Bhost%3Bx-goog-content-length-range&X-Goog-Signature=0add84395f6752011ef8f90f4a65a3ce772af0591abc76b8e97149954c1325f936d4c09cfed949210ccd864b80fbb440d302cb1b2af4c08c568c8cb7d8ecbca5461f3de3350d2c36a21412808c2c2bb078fd2444f22ed2879aa3541b60bccffcb26d6c2c4a2628458c1a778bd5839c34029e1ff6b3a4ff8896d05016560f24ab7aa875a2991e9028c313ae0872403b77cd1001b0312a81b156311310215d0128d8148b37df579ca3f125a310622193c8c50afe4d0b0e6d985ed77508a26b63d74e2246630e31874a5e271ab97d485c348b319e30c9f1982fa5f6c4f060babef6beec62f563cef57b601f86e9071c5fce00fc90be145f042c363700ee8f741d85'"
}
=====================
IDs/UUIDs/Filenames thus far:
- CArJJ2PQFFd8l2Rf8uptZhl86d33 - returned in first request; "owner ID"
- 79795b32-e44d-4333-bac1-05b2c9a3ea12 - returned in first request; "run ID"
- uploaded_image_d008d227-9564-46f1-ba4e-9fcede900901.jpeg - sent in second request, `display_name` - `"upload filename"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf - returned in second request, "upload id"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg - returned in third request, "upload id" with asset.jpg filename suffix
@@ -0,0 +1,5 @@
https://storage.googleapis.com/wlt-training-gsc-marble-assets-prod/temp/objects/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wlt-training-gsc-sa%40wlt-training-gsc.iam.gserviceaccount.com%2F20251214%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20251214T235932Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=content-type%3Bhost%3Bx-goog-content-length-range&X-Goog-Signature=0add84395f6752011ef8f90f4a65a3ce772af0591abc76b8e97149954c1325f936d4c09cfed949210ccd864b80fbb440d302cb1b2af4c08c568c8cb7d8ecbca5461f3de3350d2c36a21412808c2c2bb078fd2444f22ed2879aa3541b60bccffcb26d6c2c4a2628458c1a778bd5839c34029e1ff6b3a4ff8896d05016560f24ab7aa875a2991e9028c313ae0872403b77cd1001b0312a81b156311310215d0128d8148b37df579ca3f125a310622193c8c50afe4d0b0e6d985ed77508a26b63d74e2246630e31874a5e271ab97d485c348b319e30c9f1982fa5f6c4f060babef6beec62f563cef57b601f86e9071c5fce00fc90be145f042c363700ee8f741d85
(Request elided!)
Response: (empty!)
@@ -0,0 +1,52 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/13ca760c-8ef9-4bf5-acc3-5a507fad3abf:complete
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/13ca760c-8ef9-4bf5-acc3-5a507fad3abf:complete' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4MTFiMDdmMjhiODQxZjRiNDllNDgyNTg1ZmQ2NmQ1NWUzOGRiNWQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vd2x0LXRyYWluaW5nLWdzYyIsImF1ZCI6IndsdC10cmFpbmluZy1nc2MiLCJhdXRoX3RpbWUiOjE3NjU3NTY0OTYsInVzZXJfaWQiOiJDQXJKSjJQUUZGZDhsMlJmOHVwdFpobDg2ZDMzIiwic3ViIjoiQ0FySkoyUFFGRmQ4bDJSZjh1cHRaaGw4NmQzMyIsImlhdCI6MTc2NTc1NjQ5NiwiZXhwIjoxNzY1NzYwMDk2LCJlbWFpbCI6InNhYmFsaWQyMzRAY3JzYXkuY29tIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImVtYWlsIjpbInNhYmFsaWQyMzRAY3JzYXkuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.XWTpmC30BtMCLYfUISHyHuqScL2E-T9uUhZGpbZlcaT0VxJpMTFlDuXAgQKRK1xlnwvmypaKZQizyzOl-CjxtA_W_9iiOfPvbZ66gG1ry7XLYtqT8rxunuEX0MldiTdZznHuB7oiel03GiR1cc74B-4RYeNhjm7VCVpMOVw2zyQ75f8y2aylDDk-3BLoir_cnEru-K97l8ywrcTLCosaAaT-7SkKre_UeIZuuC-MDbw2Ccq3tWNC4oZaHaxKZLuDDRmkapPvN8HJ2rubG506AQ1O007f6N2zHbJDmxgm1niDMuOLGNbOp7XDelxIBS_cRGEPhSJfCjmuGnkRAk4zdw' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-3d78b11,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=602e8913a9bb4f9f94d2e730b1637158,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.1775266372869313,sentry-sample_rate=1' \
-H 'sentry-trace: 602e8913a9bb4f9f94d2e730b1637158-94b956b304470b95-1' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'Content-Length: 0' \
-H 'TE: trailers'
Response:
{"context":null,"id":"13ca760c-8ef9-4bf5-acc3-5a507fad3abf","display_name":"uploaded_image_d008d227-9564-46f1-ba4e-9fcede900901.jpeg","owner_id":"CArJJ2PQFFd8l2Rf8uptZhl86d33","status":"READY","created_at":1765756772,"updated_at":1765756773,"object_uri":"https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg","mime_type":"image/jpeg","metadata":null}
Response Pretty:
{
"context": null,
"id": "13ca760c-8ef9-4bf5-acc3-5a507fad3abf",
"display_name": "uploaded_image_d008d227-9564-46f1-ba4e-9fcede900901.jpeg",
"owner_id": "CArJJ2PQFFd8l2Rf8uptZhl86d33",
"status": "READY",
"created_at": 1765756772,
"updated_at": 1765756773,
"object_uri": "https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg",
"mime_type": "image/jpeg",
"metadata": null
}
=====================
IDs/UUIDs/Filenames thus far:
- CArJJ2PQFFd8l2Rf8uptZhl86d33 - returned in first request; "owner ID"
- 79795b32-e44d-4333-bac1-05b2c9a3ea12 - returned in first request; "run ID"
- uploaded_image_d008d227-9564-46f1-ba4e-9fcede900901.jpeg - sent in second request, `display_name` - `"upload filename"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf - returned in second request, "upload id"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg - returned in third request, "upload id" with asset.jpg filename suffix
- https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg - returned in fifth request, `object_uri` of upload
@@ -0,0 +1,153 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/79795b32-e44d-4333-bac1-05b2c9a3ea12
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/79795b32-e44d-4333-bac1-05b2c9a3ea12' \
-X PATCH \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4MTFiMDdmMjhiODQxZjRiNDllNDgyNTg1ZmQ2NmQ1NWUzOGRiNWQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vd2x0LXRyYWluaW5nLWdzYyIsImF1ZCI6IndsdC10cmFpbmluZy1nc2MiLCJhdXRoX3RpbWUiOjE3NjU3NTY0OTYsInVzZXJfaWQiOiJDQXJKSjJQUUZGZDhsMlJmOHVwdFpobDg2ZDMzIiwic3ViIjoiQ0FySkoyUFFGRmQ4bDJSZjh1cHRaaGw4NmQzMyIsImlhdCI6MTc2NTc1NjQ5NiwiZXhwIjoxNzY1NzYwMDk2LCJlbWFpbCI6InNhYmFsaWQyMzRAY3JzYXkuY29tIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImVtYWlsIjpbInNhYmFsaWQyMzRAY3JzYXkuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.XWTpmC30BtMCLYfUISHyHuqScL2E-T9uUhZGpbZlcaT0VxJpMTFlDuXAgQKRK1xlnwvmypaKZQizyzOl-CjxtA_W_9iiOfPvbZ66gG1ry7XLYtqT8rxunuEX0MldiTdZznHuB7oiel03GiR1cc74B-4RYeNhjm7VCVpMOVw2zyQ75f8y2aylDDk-3BLoir_cnEru-K97l8ywrcTLCosaAaT-7SkKre_UeIZuuC-MDbw2Ccq3tWNC4oZaHaxKZLuDDRmkapPvN8HJ2rubG506AQ1O007f6N2zHbJDmxgm1niDMuOLGNbOp7XDelxIBS_cRGEPhSJfCjmuGnkRAk4zdw' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-3d78b11,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=602e8913a9bb4f9f94d2e730b1637158,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.1775266372869313,sentry-sample_rate=1' \
-H 'content-type: application/json' \
-H 'sentry-trace: 602e8913a9bb4f9f94d2e730b1637158-8caec01a11a161e3-1' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'TE: trailers' \
--data-raw '{"object":{"metadata":{"version":"0.0.1","createdAt":1765756772176,"updatedAt":1765756773647,"useAdvancedEditing":false,"draftMode":false,"nodes":{"bc17252b-811e-49d7-be3e-b7c538df9d30":{"id":"bc17252b-811e-49d7-be3e-b7c538df9d30","type":"input","parentId":null,"source":{"type":"image","image_url":"https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg"},"createdAt":1765756773647},"82f6b488-8afe-4311-9022-80ad5789ad92":{"id":"82f6b488-8afe-4311-9022-80ad5789ad92","type":"pano","parentId":"bc17252b-811e-49d7-be3e-b7c538df9d30","source":{"type":"generate_world","world_id":"pending","status":"pending"},"createdAt":1765756773647},"f08ec501-601c-47c6-a104-402d1820b8f0":{"id":"f08ec501-601c-47c6-a104-402d1820b8f0","type":"world","parentId":"82f6b488-8afe-4311-9022-80ad5789ad92","source":{"type":"generate_world","world_id":"pending","posed_cubemaps_url":"","minimap_url":"","minimap_metadata":"","status":"pending"},"createdAt":1765756773647}}}},"update_mask":["metadata"]}'
Request Body:
{
"object": {
"metadata": {
"version": "0.0.1",
"createdAt": 1765756772176,
"updatedAt": 1765756773647,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {
"bc17252b-811e-49d7-be3e-b7c538df9d30": {
"id": "bc17252b-811e-49d7-be3e-b7c538df9d30",
"type": "input",
"parentId": null,
"source": {
"type": "image",
"image_url": "https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg"
},
"createdAt": 1765756773647
},
"82f6b488-8afe-4311-9022-80ad5789ad92": {
"id": "82f6b488-8afe-4311-9022-80ad5789ad92",
"type": "pano",
"parentId": "bc17252b-811e-49d7-be3e-b7c538df9d30",
"source": {
"type": "generate_world",
"world_id": "pending",
"status": "pending"
},
"createdAt": 1765756773647
},
"f08ec501-601c-47c6-a104-402d1820b8f0": {
"id": "f08ec501-601c-47c6-a104-402d1820b8f0",
"type": "world",
"parentId": "82f6b488-8afe-4311-9022-80ad5789ad92",
"source": {
"type": "generate_world",
"world_id": "pending",
"posed_cubemaps_url": "",
"minimap_url": "",
"minimap_metadata": "",
"status": "pending"
},
"createdAt": 1765756773647
}
}
}
},
"update_mask": [
"metadata"
]
}
Response:
{"context":null,"id":"79795b32-e44d-4333-bac1-05b2c9a3ea12","display_name":null,"owner_id":"CArJJ2PQFFd8l2Rf8uptZhl86d33","status":"CREATED","created_at":1765756772,"updated_at":1765756773,"object_uri":null,"mime_type":"application/run+json","metadata":{"version":"0.0.1","createdAt":1765756772176,"updatedAt":1765756773647,"useAdvancedEditing":false,"draftMode":false,"nodes":{"bc17252b-811e-49d7-be3e-b7c538df9d30":{"id":"bc17252b-811e-49d7-be3e-b7c538df9d30","type":"input","parentId":null,"source":{"type":"image","image_url":"https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg"},"createdAt":1765756773647},"82f6b488-8afe-4311-9022-80ad5789ad92":{"id":"82f6b488-8afe-4311-9022-80ad5789ad92","type":"pano","parentId":"bc17252b-811e-49d7-be3e-b7c538df9d30","source":{"type":"generate_world","world_id":"pending","status":"pending"},"createdAt":1765756773647},"f08ec501-601c-47c6-a104-402d1820b8f0":{"id":"f08ec501-601c-47c6-a104-402d1820b8f0","type":"world","parentId":"82f6b488-8afe-4311-9022-80ad5789ad92","source":{"type":"generate_world","world_id":"pending","posed_cubemaps_url":"","minimap_url":"","minimap_metadata":"","status":"pending"},"createdAt":1765756773647}}}}
Response Pretty:
{
"context": null,
"id": "79795b32-e44d-4333-bac1-05b2c9a3ea12",
"display_name": null,
"owner_id": "CArJJ2PQFFd8l2Rf8uptZhl86d33",
"status": "CREATED",
"created_at": 1765756772,
"updated_at": 1765756773,
"object_uri": null,
"mime_type": "application/run+json",
"metadata": {
"version": "0.0.1",
"createdAt": 1765756772176,
"updatedAt": 1765756773647,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {
"bc17252b-811e-49d7-be3e-b7c538df9d30": {
"id": "bc17252b-811e-49d7-be3e-b7c538df9d30",
"type": "input",
"parentId": null,
"source": {
"type": "image",
"image_url": "https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg"
},
"createdAt": 1765756773647
},
"82f6b488-8afe-4311-9022-80ad5789ad92": {
"id": "82f6b488-8afe-4311-9022-80ad5789ad92",
"type": "pano",
"parentId": "bc17252b-811e-49d7-be3e-b7c538df9d30",
"source": {
"type": "generate_world",
"world_id": "pending",
"status": "pending"
},
"createdAt": 1765756773647
},
"f08ec501-601c-47c6-a104-402d1820b8f0": {
"id": "f08ec501-601c-47c6-a104-402d1820b8f0",
"type": "world",
"parentId": "82f6b488-8afe-4311-9022-80ad5789ad92",
"source": {
"type": "generate_world",
"world_id": "pending",
"posed_cubemaps_url": "",
"minimap_url": "",
"minimap_metadata": "",
"status": "pending"
},
"createdAt": 1765756773647
}
}
}
}
=====================
IDs/UUIDs/Filenames thus far:
- CArJJ2PQFFd8l2Rf8uptZhl86d33 - returned in first request; "owner ID"
- 79795b32-e44d-4333-bac1-05b2c9a3ea12 - returned in first request; "run ID"
- uploaded_image_d008d227-9564-46f1-ba4e-9fcede900901.jpeg - sent in second request, `display_name` - `"upload filename"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf - returned in second request, "upload id"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg - returned in third request, "upload id" with asset.jpg filename suffix
- https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg - returned in fifth request, `object_uri` of upload
- bc17252b-811e-49d7-be3e-b7c538df9d30 - returned in 6th request, "type=input id source type image", used as parent of "pano"
- 82f6b488-8afe-4311-9022-80ad5789ad92 - returned in 6th request, "type=pano id", used as parent of "world"
- f08ec501-601c-47c6-a104-402d1820b8f0 - returned in 6th request, "type=world id"
@@ -0,0 +1,26 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/recaption2
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/recaption2' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4MTFiMDdmMjhiODQxZjRiNDllNDgyNTg1ZmQ2NmQ1NWUzOGRiNWQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vd2x0LXRyYWluaW5nLWdzYyIsImF1ZCI6IndsdC10cmFpbmluZy1nc2MiLCJhdXRoX3RpbWUiOjE3NjU3NTY0OTYsInVzZXJfaWQiOiJDQXJKSjJQUUZGZDhsMlJmOHVwdFpobDg2ZDMzIiwic3ViIjoiQ0FySkoyUFFGRmQ4bDJSZjh1cHRaaGw4NmQzMyIsImlhdCI6MTc2NTc1NjQ5NiwiZXhwIjoxNzY1NzYwMDk2LCJlbWFpbCI6InNhYmFsaWQyMzRAY3JzYXkuY29tIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImVtYWlsIjpbInNhYmFsaWQyMzRAY3JzYXkuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.XWTpmC30BtMCLYfUISHyHuqScL2E-T9uUhZGpbZlcaT0VxJpMTFlDuXAgQKRK1xlnwvmypaKZQizyzOl-CjxtA_W_9iiOfPvbZ66gG1ry7XLYtqT8rxunuEX0MldiTdZznHuB7oiel03GiR1cc74B-4RYeNhjm7VCVpMOVw2zyQ75f8y2aylDDk-3BLoir_cnEru-K97l8ywrcTLCosaAaT-7SkKre_UeIZuuC-MDbw2Ccq3tWNC4oZaHaxKZLuDDRmkapPvN8HJ2rubG506AQ1O007f6N2zHbJDmxgm1niDMuOLGNbOp7XDelxIBS_cRGEPhSJfCjmuGnkRAk4zdw' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-3d78b11,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=602e8913a9bb4f9f94d2e730b1637158,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.1775266372869313,sentry-sample_rate=1' \
-H 'content-type: application/json' \
-H 'sentry-trace: 602e8913a9bb4f9f94d2e730b1637158-a9ef13f4660e2f94-1' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'TE: trailers' \
--data-raw '{"world_prompt":{"type":"image","image_prompt":{"uri":"https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg"},"text_prompt":""},"user_caption":""}'
Response:
{"caption":"The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. ","title":"Cows Grazing in Indoor Pasture"}
@@ -0,0 +1,97 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4MTFiMDdmMjhiODQxZjRiNDllNDgyNTg1ZmQ2NmQ1NWUzOGRiNWQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vd2x0LXRyYWluaW5nLWdzYyIsImF1ZCI6IndsdC10cmFpbmluZy1nc2MiLCJhdXRoX3RpbWUiOjE3NjU3NTY0OTYsInVzZXJfaWQiOiJDQXJKSjJQUUZGZDhsMlJmOHVwdFpobDg2ZDMzIiwic3ViIjoiQ0FySkoyUFFGRmQ4bDJSZjh1cHRaaGw4NmQzMyIsImlhdCI6MTc2NTc1NjQ5NiwiZXhwIjoxNzY1NzYwMDk2LCJlbWFpbCI6InNhYmFsaWQyMzRAY3JzYXkuY29tIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImVtYWlsIjpbInNhYmFsaWQyMzRAY3JzYXkuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.XWTpmC30BtMCLYfUISHyHuqScL2E-T9uUhZGpbZlcaT0VxJpMTFlDuXAgQKRK1xlnwvmypaKZQizyzOl-CjxtA_W_9iiOfPvbZ66gG1ry7XLYtqT8rxunuEX0MldiTdZznHuB7oiel03GiR1cc74B-4RYeNhjm7VCVpMOVw2zyQ75f8y2aylDDk-3BLoir_cnEru-K97l8ywrcTLCosaAaT-7SkKre_UeIZuuC-MDbw2Ccq3tWNC4oZaHaxKZLuDDRmkapPvN8HJ2rubG506AQ1O007f6N2zHbJDmxgm1niDMuOLGNbOp7XDelxIBS_cRGEPhSJfCjmuGnkRAk4zdw' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-3d78b11,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=602e8913a9bb4f9f94d2e730b1637158,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.1775266372869313,sentry-sample_rate=1' \
-H 'content-type: application/json' \
-H 'sentry-trace: 602e8913a9bb4f9f94d2e730b1637158-84f963d495daade6-1' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'TE: trailers' \
--data-raw '{"permission":{"public":true},"generation_input":{"model":"Marble 0.1-plus","prompt":{"type":"image","image_prompt":{"uri":"https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg"},"text_prompt":"The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. "}}}'
Body Data:
{
"permission": {
"public": true
},
"generation_input": {
"model": "Marble 0.1-plus",
"prompt": {
"type": "image",
"image_prompt": {
"uri": "https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg"
},
"text_prompt": "The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. "
}
}
}
Response:
{"context":null,"id":"d60cfa21-5506-43de-9a9c-0707fc17a5ec","display_name":null,"status":"INITIALIZING","error":null,"owner_id":"CArJJ2PQFFd8l2Rf8uptZhl86d33","created_at":1765756778,"updated_at":1765756778,"permission":{"public":true,"allowed_readers":[],"allowed_writers":[]},"stats":null,"application_data":null,"generation_input":{"model":"Marble 0.1-plus","seed":null,"prompt":{"type":"image","text_prompt":"The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. ","image_prompt":{"uri":"https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/c3edfcf7_image_prompt_sanitized.png","data_base64":null,"extension":"png"},"is_pano":null}},"tags":null,"hq_mesh_export_op_id":null,"generation_output":null}
Response Pretty Print:
{
"context": null,
"id": "d60cfa21-5506-43de-9a9c-0707fc17a5ec",
"display_name": null,
"status": "INITIALIZING",
"error": null,
"owner_id": "CArJJ2PQFFd8l2Rf8uptZhl86d33",
"created_at": 1765756778,
"updated_at": 1765756778,
"permission": {
"public": true,
"allowed_readers": [],
"allowed_writers": []
},
"stats": null,
"application_data": null,
"generation_input": {
"model": "Marble 0.1-plus",
"seed": null,
"prompt": {
"type": "image",
"text_prompt": "The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. ",
"image_prompt": {
"uri": "https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/c3edfcf7_image_prompt_sanitized.png",
"data_base64": null,
"extension": "png"
},
"is_pano": null
}
},
"tags": null,
"hq_mesh_export_op_id": null,
"generation_output": null
}
=====================
IDs/UUIDs/Filenames thus far:
- CArJJ2PQFFd8l2Rf8uptZhl86d33 - returned in first request; "owner ID"
- 79795b32-e44d-4333-bac1-05b2c9a3ea12 - returned in first request; "run ID"
- uploaded_image_d008d227-9564-46f1-ba4e-9fcede900901.jpeg - sent in second request, `display_name` - `"upload filename"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf - returned in second request, "upload id"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg - returned in third request, "upload id" with asset.jpg filename suffix
- https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg - returned in fifth request, `object_uri` of upload
- bc17252b-811e-49d7-be3e-b7c538df9d30 - returned in 6th request, "type=input id source type image", used as parent of "pano"
- 82f6b488-8afe-4311-9022-80ad5789ad92 - returned in 6th request, "type=pano id", used as parent of "world"
- f08ec501-601c-47c6-a104-402d1820b8f0 - returned in 6th request, "type=world id"
- d60cfa21-5506-43de-9a9c-0707fc17a5ec - returned in 8th request, "world id"
- https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/c3edfcf7_image_prompt_sanitized.png - returned in 8th request, "image prompt"
@@ -0,0 +1,160 @@
https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/79795b32-e44d-4333-bac1-05b2c9a3ea12
curl 'https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/79795b32-e44d-4333-bac1-05b2c9a3ea12' \
-X PATCH \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4MTFiMDdmMjhiODQxZjRiNDllNDgyNTg1ZmQ2NmQ1NWUzOGRiNWQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vd2x0LXRyYWluaW5nLWdzYyIsImF1ZCI6IndsdC10cmFpbmluZy1nc2MiLCJhdXRoX3RpbWUiOjE3NjU3NTY0OTYsInVzZXJfaWQiOiJDQXJKSjJQUUZGZDhsMlJmOHVwdFpobDg2ZDMzIiwic3ViIjoiQ0FySkoyUFFGRmQ4bDJSZjh1cHRaaGw4NmQzMyIsImlhdCI6MTc2NTc1NjQ5NiwiZXhwIjoxNzY1NzYwMDk2LCJlbWFpbCI6InNhYmFsaWQyMzRAY3JzYXkuY29tIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImVtYWlsIjpbInNhYmFsaWQyMzRAY3JzYXkuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.XWTpmC30BtMCLYfUISHyHuqScL2E-T9uUhZGpbZlcaT0VxJpMTFlDuXAgQKRK1xlnwvmypaKZQizyzOl-CjxtA_W_9iiOfPvbZ66gG1ry7XLYtqT8rxunuEX0MldiTdZznHuB7oiel03GiR1cc74B-4RYeNhjm7VCVpMOVw2zyQ75f8y2aylDDk-3BLoir_cnEru-K97l8ywrcTLCosaAaT-7SkKre_UeIZuuC-MDbw2Ccq3tWNC4oZaHaxKZLuDDRmkapPvN8HJ2rubG506AQ1O007f6N2zHbJDmxgm1niDMuOLGNbOp7XDelxIBS_cRGEPhSJfCjmuGnkRAk4zdw' \
-H 'baggage: sentry-environment=prod,sentry-release=rel-3d78b11,sentry-public_key=3779934420ee57f00d05e5fb1e57f79d,sentry-trace_id=602e8913a9bb4f9f94d2e730b1637158,sentry-org_id=4509005975388160,sentry-transaction=%2F(main)%2F_explore%2F,sentry-sampled=true,sentry-sample_rand=0.1775266372869313,sentry-sample_rate=1' \
-H 'content-type: application/json' \
-H 'sentry-trace: 602e8913a9bb4f9f94d2e730b1637158-8f4c2f0bc8fc4683-1' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'TE: trailers' \
--data-raw '{"object":{"metadata":{"version":"0.0.1","name":"Cows Grazing in Indoor Pasture","createdAt":1765756772176,"updatedAt":1765756779076,"useAdvancedEditing":false,"draftMode":false,"nodes":{"bc17252b-811e-49d7-be3e-b7c538df9d30":{"id":"bc17252b-811e-49d7-be3e-b7c538df9d30","type":"input","parentId":null,"source":{"type":"image","image_url":"https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg"},"createdAt":1765756773647,"title":"Cows Grazing in Indoor Pasture","caption":"The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. "},"82f6b488-8afe-4311-9022-80ad5789ad92":{"id":"82f6b488-8afe-4311-9022-80ad5789ad92","type":"pano","parentId":"bc17252b-811e-49d7-be3e-b7c538df9d30","source":{"type":"generate_world","world_id":"d60cfa21-5506-43de-9a9c-0707fc17a5ec","status":"pending"},"createdAt":1765756773647},"f08ec501-601c-47c6-a104-402d1820b8f0":{"id":"f08ec501-601c-47c6-a104-402d1820b8f0","type":"world","parentId":"82f6b488-8afe-4311-9022-80ad5789ad92","source":{"type":"generate_world","world_id":"d60cfa21-5506-43de-9a9c-0707fc17a5ec","posed_cubemaps_url":"","minimap_url":"","minimap_metadata":"","status":"pending"},"createdAt":1765756773647}}}},"update_mask":["metadata"]}'
Request Body:
{
"object": {
"metadata": {
"version": "0.0.1",
"name": "Cows Grazing in Indoor Pasture",
"createdAt": 1765756772176,
"updatedAt": 1765756779076,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {
"bc17252b-811e-49d7-be3e-b7c538df9d30": {
"id": "bc17252b-811e-49d7-be3e-b7c538df9d30",
"type": "input",
"parentId": null,
"source": {
"type": "image",
"image_url": "https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg"
},
"createdAt": 1765756773647,
"title": "Cows Grazing in Indoor Pasture",
"caption": "The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. "
},
"82f6b488-8afe-4311-9022-80ad5789ad92": {
"id": "82f6b488-8afe-4311-9022-80ad5789ad92",
"type": "pano",
"parentId": "bc17252b-811e-49d7-be3e-b7c538df9d30",
"source": {
"type": "generate_world",
"world_id": "d60cfa21-5506-43de-9a9c-0707fc17a5ec",
"status": "pending"
},
"createdAt": 1765756773647
},
"f08ec501-601c-47c6-a104-402d1820b8f0": {
"id": "f08ec501-601c-47c6-a104-402d1820b8f0",
"type": "world",
"parentId": "82f6b488-8afe-4311-9022-80ad5789ad92",
"source": {
"type": "generate_world",
"world_id": "d60cfa21-5506-43de-9a9c-0707fc17a5ec",
"posed_cubemaps_url": "",
"minimap_url": "",
"minimap_metadata": "",
"status": "pending"
},
"createdAt": 1765756773647
}
}
}
},
"update_mask": [
"metadata"
]
}
Response:
{"context":null,"id":"79795b32-e44d-4333-bac1-05b2c9a3ea12","display_name":null,"owner_id":"CArJJ2PQFFd8l2Rf8uptZhl86d33","status":"CREATED","created_at":1765756772,"updated_at":1765756779,"object_uri":null,"mime_type":"application/run+json","metadata":{"version":"0.0.1","name":"Cows Grazing in Indoor Pasture","createdAt":1765756772176,"updatedAt":1765756779076,"useAdvancedEditing":false,"draftMode":false,"nodes":{"bc17252b-811e-49d7-be3e-b7c538df9d30":{"id":"bc17252b-811e-49d7-be3e-b7c538df9d30","type":"input","parentId":null,"source":{"type":"image","image_url":"https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg"},"createdAt":1765756773647,"title":"Cows Grazing in Indoor Pasture","caption":"The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. "},"82f6b488-8afe-4311-9022-80ad5789ad92":{"id":"82f6b488-8afe-4311-9022-80ad5789ad92","type":"pano","parentId":"bc17252b-811e-49d7-be3e-b7c538df9d30","source":{"type":"generate_world","world_id":"d60cfa21-5506-43de-9a9c-0707fc17a5ec","status":"pending"},"createdAt":1765756773647},"f08ec501-601c-47c6-a104-402d1820b8f0":{"id":"f08ec501-601c-47c6-a104-402d1820b8f0","type":"world","parentId":"82f6b488-8afe-4311-9022-80ad5789ad92","source":{"type":"generate_world","world_id":"d60cfa21-5506-43de-9a9c-0707fc17a5ec","posed_cubemaps_url":"","minimap_url":"","minimap_metadata":"","status":"pending"},"createdAt":1765756773647}}}}
Response Pretty Print:
{
"context": null,
"id": "79795b32-e44d-4333-bac1-05b2c9a3ea12",
"display_name": null,
"owner_id": "CArJJ2PQFFd8l2Rf8uptZhl86d33",
"status": "CREATED",
"created_at": 1765756772,
"updated_at": 1765756779,
"object_uri": null,
"mime_type": "application/run+json",
"metadata": {
"version": "0.0.1",
"name": "Cows Grazing in Indoor Pasture",
"createdAt": 1765756772176,
"updatedAt": 1765756779076,
"useAdvancedEditing": false,
"draftMode": false,
"nodes": {
"bc17252b-811e-49d7-be3e-b7c538df9d30": {
"id": "bc17252b-811e-49d7-be3e-b7c538df9d30",
"type": "input",
"parentId": null,
"source": {
"type": "image",
"image_url": "https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg"
},
"createdAt": 1765756773647,
"title": "Cows Grazing in Indoor Pasture",
"caption": "The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. "
},
"82f6b488-8afe-4311-9022-80ad5789ad92": {
"id": "82f6b488-8afe-4311-9022-80ad5789ad92",
"type": "pano",
"parentId": "bc17252b-811e-49d7-be3e-b7c538df9d30",
"source": {
"type": "generate_world",
"world_id": "d60cfa21-5506-43de-9a9c-0707fc17a5ec",
"status": "pending"
},
"createdAt": 1765756773647
},
"f08ec501-601c-47c6-a104-402d1820b8f0": {
"id": "f08ec501-601c-47c6-a104-402d1820b8f0",
"type": "world",
"parentId": "82f6b488-8afe-4311-9022-80ad5789ad92",
"source": {
"type": "generate_world",
"world_id": "d60cfa21-5506-43de-9a9c-0707fc17a5ec",
"posed_cubemaps_url": "",
"minimap_url": "",
"minimap_metadata": "",
"status": "pending"
},
"createdAt": 1765756773647
}
}
}
}
=====================
IDs/UUIDs/Filenames thus far:
- CArJJ2PQFFd8l2Rf8uptZhl86d33 - returned in first request; "owner ID"
- 79795b32-e44d-4333-bac1-05b2c9a3ea12 - returned in first request; "run ID"
- uploaded_image_d008d227-9564-46f1-ba4e-9fcede900901.jpeg - sent in second request, `display_name` - `"upload filename"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf - returned in second request, "upload id"
- 13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg - returned in third request, "upload id" with asset.jpg filename suffix
- https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg - returned in fifth request, `object_uri` of upload
- bc17252b-811e-49d7-be3e-b7c538df9d30 - returned in 6th request, "type=input id source type image", used as parent of "pano"
- 82f6b488-8afe-4311-9022-80ad5789ad92 - returned in 6th request, "type=pano id", used as parent of "world"
- f08ec501-601c-47c6-a104-402d1820b8f0 - returned in 6th request, "type=world id"
- d60cfa21-5506-43de-9a9c-0707fc17a5ec - returned in 8th request, "world id"
- https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/c3edfcf7_image_prompt_sanitized.png - returned in 8th request, "image prompt"
@@ -0,0 +1,49 @@
curl 'https://identitytoolkit.googleapis.com/v1/accounts:lookup?key=AIzaSyAA88yObUN-0pnXAxcgOrT2exZxFWLW1BI' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'content-type: application/json' \
-H 'origin: https://marble.worldlabs.ai' \
-H 'priority: u=1, i' \
-H 'sec-ch-ua: "Google Chrome";v="143", "Chromium";v="143", "Not A(Brand";v="24"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36' \
-H 'x-browser-channel: stable' \
-H 'x-browser-copyright: Copyright 2025 Google LLC. All Rights reserved.' \
-H 'x-browser-validation: AUXUCdutEJ+6gl6bYtz7E2kgIT4=' \
-H 'x-browser-year: 2025' \
-H 'x-client-data: CIe2yQEIorbJAQipncoBCKSCywEIlqHLAQiGoM0BCJSkzwE=' \
-H 'x-client-version: Chrome/JsCore/12.6.0/FirebaseCore-web' \
--data-raw '{"idToken":"eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk4OGQ1YTM3OWI3OGJkZjFlNTBhNDA5MTEzZjJiMGM3NWU0NTJlNDciLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vd2x0LXRyYWluaW5nLWdzYyIsImF1ZCI6IndsdC10cmFpbmluZy1nc2MiLCJhdXRoX3RpbWUiOjE3NjYwMDI5MjMsInVzZXJfaWQiOiJDQXJKSjJQUUZGZDhsMlJmOHVwdFpobDg2ZDMzIiwic3ViIjoiQ0FySkoyUFFGRmQ4bDJSZjh1cHRaaGw4NmQzMyIsImlhdCI6MTc2NjEyODA4NiwiZXhwIjoxNzY2MTMxNjg2LCJlbWFpbCI6InNhYmFsaWQyMzRAY3JzYXkuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImZpcmViYXNlIjp7ImlkZW50aXRpZXMiOnsiZW1haWwiOlsic2FiYWxpZDIzNEBjcnNheS5jb20iXX0sInNpZ25faW5fcHJvdmlkZXIiOiJwYXNzd29yZCJ9fQ.T1V-C-5dyNorLKXIE4aqi76RvwU5Fdw-YH0YOU_TQb7nNgKy1HsmQswssBFHw4KP2DKjvbZif4TIFJQTnsYAfCh1VvOVtHFUY-kGTRSU5wLPUbH_1EiOLgletGP6YeM3MiZq8fWG1VSWe6xmogmTfhSf3NcRW46L6GeJLXmJXPrHl6Hxszvr1aSmxm1Ee412bCN2hhgGcmTYm7-jaeT9MdnKddu-wv_5Bd6Eb5kCXZHvZIqgaWR_5ACMJq7zyefrCZUSISh3jTycRsVaFKvv09Mm_rJHFQbV2FXCNDx4S80nR7TyUd8SDehKiGsPRgUq-mGvCPBabk0dpAn73LAFrA"}'
Response:
{
"kind": "identitytoolkit#GetAccountInfoResponse",
"users": [
{
"localId": "CArJJ2PQFFd8l2Rf8uptZhl86d33",
"email": "sabalid234@crsay.com",
"passwordHash": "UkVEQUNURUQ=",
"emailVerified": true,
"passwordUpdatedAt": 1765756496440,
"providerUserInfo": [
{
"providerId": "password",
"federatedId": "sabalid234@crsay.com",
"email": "sabalid234@crsay.com",
"rawId": "sabalid234@crsay.com"
}
],
"validSince": "1765756496",
"lastLoginAt": "1766098175534",
"createdAt": "1765756496440",
"lastRefreshAt": "2025-12-19T07:08:06.869541Z"
}
]
}
@@ -0,0 +1,40 @@
https://securetoken.googleapis.com/v1/token?key={REFRESH_TOKEN}
curl 'https://securetoken.googleapis.com/v1/token?key=AIzaSyAA88yObUN-0pnXAxcgOrT2exZxFWLW1BI' \
--compressed \
-X POST \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
-H 'Referer: https://marble.worldlabs.ai/' \
-H 'X-Client-Version: Firefox/JsCore/12.6.0/FirebaseCore-web' \
-H 'X-Firebase-Client: eyJ2ZXJzaW9uIjoyLCJoZWFydGJlYXRzIjpbeyJhZ2VudCI6ImZpcmUtY29yZS8wLjE0LjYgZmlyZS1jb3JlLWVzbTIwMjAvMC4xNC42IGZpcmUtanMvIGZpcmUtanMtYWxsLWFwcC8xMi42LjAgZmlyZS1hdXRoLzEuMTEuMSBmaXJlLWF1dGgtZXNtMjAyMC8xLjExLjEiLCJkYXRlcyI6WyIyMDI1LTEyLTE5Il19XX0' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Origin: https://marble.worldlabs.ai' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=4' \
-H 'TE: trailers' \
--data-raw 'grant_type=refresh_token&refresh_token=AMf-vByUgA0J9S93vULECe-sD50cbR85AFVYF60gKAmLFF1MBYwXlKRJCsv7z3oSpLtP0ApyOU5fAl52qHWM2U0yKgEu5gQ5UCUDt5SEG4UBRHWvHEmLLcu-Zl04Fq4ljocSEO3qJzuX1wyshmptZxlDPRkjdLYgyn-Kp03woI2yRPKLuQF5hQtABHabsNUh9Zhs129sgxuUlOuw4zsFI4L8UdE3bEuF3k6Mic7KlE3440YwyQ8Qtmk9zHtXIx2ob56N-1WTGSqwMUuQ1mX4OOvLve9bw2zDW3UzchomTWkh732886RPrP-DNRkPbO3FejUEMxuYQFWYX3EEeIEdfNGXFNGPL1dNniSXlSaKadpX699Ishjviv-x9o-pPQa3zoAj3NzWLyd8mn5rDBh9qAO_iDETaeo01Sjhb4mGYfAWZ-g4S6nW778'
--data-raw '
grant_type=refresh_token
&refresh_token=AMf-vByUgA0J9S93vULECe-sD50cbR85AFVYF60gKAmLFF1MBYwXlKRJCsv7z3oSpLtP0ApyOU5fAl52qHWM2U0yKgEu5gQ5UCUDt5SEG4UBRHWvHEmLLcu-Zl04Fq4ljocSEO3qJzuX1wyshmptZxlDPRkjdLYgyn-Kp03woI2yRPKLuQF5hQtABHabsNUh9Zhs129sgxuUlOuw4zsFI4L8UdE3bEuF3k6Mic7KlE3440YwyQ8Qtmk9zHtXIx2ob56N-1WTGSqwMUuQ1mX4OOvLve9bw2zDW3UzchomTWkh732886RPrP-DNRkPbO3FejUEMxuYQFWYX3EEeIEdfNGXFNGPL1dNniSXlSaKadpX699Ishjviv-x9o-pPQa3zoAj3NzWLyd8mn5rDBh9qAO_iDETaeo01Sjhb4mGYfAWZ-g4S6nW778
Response:
{
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk4OGQ1YTM3OWI3OGJkZjFlNTBhNDA5MTEzZjJiMGM3NWU0NTJlNDciLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiQnJhbmRvbiBUaG9tYXMiLCJwaWN0dXJlIjoiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EvQUNnOG9jS0lucl8yWGJ2Z1VERUxNOEpCTGdfa2tKbVpxWl9WcTlzZkI2bVR4VmQzc1NJRk4tST1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2MDE3Nzk3OCwidXNlcl9pZCI6IjA1c0dhaHRySWdVMjVMaXR5NjhoZjRpMmV4SjIiLCJzdWIiOiIwNXNHYWh0cklnVTI1TGl0eTY4aGY0aTJleEoyIiwiaWF0IjoxNzY2MTI2ODg4LCJleHAiOjE3NjYxMzA0ODgsImVtYWlsIjoiYnRAYnJhbmQuaW8iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjEwNjEwODI2NzgzNTYyOTEwMTc1OSJdLCJlbWFpbCI6WyJidEBicmFuZC5pbyJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.YLXZHg0rzMzyhhyJsO3DSMhU8GjnxtQtg1GiDwaxZjuybmabqOcR_b4C2lE2XwESg_dDYnIkmdas9wsHshy2bGPCAAtrinQpxTHWhIDxy0bsF8yW0BCOszwVseiTkXd6vveaGYH06EvH-nM4Q5AB_oKbsgRyMEbXhepvX7SlrmeaXxqldCLRalDj6gcEIY_TSwMmjnZ6-sFMPe92YjLY1ITPRx7S3YyWNwBG6mVpgoHcHudNAJ4TFxborZlhC1zpF0NDgtIhN5ITg0I1P0A-JTaBTJHukQwCPKhifFRA1kfcxzbAoZyPiPw2DdgXpDDnNzXUYgnaOOVyGs96Tx8hOQ",
"expires_in": "3600",
"token_type": "Bearer",
"refresh_token": "AMf-vByUgA0J9S93vULECe-sD50cbR85AFVYF60gKAmLFF1MBYwXlKRJCsv7z3oSpLtP0ApyOU5fAl52qHWM2U0yKgEu5gQ5UCUDt5SEG4UBRHWvHEmLLcu-Zl04Fq4ljocSEO3qJzuX1wyshmptZxlDPRkjdLYgyn-Kp03woI2yRPKLuQF5hQtABHabsNUh9Zhs129sgxuUlOuw4zsFI4L8UdE3bEuF3k6Mic7KlE3440YwyQ8Qtmk9zHtXIx2ob56N-1WTGSqwMUuQ1mX4OOvLve9bw2zDW3UzchomTWkh732886RPrP-DNRkPbO3FejUEMxuYQFWYX3EEeIEdfNGXFNGPL1dNniSXlSaKadpX699Ishjviv-x9o-pPQa3zoAj3NzWLyd8mn5rDBh9qAO_iDETaeo01Sjhb4mGYfAWZ-g4S6nW778",
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk4OGQ1YTM3OWI3OGJkZjFlNTBhNDA5MTEzZjJiMGM3NWU0NTJlNDciLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiQnJhbmRvbiBUaG9tYXMiLCJwaWN0dXJlIjoiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EvQUNnOG9jS0lucl8yWGJ2Z1VERUxNOEpCTGdfa2tKbVpxWl9WcTlzZkI2bVR4VmQzc1NJRk4tST1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2MDE3Nzk3OCwidXNlcl9pZCI6IjA1c0dhaHRySWdVMjVMaXR5NjhoZjRpMmV4SjIiLCJzdWIiOiIwNXNHYWh0cklnVTI1TGl0eTY4aGY0aTJleEoyIiwiaWF0IjoxNzY2MTI2ODg4LCJleHAiOjE3NjYxMzA0ODgsImVtYWlsIjoiYnRAYnJhbmQuaW8iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjEwNjEwODI2NzgzNTYyOTEwMTc1OSJdLCJlbWFpbCI6WyJidEBicmFuZC5pbyJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.YLXZHg0rzMzyhhyJsO3DSMhU8GjnxtQtg1GiDwaxZjuybmabqOcR_b4C2lE2XwESg_dDYnIkmdas9wsHshy2bGPCAAtrinQpxTHWhIDxy0bsF8yW0BCOszwVseiTkXd6vveaGYH06EvH-nM4Q5AB_oKbsgRyMEbXhepvX7SlrmeaXxqldCLRalDj6gcEIY_TSwMmjnZ6-sFMPe92YjLY1ITPRx7S3YyWNwBG6mVpgoHcHudNAJ4TFxborZlhC1zpF0NDgtIhN5ITg0I1P0A-JTaBTJHukQwCPKhifFRA1kfcxzbAoZyPiPw2DdgXpDDnNzXUYgnaOOVyGs96Tx8hOQ",
"user_id": "05sGahtrIgU25Lity68hf4i2exJ2",
"project_id": "661553802735"
}
@@ -0,0 +1,154 @@
use crate::api::api_types::upload_mime_type::UploadMimeType;
use crate::api::common::common_header_values::{ORIGIN_VALUE, REFERER_VALUE};
use crate::credentials::world_labs_bearer_token::WorldLabsBearerToken;
use crate::credentials::world_labs_cookies::WorldLabsCookies;
use crate::credentials::worldlabs_refresh_token::WorldLabsRefreshToken;
use crate::error::world_labs_client_error::WorldLabsClientError;
use crate::error::world_labs_error::WorldLabsError;
use crate::error::world_labs_generic_api_error::WorldLabsGenericApiError;
use crate::error::world_labs_specific_api_error::WorldLabsSpecificApiError;
use http_headers::names::{PRIORITY, SEC_FETCH_DEST, SEC_FETCH_MODE, SEC_FETCH_SITE, SEC_GPC};
use http_headers::values::accept::ACCEPT_ALL;
use http_headers::values::accept_encoding::ACCEPT_ENCODING_GZIP_ETC;
use http_headers::values::accept_language::ACCEPT_LANGUAGE_EN_US;
use http_headers::values::cache_control::CACHE_CONTROL_NO_CACHE;
use http_headers::values::connection::CONNECTION_KEEP_ALIVE;
use http_headers::values::pragma::PRAGMA_NO_CACHE;
use http_headers::values::priority::{PRIORITY_4, PRIORITY_6};
use http_headers::values::sec::{SEC_FETCH_DEST_EMPTY, SEC_FETCH_MODE_CORS, SEC_FETCH_SITE_CROSS_SITE};
use http_headers::values::te::TE_TRAILERS;
use log::{debug, error};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::Duration;
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_LENGTH, CONTENT_TYPE, ORIGIN, PRAGMA, REFERER, TE};
use wreq::multipart::Form;
use wreq::Client;
use wreq_util::Emulation;
/// NB: key is the public API key for WorldLabs
/// https://docs.cloud.google.com/identity-platform/docs/use-rest-api
const URL : &str = "https://securetoken.googleapis.com/v1/token?key=AIzaSyAA88yObUN-0pnXAxcgOrT2exZxFWLW1BI";
pub struct GoogleRefreshTokenArgs<'a> {
pub refresh_token: &'a WorldLabsRefreshToken,
pub request_timeout: Option<Duration>,
}
pub struct GoogleRefreshTokenResponse {
pub bearer_token: WorldLabsBearerToken,
pub refresh_token: WorldLabsRefreshToken,
}
/// Refresh Access Token for WorldLabs using Google.
pub async fn google_refresh_token(args: GoogleRefreshTokenArgs<'_>) -> Result<GoogleRefreshTokenResponse, WorldLabsError> {
let client = Client::builder()
.emulation(Emulation::Firefox143)
.build()
.map_err(|err| WorldLabsClientError::WreqClientError(err))?;
debug!("Requesting URL: {}", URL);
let mut request_builder = client.post(URL)
.header(ACCEPT, ACCEPT_ALL)
.header(ACCEPT_LANGUAGE, ACCEPT_LANGUAGE_EN_US)
.header(ACCEPT_ENCODING, ACCEPT_ENCODING_GZIP_ETC)
.header(REFERER, REFERER_VALUE)
.header(CONNECTION, CONNECTION_KEEP_ALIVE)
.header(SEC_FETCH_DEST, SEC_FETCH_DEST_EMPTY)
.header(SEC_FETCH_MODE, SEC_FETCH_MODE_CORS)
.header(SEC_FETCH_SITE, SEC_FETCH_SITE_CROSS_SITE)
.header(PRIORITY, PRIORITY_4)
.header(TE, TE_TRAILERS);
let mut form = HashMap::new();
form.insert("grant_type", "refresh_token".to_string());
form.insert("refresh_token", args.refresh_token.to_raw_string());
if let Some(timeout) = args.request_timeout {
request_builder = request_builder.timeout(timeout);
}
let http_request = request_builder
.form(&form)
.build()
.map_err(|err| {
error!("Error building request: {:?}", err);
WorldLabsClientError::WreqClientError(err)
})?;
let response = client.execute(http_request)
.await
.map_err(|err| {
error!("Error during request execution: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
let status = response.status();
let response_body = response.text()
.await
.map_err(|err| {
error!("Error reading response body: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
if !status.is_success() {
error!("Request returned an error (code {}) : {:?}", status.as_u16(), response_body);
if response_body.contains("SignatureDoesNotMatch") || response_body.contains("does not match the signature") {
return Err(WorldLabsSpecificApiError::GoogleUploadSignatureDoesNotMatch.into());
} else {
return Err(WorldLabsGenericApiError::GoogleUploadFailed { status_code: status, body: response_body }.into());
}
}
debug!("Response body (200): {}", response_body);
let response : RawResponse = serde_json::from_str(&response_body)
.map_err(|err| WorldLabsGenericApiError::SerdeResponseParseErrorWithBody(err, response_body.to_string()))?;
let bearer_token = WorldLabsBearerToken::new(response.access_token);
let refresh_token = WorldLabsRefreshToken::new(response.refresh_token);
Ok(GoogleRefreshTokenResponse {
bearer_token,
refresh_token,
})
}
#[derive(Deserialize)]
struct RawResponse {
pub access_token: String,
pub refresh_token: String,
// eg. "3600"
pub expires_in: Option<String>,
pub id_token: Option<String>,
pub user_id: Option<String>,
}
#[cfg(test)]
mod tests {
use crate::api::requests::google_refresh_token::google_refresh_token::{google_refresh_token, GoogleRefreshTokenArgs};
use crate::credentials::worldlabs_refresh_token::WorldLabsRefreshToken;
use crate::test_utils::setup_test_logging::setup_test_logging;
use errors::AnyhowResult;
use log::LevelFilter;
#[tokio::test]
#[ignore] // Client side tests only
async fn test_requests() -> AnyhowResult<()> {
setup_test_logging(LevelFilter::Debug);
let refresh_token = "AMf-vByUgA0J9S93vULECe-sD50cbR85AFVYF60gKAmLFF1MBYwXlKRJCsv7z3oSpLtP0ApyOU5fAl52qHWM2U0yKgEu5gQ5UCUDt5SEG4UBRHWvHEmLLcu-Zl04Fq4ljocSEO3qJzuX1wyshmptZxlDPRkjdLYgyn-Kp03woI2yRPKLuQF5hQtABHabsNUh9Zhs129sgxuUlOuw4zsFI4L8UdE3bEuF3k6Mic7KlE3440YwyQ8Qtmk9zHtXIx2ob56N-1WTGSqwMUuQ1mX4OOvLve9bw2zDW3UzchomTWkh732886RPrP-DNRkPbO3FejUEMxuYQFWYX3EEeIEdfNGXFNGPL1dNniSXlSaKadpX699Ishjviv-x9o-pPQa3zoAj3NzWLyd8mn5rDBh9qAO_iDETaeo01Sjhb4mGYfAWZ-g4S6nW778";
let refresh_token = WorldLabsRefreshToken::new(refresh_token.to_string());
let result = google_refresh_token(GoogleRefreshTokenArgs {
refresh_token: &refresh_token,
request_timeout: None,
}).await?;
Ok(())
}
}
@@ -0,0 +1 @@
pub mod google_refresh_token;
@@ -0,0 +1,91 @@
use crate::api::api_types::upload_mime_type::UploadMimeType;
use crate::api::common::common_header_values::{ORIGIN_VALUE, REFERER_VALUE};
use crate::credentials::world_labs_bearer_token::WorldLabsBearerToken;
use crate::credentials::world_labs_cookies::WorldLabsCookies;
use crate::error::world_labs_client_error::WorldLabsClientError;
use crate::error::world_labs_error::WorldLabsError;
use crate::error::world_labs_generic_api_error::WorldLabsGenericApiError;
use crate::error::world_labs_specific_api_error::WorldLabsSpecificApiError;
use http_headers::names::{PRIORITY, SEC_FETCH_DEST, SEC_FETCH_MODE, SEC_FETCH_SITE, SEC_GPC};
use http_headers::values::accept::ACCEPT_ALL;
use http_headers::values::cache_control::CACHE_CONTROL_NO_CACHE;
use http_headers::values::connection::CONNECTION_KEEP_ALIVE;
use http_headers::values::pragma::PRAGMA_NO_CACHE;
use http_headers::values::priority::PRIORITY_6;
use http_headers::values::sec::{SEC_FETCH_DEST_EMPTY, SEC_FETCH_MODE_CORS, SEC_FETCH_SITE_CROSS_SITE};
use http_headers::values::te::TE_TRAILERS;
use log::{debug, error};
use serde::Serialize;
use std::time::Duration;
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_LENGTH, CONTENT_TYPE, ORIGIN, PRAGMA, REFERER, TE};
use wreq::Client;
use wreq_util::Emulation;
pub struct GoogleUploadImageArgs<'a> {
pub upload_url: &'a str,
pub upload_mime_type: UploadMimeType,
pub file_bytes: Vec<u8>,
pub request_timeout: Option<Duration>,
}
/// Marble Image-to-World
/// Upload the binary to GCP using the signed URL
/// Request #4 (of ~10)
pub async fn google_upload_image(args: GoogleUploadImageArgs<'_>) -> Result<(), WorldLabsError> {
let client = Client::builder()
.emulation(Emulation::Firefox143)
.build()
.map_err(|err| WorldLabsClientError::WreqClientError(err))?;
let content_type = args.upload_mime_type.content_type();
debug!("Requesting URL: {}", args.upload_url);
let mut request_builder = client.put(args.upload_url)
.header(CONTENT_TYPE, content_type)
.header("x-goog-content-length-range", "0,1048576000");
if let Some(timeout) = args.request_timeout {
request_builder = request_builder.timeout(timeout);
}
let http_request = request_builder
.body(args.file_bytes)
.build()
.map_err(|err| {
error!("Error building request: {:?}", err);
WorldLabsClientError::WreqClientError(err)
})?;
let response = client.execute(http_request)
.await
.map_err(|err| {
error!("Error during request execution: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
let status = response.status();
let response_body = response.text()
.await
.map_err(|err| {
error!("Error reading response body: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
if !status.is_success() {
error!("Request returned an error (code {}) : {:?}", status.as_u16(), response_body);
if response_body.contains("SignatureDoesNotMatch") || response_body.contains("does not match the signature") {
return Err(WorldLabsSpecificApiError::GoogleUploadSignatureDoesNotMatch.into());
} else {
return Err(WorldLabsGenericApiError::GoogleUploadFailed { status_code: status, body: response_body }.into());
}
}
Ok(())
}
#[cfg(test)]
mod tests {
}
@@ -0,0 +1 @@
pub mod google_upload_image;
@@ -0,0 +1,5 @@
pub mod google_upload;
pub mod objects;
pub mod recaption;
pub mod worlds;
pub mod google_refresh_token;
@@ -0,0 +1,144 @@
use crate::api::api_types::run_object_id::RunObjectId;
use crate::api::api_types::upload_object_id::UploadObjectId;
use crate::api::api_types::upload_mime_type::UploadMimeType;
use crate::api::common::common_header_values::{ORIGIN_VALUE, REFERER_VALUE};
use crate::credentials::world_labs_bearer_token::WorldLabsBearerToken;
use crate::credentials::world_labs_cookies::WorldLabsCookies;
use crate::error::world_labs_client_error::WorldLabsClientError;
use crate::error::world_labs_error::WorldLabsError;
use crate::error::world_labs_generic_api_error::WorldLabsGenericApiError;
use chrono::Utc;
use http_headers::names::{PRIORITY, SEC_FETCH_DEST, SEC_FETCH_MODE, SEC_FETCH_SITE, SEC_GPC};
use http_headers::values::accept::ACCEPT_ALL;
use http_headers::values::cache_control::CACHE_CONTROL_NO_CACHE;
use http_headers::values::connection::CONNECTION_KEEP_ALIVE;
use http_headers::values::content_type::CONTENT_TYPE_APPLICATION_JSON;
use http_headers::values::pragma::PRAGMA_NO_CACHE;
use http_headers::values::priority::PRIORITY_4;
use http_headers::values::sec::{SEC_FETCH_DEST_EMPTY, SEC_FETCH_MODE_CORS, SEC_FETCH_SITE_CROSS_SITE};
use http_headers::values::te::TE_TRAILERS;
use log::{debug, error, info};
use serde::{Deserialize, Serialize};
use std::time::Duration;
use uuid::Uuid;
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_LENGTH, CONTENT_TYPE, ORIGIN, PRAGMA, REFERER, TE};
use wreq::Client;
use wreq_util::Emulation;
const BASE_URL : &str = "https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects";
fn get_url(upload_id: &UploadObjectId) -> String {
format!("{}/{}:upload", BASE_URL, upload_id.0)
}
pub struct BeginObjectImageUploadArgs<'a> {
pub cookies: &'a WorldLabsCookies,
pub bearer_token: &'a WorldLabsBearerToken,
pub upload_mime_type: UploadMimeType,
pub upload_id: &'a UploadObjectId,
pub request_timeout: Option<Duration>,
}
pub struct BeginObjectImageUploadResponse {
pub upload_url: String,
}
/// Marble Image-to-World
/// This request follows object attachment and signals upload. It returns the upload URL.
/// Request #3 (of ~10)
pub async fn begin_object_image_upload(args: BeginObjectImageUploadArgs<'_>) -> Result<BeginObjectImageUploadResponse, WorldLabsError> {
let client = Client::builder()
.emulation(Emulation::Firefox143)
.build()
.map_err(|err| WorldLabsClientError::WreqClientError(err))?;
let url = get_url(args.upload_id);
debug!("Requesting URL: {}", url);
let mut request_builder = client.post(url)
.header(ACCEPT, ACCEPT_ALL)
.header(ACCEPT_LANGUAGE, "en-US,en;q=0.5")
.header(ACCEPT_ENCODING, "gzip, deflate, br, zstd")
.header(REFERER, REFERER_VALUE)
.header(CONTENT_TYPE, CONTENT_TYPE_APPLICATION_JSON)
.header(AUTHORIZATION, args.bearer_token.to_bearer_token_header_string())
.header(ORIGIN, ORIGIN_VALUE)
.header(SEC_GPC, "1")
.header(CONNECTION, CONNECTION_KEEP_ALIVE)
.header(SEC_FETCH_DEST, SEC_FETCH_DEST_EMPTY)
.header(SEC_FETCH_MODE, SEC_FETCH_MODE_CORS)
.header(SEC_FETCH_SITE, SEC_FETCH_SITE_CROSS_SITE)
.header(PRIORITY, PRIORITY_4)
.header(PRAGMA, PRAGMA_NO_CACHE)
.header(CACHE_CONTROL, CACHE_CONTROL_NO_CACHE)
.header(CONTENT_LENGTH, 0)
.header(TE, TE_TRAILERS);
if let Some(timeout) = args.request_timeout {
request_builder = request_builder.timeout(timeout);
}
let http_request = request_builder
.build()
.map_err(|err| {
error!("Error building request: {:?}", err);
WorldLabsClientError::WreqClientError(err)
})?;
let response = client.execute(http_request)
.await
.map_err(|err| {
error!("Error during request execution: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
let status = response.status();
let response_body = response.text()
.await
.map_err(|err| {
error!("Error reading response body: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
// TODO: Handle errors (Cloudflare, Grok, etc.)
if !status.is_success() {
error!("Request returned an error (code {}) : {:?}", status.as_u16(), response_body);
//return Err(classify_general_http_status_code_and_body(status, response_body));
return Err(WorldLabsGenericApiError::UncategorizedBadResponseWithStatusAndBody { status_code: status, body: response_body}.into())
}
debug!("Response body (200) (ready for Google upload): {}", response_body);
let response : RawResponse = serde_json::from_str(&response_body)
.map_err(|err| WorldLabsGenericApiError::SerdeResponseParseErrorWithBody(err, response_body.to_string()))?;
info!("Curl command: {}", response.curl_example);
Ok(BeginObjectImageUploadResponse {
upload_url: response.upload_url,
})
}
#[derive(Deserialize)]
struct RawResponse {
/// eg. "https://storage.googleapis.com/wlt-training-gsc-marble-assets-prod/temp/objects/{...}",
pub upload_url: String,
/// Just for debugging, the server reports a test cURL command
pub curl_example: String,
}
#[cfg(test)]
mod tests {
use crate::api::api_types::upload_object_id::UploadObjectId;
use crate::api::requests::objects::begin_object_image_upload::get_url;
#[test]
fn test_get_url() {
let upload_id = UploadObjectId("foo-bar-baz-bin".to_string());
let expected = "https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/foo-bar-baz-bin:upload";
assert_eq!(get_url(&upload_id), expected);
}
}
@@ -0,0 +1,121 @@
use crate::api::api_types::run_object::RunObject;
use crate::api::api_types::run_object_id::RunObjectId;
use crate::api::common::common_header_values::{ORIGIN_VALUE, REFERER_VALUE};
use crate::credentials::world_labs_bearer_token::WorldLabsBearerToken;
use crate::credentials::world_labs_cookies::WorldLabsCookies;
use crate::error::world_labs_client_error::WorldLabsClientError;
use crate::error::world_labs_error::WorldLabsError;
use crate::error::world_labs_generic_api_error::WorldLabsGenericApiError;
use crate::error::world_labs_specific_api_error::WorldLabsSpecificApiError;
use chrono::Utc;
use http_headers::names::{PRIORITY, SEC_FETCH_DEST, SEC_FETCH_MODE, SEC_FETCH_SITE, SEC_GPC};
use http_headers::values::accept::ACCEPT_ALL;
use http_headers::values::cache_control::CACHE_CONTROL_NO_CACHE;
use http_headers::values::connection::CONNECTION_KEEP_ALIVE;
use http_headers::values::content_type::CONTENT_TYPE_APPLICATION_JSON;
use http_headers::values::pragma::PRAGMA_NO_CACHE;
use http_headers::values::priority::PRIORITY_HIGHEST;
use http_headers::values::sec::{SEC_FETCH_DEST_EMPTY, SEC_FETCH_MODE_CORS, SEC_FETCH_SITE_CROSS_SITE};
use http_headers::values::te::TE_TRAILERS;
use log::{debug, error};
use serde::{Deserialize, Serialize};
use std::time::Duration;
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_TYPE, ORIGIN, PRAGMA, REFERER, TE};
use wreq::Client;
use wreq_util::Emulation;
const URL : &str = "https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects";
pub struct CreateRunObjectArgs<'a> {
pub cookies: &'a WorldLabsCookies,
pub bearer_token: &'a WorldLabsBearerToken,
pub request_timeout: Option<Duration>,
}
pub struct CreateRunObjectResponse {
pub id: RunObjectId,
pub run_object: RunObject,
}
/// Marble Image-to-World
/// This request starts the process: it initializes a new world object inference and returns the object id.
/// Request #1 (of ~10)
pub async fn create_run_object(args: CreateRunObjectArgs<'_>) -> Result<CreateRunObjectResponse, WorldLabsError> {
let client = Client::builder()
.emulation(Emulation::Firefox143)
.build()
.map_err(|err| WorldLabsClientError::WreqClientError(err))?;
debug!("Requesting URL: {}", URL);
let mut request_builder = client.post(URL)
.header(ACCEPT, ACCEPT_ALL)
.header(ACCEPT_LANGUAGE, "en-US,en;q=0.5")
.header(ACCEPT_ENCODING, "gzip, deflate, br, zstd")
.header(REFERER, REFERER_VALUE)
.header(CONTENT_TYPE, CONTENT_TYPE_APPLICATION_JSON)
.header(AUTHORIZATION, args.bearer_token.to_bearer_token_header_string())
.header(ORIGIN, ORIGIN_VALUE)
.header(SEC_GPC, "1")
.header(CONNECTION, CONNECTION_KEEP_ALIVE)
.header(SEC_FETCH_DEST, SEC_FETCH_DEST_EMPTY)
.header(SEC_FETCH_MODE, SEC_FETCH_MODE_CORS)
.header(SEC_FETCH_SITE, SEC_FETCH_SITE_CROSS_SITE)
.header(PRIORITY, PRIORITY_HIGHEST)
.header(PRAGMA, PRAGMA_NO_CACHE)
.header(CACHE_CONTROL, CACHE_CONTROL_NO_CACHE)
.header(TE, TE_TRAILERS);
if let Some(timeout) = args.request_timeout {
request_builder = request_builder.timeout(timeout);
}
let new_run_object = RunObject::default();
let http_request = request_builder.json(&new_run_object)
.build()
.map_err(|err| {
error!("Error building request: {:?}", err);
WorldLabsClientError::WreqClientError(err)
})?;
let response = client.execute(http_request)
.await
.map_err(|err| {
error!("Error during request execution: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
let status = response.status();
let response_body = response.text()
.await
.map_err(|err| {
error!("Error reading response body: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
// TODO: Handle errors (Cloudflare, Grok, etc.)
if !status.is_success() {
error!("Request returned an error (code {}) : {:?}", status.as_u16(), response_body);
//return Err(classify_general_http_status_code_and_body(status, response_body));
return Err(WorldLabsGenericApiError::UncategorizedBadResponseWithStatusAndBody { status_code: status, body: response_body}.into())
}
debug!("Response body (200): {}", response_body);
let response : RunObject = serde_json::from_str(&response_body)
.map_err(|err| WorldLabsGenericApiError::SerdeResponseParseErrorWithBody(err, response_body.to_string()))?;
let run_id = match &response.id {
Some(id) => RunObjectId(id.to_string()),
None => {
return Err(WorldLabsSpecificApiError::NoRunIdInResponse { response_body }.into())
}
};
Ok(CreateRunObjectResponse {
id: run_id,
run_object: response,
})
}
@@ -0,0 +1,149 @@
use crate::api::api_types::run_object_id::RunObjectId;
use crate::api::api_types::upload_object_id::UploadObjectId;
use crate::api::api_types::upload_mime_type::UploadMimeType;
use crate::api::common::common_header_values::{ORIGIN_VALUE, REFERER_VALUE};
use crate::credentials::world_labs_bearer_token::WorldLabsBearerToken;
use crate::credentials::world_labs_cookies::WorldLabsCookies;
use crate::error::world_labs_client_error::WorldLabsClientError;
use crate::error::world_labs_error::WorldLabsError;
use crate::error::world_labs_generic_api_error::WorldLabsGenericApiError;
use chrono::Utc;
use http_headers::names::{PRIORITY, SEC_FETCH_DEST, SEC_FETCH_MODE, SEC_FETCH_SITE, SEC_GPC};
use http_headers::values::accept::ACCEPT_ALL;
use http_headers::values::cache_control::CACHE_CONTROL_NO_CACHE;
use http_headers::values::connection::CONNECTION_KEEP_ALIVE;
use http_headers::values::content_type::CONTENT_TYPE_APPLICATION_JSON;
use http_headers::values::pragma::PRAGMA_NO_CACHE;
use http_headers::values::priority::PRIORITY_4;
use http_headers::values::sec::{SEC_FETCH_DEST_EMPTY, SEC_FETCH_MODE_CORS, SEC_FETCH_SITE_CROSS_SITE};
use http_headers::values::te::TE_TRAILERS;
use log::{debug, error, info};
use serde::{Deserialize, Serialize};
use std::time::Duration;
use uuid::Uuid;
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_TYPE, ORIGIN, PRAGMA, REFERER, TE};
use wreq::Client;
use wreq_util::Emulation;
const URL : &str = "https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects";
pub struct CreateUploadObjectArgs<'a> {
pub cookies: &'a WorldLabsCookies,
pub bearer_token: &'a WorldLabsBearerToken,
pub upload_mime_type: UploadMimeType,
pub request_timeout: Option<Duration>,
}
pub struct CreateUploadObjectResponse {
pub id: UploadObjectId,
}
/// Marble Image-to-World
/// This request follows object initialization and prepares for image upload.
/// Request #2 (of ~10)
pub async fn create_upload_object(args: CreateUploadObjectArgs<'_>) -> Result<CreateUploadObjectResponse, WorldLabsError> {
let client = Client::builder()
.emulation(Emulation::Firefox143)
.build()
.map_err(|err| WorldLabsClientError::WreqClientError(err))?;
debug!("Requesting URL: {}", URL);
let mut request_builder = client.post(URL)
.header(ACCEPT, ACCEPT_ALL)
.header(ACCEPT_LANGUAGE, "en-US,en;q=0.5")
.header(ACCEPT_ENCODING, "gzip, deflate, br, zstd")
.header(REFERER, REFERER_VALUE)
.header(CONTENT_TYPE, CONTENT_TYPE_APPLICATION_JSON)
.header(AUTHORIZATION, args.bearer_token.to_bearer_token_header_string())
.header(ORIGIN, ORIGIN_VALUE)
.header(SEC_GPC, "1")
.header(CONNECTION, CONNECTION_KEEP_ALIVE)
.header(SEC_FETCH_DEST, SEC_FETCH_DEST_EMPTY)
.header(SEC_FETCH_MODE, SEC_FETCH_MODE_CORS)
.header(SEC_FETCH_SITE, SEC_FETCH_SITE_CROSS_SITE)
.header(PRIORITY, PRIORITY_4)
.header(PRAGMA, PRAGMA_NO_CACHE)
.header(CACHE_CONTROL, CACHE_CONTROL_NO_CACHE)
.header(TE, TE_TRAILERS);
if let Some(timeout) = args.request_timeout {
request_builder = request_builder.timeout(timeout);
}
let request_payload = RawRequest::for_mime_type(args.upload_mime_type);
let http_request = request_builder.json(&request_payload)
.build()
.map_err(|err| {
error!("Error building request: {:?}", err);
WorldLabsClientError::WreqClientError(err)
})?;
let response = client.execute(http_request)
.await
.map_err(|err| {
error!("Error during request execution: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
let status = response.status();
let response_body = response.text()
.await
.map_err(|err| {
error!("Error reading response body: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
// TODO: Handle errors (Cloudflare, Grok, etc.)
if !status.is_success() {
error!("Request returned an error (code {}) : {:?}", status.as_u16(), response_body);
//return Err(classify_general_http_status_code_and_body(status, response_body));
return Err(WorldLabsGenericApiError::UncategorizedBadResponseWithStatusAndBody { status_code: status, body: response_body}.into())
}
debug!("Response body (200): {}", response_body);
let response : RawResponse = serde_json::from_str(&response_body)
.map_err(|err| WorldLabsGenericApiError::SerdeResponseParseErrorWithBody(err, response_body.to_string()))?;
Ok(CreateUploadObjectResponse {
id: UploadObjectId(response.id),
})
}
#[derive(Serialize)]
struct RawRequest {
pub display_name: String,
pub mime_type: String,
}
impl RawRequest {
pub fn for_mime_type(mime_type: UploadMimeType) -> Self {
let uuid = Uuid::new_v4().to_string();
let extension = mime_type.extension_without_period();
let display_name = format!("uploaded_image_{uuid}.{extension}");
Self {
display_name,
mime_type: mime_type.content_type().to_string(),
}
}
}
#[derive(Deserialize)]
struct RawResponse {
pub id: String,
}
#[cfg(test)]
mod tests {
use crate::api::api_types::upload_mime_type::UploadMimeType;
use crate::api::requests::objects::create_upload_object::RawRequest;
#[test]
fn test_request() {
let request = RawRequest::for_mime_type(UploadMimeType::ImageJpeg);
assert_eq!(request.display_name, "uploaded_image_jpeg");
}
}
@@ -0,0 +1,169 @@
use crate::api::api_types::run_object_id::RunObjectId;
use crate::api::api_types::upload_object_id::UploadObjectId;
use crate::api::api_types::upload_mime_type::UploadMimeType;
use crate::api::common::common_header_values::{ORIGIN_VALUE, REFERER_VALUE};
use crate::credentials::world_labs_bearer_token::WorldLabsBearerToken;
use crate::credentials::world_labs_cookies::WorldLabsCookies;
use crate::error::world_labs_client_error::WorldLabsClientError;
use crate::error::world_labs_error::WorldLabsError;
use crate::error::world_labs_generic_api_error::WorldLabsGenericApiError;
use chrono::Utc;
use http_headers::names::{PRIORITY, SEC_FETCH_DEST, SEC_FETCH_MODE, SEC_FETCH_SITE, SEC_GPC};
use http_headers::values::accept::ACCEPT_ALL;
use http_headers::values::cache_control::CACHE_CONTROL_NO_CACHE;
use http_headers::values::connection::CONNECTION_KEEP_ALIVE;
use http_headers::values::content_type::CONTENT_TYPE_APPLICATION_JSON;
use http_headers::values::pragma::PRAGMA_NO_CACHE;
use http_headers::values::priority::PRIORITY_4;
use http_headers::values::sec::{SEC_FETCH_DEST_EMPTY, SEC_FETCH_MODE_CORS, SEC_FETCH_SITE_CROSS_SITE};
use http_headers::values::te::TE_TRAILERS;
use log::{debug, error};
use serde::{Deserialize, Serialize};
use std::time::Duration;
use uuid::Uuid;
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_LENGTH, CONTENT_TYPE, ORIGIN, PRAGMA, REFERER, TE};
use wreq::Client;
use wreq_util::Emulation;
const BASE_URL : &str = "https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects";
fn get_url(upload_id: &UploadObjectId) -> String {
format!("{}/{}:complete", BASE_URL, upload_id.0)
}
pub struct FinalizeObjectImageUploadArgs<'a> {
pub cookies: &'a WorldLabsCookies,
pub bearer_token: &'a WorldLabsBearerToken,
pub upload_id: &'a UploadObjectId,
pub request_timeout: Option<Duration>,
}
pub struct FinalizeObjectImageUploadResponse {
pub object_url: String,
pub updated_at: u64,
}
/// Marble Image-to-World
/// Mark the upload as complete.
/// Request #5 (of ~10)
pub async fn finalize_object_image_upload(args: FinalizeObjectImageUploadArgs<'_>) -> Result<FinalizeObjectImageUploadResponse, WorldLabsError> {
let client = Client::builder()
.emulation(Emulation::Firefox143)
.build()
.map_err(|err| WorldLabsClientError::WreqClientError(err))?;
let url = get_url(args.upload_id);
debug!("Requesting URL: {}", url);
let mut request_builder = client.post(url)
.header(ACCEPT, ACCEPT_ALL)
.header(ACCEPT_LANGUAGE, "en-US,en;q=0.5")
.header(ACCEPT_ENCODING, "gzip, deflate, br, zstd")
.header(REFERER, REFERER_VALUE)
.header(AUTHORIZATION, args.bearer_token.to_bearer_token_header_string())
.header(ORIGIN, ORIGIN_VALUE)
.header(SEC_GPC, "1")
.header(CONNECTION, CONNECTION_KEEP_ALIVE)
.header(SEC_FETCH_DEST, SEC_FETCH_DEST_EMPTY)
.header(SEC_FETCH_MODE, SEC_FETCH_MODE_CORS)
.header(SEC_FETCH_SITE, SEC_FETCH_SITE_CROSS_SITE)
.header(PRIORITY, PRIORITY_4)
.header(PRAGMA, PRAGMA_NO_CACHE)
.header(CACHE_CONTROL, CACHE_CONTROL_NO_CACHE)
.header(CONTENT_LENGTH, 0)
.header(TE, TE_TRAILERS);
if let Some(timeout) = args.request_timeout {
request_builder = request_builder.timeout(timeout);
}
let http_request = request_builder
.build()
.map_err(|err| {
error!("Error building request: {:?}", err);
WorldLabsClientError::WreqClientError(err)
})?;
let response = client.execute(http_request)
.await
.map_err(|err| {
error!("Error during request execution: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
let status = response.status();
let response_body = response.text()
.await
.map_err(|err| {
error!("Error reading response body: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
// TODO: Handle errors (Cloudflare, Grok, etc.)
if !status.is_success() {
error!("Request returned an error (code {}) : {:?}", status.as_u16(), response_body);
//return Err(classify_general_http_status_code_and_body(status, response_body));
return Err(WorldLabsGenericApiError::UncategorizedBadResponseWithStatusAndBody { status_code: status, body: response_body}.into())
}
debug!("Response body (200): {}", response_body);
let response : RawResponse = serde_json::from_str(&response_body)
.map_err(|err| WorldLabsGenericApiError::SerdeResponseParseErrorWithBody(err, response_body.to_string()))?;
Ok(FinalizeObjectImageUploadResponse {
object_url: response.object_uri,
updated_at: response.updated_at,
})
}
#[derive(Deserialize)]
struct RawResponse {
/// eg. "https://cdn.marble.worldlabs.ai/object/foo-bar-baz-bin/asset.jpg"
pub object_uri: String,
/// Seconds-resolution timestamp.
/// eg. `1765745771`
pub updated_at: u64,
}
#[cfg(test)]
mod tests {
use log::LevelFilter;
use crate::api::api_types::upload_object_id::UploadObjectId;
use crate::api::requests::objects::finalize_object_image_upload::{finalize_object_image_upload, get_url, FinalizeObjectImageUploadArgs};
use crate::test_utils::get_test_bearer_token::get_test_bearer_token;
use crate::test_utils::get_test_cookies::get_typed_test_cookies;
use crate::test_utils::setup_test_logging::setup_test_logging;
#[test]
fn test_get_url() {
let upload_id = UploadObjectId("foo-bar-baz-bin".to_string());
let expected = "https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects/foo-bar-baz-bin:complete";
assert_eq!(get_url(&upload_id), expected);
}
#[tokio::test]
#[ignore] // Client side tests only
async fn test_requests() {
setup_test_logging(LevelFilter::Debug);
let cookies = get_typed_test_cookies().unwrap();
let bearer_token = get_test_bearer_token().unwrap();
let upload_id = UploadObjectId("09d86ef8-edcd-42d9-9b95-8efd28be0bee".to_string());
let response = finalize_object_image_upload(FinalizeObjectImageUploadArgs {
cookies: &cookies,
bearer_token: &bearer_token,
upload_id: &upload_id,
request_timeout: None,
}).await.unwrap();
println!("Object URL: {}", response.object_url);
assert_eq!(1, 2);
}
}
@@ -0,0 +1,6 @@
pub mod create_upload_object;
pub mod begin_object_image_upload;
pub mod create_run_object;
pub mod finalize_object_image_upload;
pub mod update_run_object_with_upload;
pub mod update_run_object_with_world;
@@ -0,0 +1,437 @@
use crate::api::api_types::image_input_object_id::ImageInputObjectId;
use crate::api::api_types::pano_object_id::PanoObjectId;
use crate::api::api_types::run_object_id::RunObjectId;
use crate::api::api_types::upload_mime_type::UploadMimeType;
use crate::api::api_types::upload_object_id::UploadObjectId;
use crate::api::api_types::meta_world_object_id::MetaWorldObjectId;
use crate::api::common::common_header_values::{ORIGIN_VALUE, REFERER_VALUE};
use crate::api::utils::upload_id_to_image_url::upload_id_to_image_url;
use crate::credentials::world_labs_bearer_token::WorldLabsBearerToken;
use crate::credentials::world_labs_cookies::WorldLabsCookies;
use crate::error::world_labs_client_error::WorldLabsClientError;
use crate::error::world_labs_error::WorldLabsError;
use crate::error::world_labs_generic_api_error::WorldLabsGenericApiError;
use chrono::Utc;
use http_headers::names::{PRIORITY, SEC_FETCH_DEST, SEC_FETCH_MODE, SEC_FETCH_SITE, SEC_GPC};
use http_headers::values::accept::ACCEPT_ALL;
use http_headers::values::cache_control::CACHE_CONTROL_NO_CACHE;
use http_headers::values::connection::CONNECTION_KEEP_ALIVE;
use http_headers::values::content_type::CONTENT_TYPE_APPLICATION_JSON;
use http_headers::values::pragma::PRAGMA_NO_CACHE;
use http_headers::values::priority::PRIORITY_4;
use http_headers::values::sec::{SEC_FETCH_DEST_EMPTY, SEC_FETCH_MODE_CORS, SEC_FETCH_SITE_CROSS_SITE};
use http_headers::values::te::TE_TRAILERS;
use indexmap::IndexMap;
use log::{debug, error};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use std::time::Duration;
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_TYPE, ORIGIN, PRAGMA, REFERER, TE};
use wreq::Client;
use wreq_util::Emulation;
const BASE_URL : &str = "https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects";
fn get_url(run_id: &RunObjectId) -> String {
format!("{}/{}", BASE_URL, run_id.0)
}
pub struct UpdateRunObjectWithUploadArgs<'a> {
pub cookies: &'a WorldLabsCookies,
pub bearer_token: &'a WorldLabsBearerToken,
pub payload_args: UpdateRunObjectWithUploadPayloadArgs<'a>,
pub request_timeout: Option<Duration>,
}
pub struct UpdateRunObjectWithUploadPayloadArgs<'a> {
pub run_id: &'a RunObjectId,
pub run_created_at_timestamp: u64,
// eg. https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg
pub image_upload_url: &'a str,
pub image_input_id: &'a ImageInputObjectId,
pub pano_id: &'a PanoObjectId,
pub meta_world_id: &'a MetaWorldObjectId,
}
pub struct UpdateRunObjectWithUploadResponse {
pub image_input_id: ImageInputObjectId,
pub pano_id: PanoObjectId,
pub meta_world_id: MetaWorldObjectId,
pub run_updated_timestamp: u64,
}
/// Marble Image-to-World
/// This request patches an object. Seems to update it with the attached files.
/// Request #6 (of ~10)
pub async fn update_run_object_with_upload(args: UpdateRunObjectWithUploadArgs<'_>) -> Result<UpdateRunObjectWithUploadResponse, WorldLabsError> {
let client = Client::builder()
.emulation(Emulation::Firefox143)
.build()
.map_err(|err| WorldLabsClientError::WreqClientError(err))?;
let url = get_url(args.payload_args.run_id);
debug!("Requesting URL: {}", url);
let mut request_builder = client.patch(url)
.header(ACCEPT, ACCEPT_ALL)
.header(ACCEPT_LANGUAGE, "en-US,en;q=0.5")
.header(ACCEPT_ENCODING, "gzip, deflate, br, zstd")
.header(REFERER, REFERER_VALUE)
.header(CONTENT_TYPE, CONTENT_TYPE_APPLICATION_JSON)
.header(AUTHORIZATION, args.bearer_token.to_bearer_token_header_string())
.header(ORIGIN, ORIGIN_VALUE)
.header(SEC_GPC, "1")
.header(CONNECTION, CONNECTION_KEEP_ALIVE)
.header(SEC_FETCH_DEST, SEC_FETCH_DEST_EMPTY)
.header(SEC_FETCH_MODE, SEC_FETCH_MODE_CORS)
.header(SEC_FETCH_SITE, SEC_FETCH_SITE_CROSS_SITE)
.header(PRIORITY, PRIORITY_4)
.header(PRAGMA, PRAGMA_NO_CACHE)
.header(CACHE_CONTROL, CACHE_CONTROL_NO_CACHE)
.header(TE, TE_TRAILERS);
if let Some(timeout) = args.request_timeout {
request_builder = request_builder.timeout(timeout);
}
let payload = RawRequest::from_args(&args.payload_args);
let updated_at = payload.object.metadata.updated_at;
let http_request = request_builder.json(&payload)
.build()
.map_err(|err| {
error!("Error building request: {:?}", err);
WorldLabsClientError::WreqClientError(err)
})?;
let response = client.execute(http_request)
.await
.map_err(|err| {
error!("Error during request execution: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
let status = response.status();
let response_body = response.text()
.await
.map_err(|err| {
error!("Error reading response body: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
// TODO: Handle errors (Cloudflare, Grok, etc.)
if !status.is_success() {
error!("Request returned an error (code {}) : {:?}", status.as_u16(), response_body);
//return Err(classify_general_http_status_code_and_body(status, response_body));
return Err(WorldLabsGenericApiError::UncategorizedBadResponseWithStatusAndBody { status_code: status, body: response_body}.into())
}
debug!("Response body (200): {}", response_body);
let _response : RawResponse = serde_json::from_str(&response_body)
.map_err(|err| WorldLabsGenericApiError::SerdeResponseParseErrorWithBody(err, response_body.to_string()))?;
Ok(UpdateRunObjectWithUploadResponse {
image_input_id: args.payload_args.image_input_id.clone(),
pano_id: args.payload_args.pano_id.clone(),
meta_world_id: args.payload_args.meta_world_id.clone(),
run_updated_timestamp: updated_at,
})
}
#[derive(Serialize)]
struct RawRequest {
pub object: ObjectDef,
pub update_mask: Vec<String>,
}
impl Default for RawRequest {
fn default() -> Self {
let now = Utc::now();
let now = now.timestamp_millis().unsigned_abs();
Self {
object: ObjectDef {
metadata: ObjectMetadata {
version: "0.0.1".to_string(),
created_at: now,
updated_at: now,
uses_advanced_editing: false,
draft_mode: false,
nodes: IndexMap::new(),
}
},
update_mask: vec!["metadata".to_string()]
}
}
}
impl RawRequest {
pub fn from_args(args: &UpdateRunObjectWithUploadPayloadArgs) -> Self {
let mut request = RawRequest::default();
request.add_image_input_node({
let mut node = ImageInputNode::default();
node.id = args.image_input_id.to_string();
node.source.image_url = args.image_upload_url.to_string();
node
});
request.add_pano_node({
let mut node = PanoNode::default();
node.id = args.pano_id.to_string();
node.parent_id= Some(args.image_input_id.to_string());
node
});
request.add_world_node({
let mut node = WorldNode::default();
node.id = args.meta_world_id.to_string();
node.parent_id= Some(args.pano_id.to_string());
node
});
request.set_updated_now();
request
}
pub fn add_image_input_node(&mut self, mut node: ImageInputNode) {
node.created_at = self.object.metadata.updated_at;
self.object.metadata.nodes.insert(node.id.clone(), NodeValue::ImageInput(node));
}
pub fn add_pano_node(&mut self, mut node: PanoNode) {
node.created_at = self.object.metadata.updated_at;
self.object.metadata.nodes.insert(node.id.clone(), NodeValue::Pano(node));
}
pub fn add_world_node(&mut self, mut node: WorldNode) {
node.created_at = self.object.metadata.updated_at;
self.object.metadata.nodes.insert(node.id.clone(), NodeValue::World(node));
}
pub fn set_updated_now(&mut self) {
let now = Utc::now();
let now = now.timestamp_millis().unsigned_abs();
self.set_updated_at(now);
}
pub fn set_updated_at(&mut self, updated_at: u64) {
self.object.metadata.updated_at = updated_at;
for (_key, node) in self.object.metadata.nodes.iter_mut() {
match node {
NodeValue::ImageInput(value) => value.created_at = updated_at,
NodeValue::Pano(value) => value.created_at = updated_at,
NodeValue::World(value) => value.created_at = updated_at,
}
}
}
}
#[derive(Serialize)]
struct ObjectDef {
pub metadata: ObjectMetadata,
}
#[derive(Serialize)]
struct ObjectMetadata {
pub version: String,
#[serde(rename = "createdAt")]
pub created_at: u64,
#[serde(rename = "updatedAt")]
pub updated_at: u64,
#[serde(rename = "usesAdvancedEditing")]
pub uses_advanced_editing: bool,
#[serde(rename = "draftMode")]
pub draft_mode: bool,
/// Polymorphic set of ID-to-object mappings.
/// NB: IndexMap maintains insertion order.
pub nodes: IndexMap<String, NodeValue>,
}
#[derive(Serialize)]
#[serde(untagged)]
//#[serde(tag = "type", content = "value")]
enum NodeValue {
ImageInput(ImageInputNode),
Pano(PanoNode),
World(WorldNode),
}
#[derive(Serialize, Default)]
struct ImageInputNode {
pub id: String,
pub r#type: TypeInput,
#[serde(rename = "parentId")]
pub parent_id: Option<String>,
pub source: ImageInputNodeSource,
#[serde(rename = "createdAt")]
pub created_at: u64,
}
#[derive(Serialize, Default)]
struct ImageInputNodeSource {
pub r#type: TypeImage,
pub image_url: String,
}
#[derive(Serialize, Default)]
enum TypeInput {
#[serde(rename = "input")]
#[default]
Input
}
#[derive(Serialize, Default)]
enum TypeImage {
#[serde(rename = "image")]
#[default]
Image
}
#[derive(Serialize, Default)]
enum StatusPending {
#[serde(rename = "pending")]
#[default]
Pending
}
impl ImageInputNode {
pub fn with_id(id: &str) -> Self{
Self {
id: id.to_string(),
..Default::default()
}
}
}
#[derive(Serialize, Default)]
struct PanoNode {
pub id: String,
pub r#type: TypePano,
#[serde(rename = "parentId")]
pub parent_id: Option<String>,
pub source: PanoNodeSource,
#[serde(rename = "createdAt")]
pub created_at: u64,
}
#[derive(Serialize, Default)]
struct PanoNodeSource {
pub r#type: TypeGenerateWorld,
pub world_id: StatusPending,
pub status: StatusPending,
}
#[derive(Serialize, Default)]
enum TypePano {
#[serde(rename = "pano")]
#[default]
Pano
}
#[derive(Serialize, Default)]
enum TypeGenerateWorld {
#[serde(rename = "generate_world")]
#[default]
GenerateWorld
}
impl PanoNode {
pub fn with_id(id: &str) -> Self{
Self {
id: id.to_string(),
..Default::default()
}
}
}
#[derive(Serialize, Default)]
struct WorldNode {
pub id: String,
pub r#type: TypeWorld,
#[serde(rename = "parentId")]
pub parent_id: Option<String>,
pub source: WorldNodeSource,
#[serde(rename = "createdAt")]
pub created_at: u64,
}
#[derive(Serialize, Default)]
struct WorldNodeSource {
pub r#type: TypeGenerateWorld,
pub world_id: StatusPending,
pub posed_cubemaps_url: String,
pub minimap_url: String,
pub minimap_metadata: String,
pub status: StatusPending,
}
#[derive(Serialize, Default)]
enum TypeWorld {
#[serde(rename = "world")]
#[default]
World
}
impl WorldNode {
pub fn with_id(id: &str) -> Self{
Self {
id: id.to_string(),
..Default::default()
}
}
}
#[derive(Deserialize)]
struct RawResponse {
pub id: String,
}
#[cfg(test)]
mod tests {
use crate::api::api_types::image_input_object_id::ImageInputObjectId;
use crate::api::api_types::pano_object_id::PanoObjectId;
use crate::api::api_types::run_object_id::RunObjectId;
use crate::api::api_types::meta_world_object_id::MetaWorldObjectId;
use crate::api::requests::objects::update_run_object_with_upload::{RawRequest, UpdateRunObjectWithUploadPayloadArgs};
#[test]
fn request_default() {
let request = RawRequest::default();
assert_eq!(request.object.metadata.version, "0.0.1");
assert!(request.object.metadata.created_at > 10000);
assert!(request.object.metadata.updated_at > 10000);
}
#[test]
fn json() {
let run_id = RunObjectId::from_str("79795b32-e44d-4333-bac1-05b2c9a3ea12");
let image_input_id = ImageInputObjectId::from_str("bc17252b-811e-49d7-be3e-b7c538df9d30");
let pano_id = PanoObjectId::from_str("82f6b488-8afe-4311-9022-80ad5789ad92");
let world_id = MetaWorldObjectId::from_str("f08ec501-601c-47c6-a104-402d1820b8f0");
let args = UpdateRunObjectWithUploadPayloadArgs {
run_created_at_timestamp: 1234,
image_upload_url: "https://todo.com",
run_id: &run_id,
image_input_id: &image_input_id,
pano_id: &pano_id,
meta_world_id: &world_id,
};
let request = RawRequest::from_args(&args);
let json = serde_json::to_string_pretty(&request).unwrap();
println!("{}", json);
assert_eq!(json, r#"{"type":"abcxyz_image_input_id","value":"image_input_id"}"#);
}
}
@@ -0,0 +1,452 @@
use crate::api::api_types::image_input_object_id::ImageInputObjectId;
use crate::api::api_types::pano_object_id::PanoObjectId;
use crate::api::api_types::run_object_id::RunObjectId;
use crate::api::api_types::upload_mime_type::UploadMimeType;
use crate::api::api_types::upload_object_id::UploadObjectId;
use crate::api::api_types::meta_world_object_id::MetaWorldObjectId;
use crate::api::common::common_header_values::{ORIGIN_VALUE, REFERER_VALUE};
use crate::api::utils::upload_id_to_image_url::upload_id_to_image_url;
use crate::credentials::world_labs_bearer_token::WorldLabsBearerToken;
use crate::credentials::world_labs_cookies::WorldLabsCookies;
use crate::error::world_labs_client_error::WorldLabsClientError;
use crate::error::world_labs_error::WorldLabsError;
use crate::error::world_labs_generic_api_error::WorldLabsGenericApiError;
use chrono::Utc;
use http_headers::names::{PRIORITY, SEC_FETCH_DEST, SEC_FETCH_MODE, SEC_FETCH_SITE, SEC_GPC};
use http_headers::values::accept::ACCEPT_ALL;
use http_headers::values::cache_control::CACHE_CONTROL_NO_CACHE;
use http_headers::values::connection::CONNECTION_KEEP_ALIVE;
use http_headers::values::content_type::CONTENT_TYPE_APPLICATION_JSON;
use http_headers::values::pragma::PRAGMA_NO_CACHE;
use http_headers::values::priority::PRIORITY_4;
use http_headers::values::sec::{SEC_FETCH_DEST_EMPTY, SEC_FETCH_MODE_CORS, SEC_FETCH_SITE_CROSS_SITE};
use http_headers::values::te::TE_TRAILERS;
use indexmap::IndexMap;
use log::{debug, error};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use std::time::Duration;
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_TYPE, ORIGIN, PRAGMA, REFERER, TE};
use wreq::Client;
use wreq_util::Emulation;
use crate::api::api_types::world_id::WorldObjectId;
const BASE_URL : &str = "https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/objects";
fn get_url(run_id: &RunObjectId) -> String {
format!("{}/{}", BASE_URL, run_id.0)
}
pub struct UpdateRunObjectWithWorldArgs<'a> {
pub cookies: &'a WorldLabsCookies,
pub bearer_token: &'a WorldLabsBearerToken,
pub payload_args: UpdateRunObjectWithWorldPayloadArgs<'a>,
pub request_timeout: Option<Duration>,
}
pub struct UpdateRunObjectWithWorldPayloadArgs<'a> {
pub run_id: &'a RunObjectId,
pub run_created_at_timestamp: u64,
pub first_patch_timestamp: u64,
// eg. https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg
pub image_upload_url: &'a str,
pub image_input_id: &'a ImageInputObjectId,
pub pano_id: &'a PanoObjectId,
pub meta_world_id: &'a MetaWorldObjectId,
pub world_id: &'a WorldObjectId,
pub title: &'a str,
pub text_prompt: &'a str,
}
pub struct UpdateRunObjectWithWorldResponse {
//pub image_input_id: ImageInputObjectId,
//pub pano_id: PanoObjectId,
//pub meta_world_id: MetaWorldObjectId,
//pub world_id: WorldObjectId,
}
/// Marble Image-to-World
/// This request patches the run object a second time. It updates
/// more fields - prompt, world_id, etc.
/// Request #9 (of ~10)
pub async fn update_run_object_with_world(args: UpdateRunObjectWithWorldArgs<'_>) -> Result<UpdateRunObjectWithWorldResponse, WorldLabsError> {
let client = Client::builder()
.emulation(Emulation::Firefox143)
.build()
.map_err(|err| WorldLabsClientError::WreqClientError(err))?;
let url = get_url(args.payload_args.run_id);
debug!("Requesting URL: {}", url);
let mut request_builder = client.patch(url)
.header(ACCEPT, ACCEPT_ALL)
.header(ACCEPT_LANGUAGE, "en-US,en;q=0.5")
.header(ACCEPT_ENCODING, "gzip, deflate, br, zstd")
.header(REFERER, REFERER_VALUE)
.header(CONTENT_TYPE, CONTENT_TYPE_APPLICATION_JSON)
.header(AUTHORIZATION, args.bearer_token.to_bearer_token_header_string())
.header(ORIGIN, ORIGIN_VALUE)
.header(SEC_GPC, "1")
.header(CONNECTION, CONNECTION_KEEP_ALIVE)
.header(SEC_FETCH_DEST, SEC_FETCH_DEST_EMPTY)
.header(SEC_FETCH_MODE, SEC_FETCH_MODE_CORS)
.header(SEC_FETCH_SITE, SEC_FETCH_SITE_CROSS_SITE)
.header(PRIORITY, PRIORITY_4)
.header(PRAGMA, PRAGMA_NO_CACHE)
.header(CACHE_CONTROL, CACHE_CONTROL_NO_CACHE)
.header(TE, TE_TRAILERS);
if let Some(timeout) = args.request_timeout {
request_builder = request_builder.timeout(timeout);
}
let payload = RawRequest::from_args(&args.payload_args);
let http_request = request_builder.json(&payload)
.build()
.map_err(|err| {
error!("Error building request: {:?}", err);
WorldLabsClientError::WreqClientError(err)
})?;
let response = client.execute(http_request)
.await
.map_err(|err| {
error!("Error during request execution: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
let status = response.status();
let response_body = response.text()
.await
.map_err(|err| {
error!("Error reading response body: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
// TODO: Handle errors (Cloudflare, Grok, etc.)
if !status.is_success() {
error!("Request returned an error (code {}) : {:?}", status.as_u16(), response_body);
//return Err(classify_general_http_status_code_and_body(status, response_body));
return Err(WorldLabsGenericApiError::UncategorizedBadResponseWithStatusAndBody { status_code: status, body: response_body}.into())
}
debug!("Response body (200): {}", response_body);
let _response : RawResponse = serde_json::from_str(&response_body)
.map_err(|err| WorldLabsGenericApiError::SerdeResponseParseErrorWithBody(err, response_body.to_string()))?;
Ok(UpdateRunObjectWithWorldResponse {
//image_input_id: args.payload_args.image_input_id.clone(),
//pano_id: args.payload_args.pano_id.clone(),
//meta_world_id: args.payload_args.meta_world_id.clone(),
})
}
#[derive(Serialize)]
struct RawRequest {
pub object: ObjectDef,
pub update_mask: Vec<String>,
}
impl Default for RawRequest {
fn default() -> Self {
let now = Utc::now();
let now = now.timestamp_millis().unsigned_abs();
Self {
object: ObjectDef {
metadata: ObjectMetadata {
version: "0.0.1".to_string(),
name: None,
created_at: now,
updated_at: now,
uses_advanced_editing: false,
draft_mode: false,
nodes: IndexMap::new(),
}
},
update_mask: vec!["metadata".to_string()]
}
}
}
impl RawRequest {
pub fn from_args(args: &UpdateRunObjectWithWorldPayloadArgs) -> Self {
let mut request = RawRequest::default();
request.add_image_input_node({
let mut node = ImageInputNode::default();
node.id = args.image_input_id.to_string();
node.source.image_url = args.image_upload_url.to_string();
node.title = args.title.to_string();
node.caption = args.text_prompt.to_string();
node.created_at = args.first_patch_timestamp;
node
});
request.add_pano_node({
let mut node = PanoNode::default();
node.id = args.pano_id.to_string();
node.parent_id = Some(args.image_input_id.to_string());
node.source.world_id = Some(args.world_id.to_string());
node.created_at = args.first_patch_timestamp;
node
});
request.add_world_node({
let mut node = WorldNode::default();
node.id = args.meta_world_id.to_string();
node.parent_id= Some(args.pano_id.to_string());
node.source.world_id = Some(args.world_id.to_string());
node.created_at = args.first_patch_timestamp;
node
});
let now = Utc::now();
let now = now.timestamp_millis().unsigned_abs();
request.object.metadata.updated_at = now;
request.object.metadata.name = Some(args.title.to_string());
request
}
pub fn add_image_input_node(&mut self, mut node: ImageInputNode) {
node.created_at = self.object.metadata.updated_at;
self.object.metadata.nodes.insert(node.id.clone(), NodeValue::ImageInput(node));
}
pub fn add_pano_node(&mut self, mut node: PanoNode) {
node.created_at = self.object.metadata.updated_at;
self.object.metadata.nodes.insert(node.id.clone(), NodeValue::Pano(node));
}
pub fn add_world_node(&mut self, mut node: WorldNode) {
node.created_at = self.object.metadata.updated_at;
self.object.metadata.nodes.insert(node.id.clone(), NodeValue::World(node));
}
}
#[derive(Serialize)]
struct ObjectDef {
pub metadata: ObjectMetadata,
}
#[derive(Serialize)]
struct ObjectMetadata {
pub version: String,
// NB: Not null in request, just for builder
pub name: Option<String>,
#[serde(rename = "createdAt")]
pub created_at: u64,
#[serde(rename = "updatedAt")]
pub updated_at: u64,
#[serde(rename = "usesAdvancedEditing")]
pub uses_advanced_editing: bool,
#[serde(rename = "draftMode")]
pub draft_mode: bool,
/// Polymorphic set of ID-to-object mappings.
/// NB: IndexMap maintains insertion order.
pub nodes: IndexMap<String, NodeValue>,
}
#[derive(Serialize)]
#[serde(untagged)]
//#[serde(tag = "type", content = "value")]
enum NodeValue {
ImageInput(ImageInputNode),
Pano(PanoNode),
World(WorldNode),
}
#[derive(Serialize, Default)]
struct ImageInputNode {
pub id: String,
pub r#type: TypeInput,
#[serde(rename = "parentId")]
pub parent_id: Option<String>,
pub source: ImageInputNodeSource,
#[serde(rename = "createdAt")]
pub created_at: u64,
pub title: String,
pub caption: String,
}
#[derive(Serialize, Default)]
struct ImageInputNodeSource {
pub r#type: TypeImage,
pub image_url: String,
}
#[derive(Serialize, Default)]
enum TypeInput {
#[serde(rename = "input")]
#[default]
Input
}
#[derive(Serialize, Default)]
enum TypeImage {
#[serde(rename = "image")]
#[default]
Image
}
#[derive(Serialize, Default)]
enum StatusPending {
#[serde(rename = "pending")]
#[default]
Pending
}
impl ImageInputNode {
pub fn with_id(id: &str) -> Self{
Self {
id: id.to_string(),
..Default::default()
}
}
}
#[derive(Serialize, Default)]
struct PanoNode {
pub id: String,
pub r#type: TypePano,
#[serde(rename = "parentId")]
pub parent_id: Option<String>,
pub source: PanoNodeSource,
#[serde(rename = "createdAt")]
pub created_at: u64,
}
#[derive(Serialize, Default)]
struct PanoNodeSource {
pub r#type: TypeGenerateWorld,
// NB: Not null in request, just for builder
pub world_id: Option<String>,
pub status: StatusPending,
}
#[derive(Serialize, Default)]
enum TypePano {
#[serde(rename = "pano")]
#[default]
Pano
}
#[derive(Serialize, Default)]
enum TypeGenerateWorld {
#[serde(rename = "generate_world")]
#[default]
GenerateWorld
}
impl PanoNode {
pub fn with_id(id: &str) -> Self{
Self {
id: id.to_string(),
..Default::default()
}
}
}
#[derive(Serialize, Default)]
struct WorldNode {
pub id: String,
pub r#type: TypeWorld,
#[serde(rename = "parentId")]
pub parent_id: Option<String>,
pub source: WorldNodeSource,
#[serde(rename = "createdAt")]
pub created_at: u64,
}
#[derive(Serialize, Default)]
struct WorldNodeSource {
pub r#type: TypeGenerateWorld,
// NB: Not null in request, just for
pub world_id: Option<String>,
pub posed_cubemaps_url: String,
pub minimap_url: String,
pub minimap_metadata: String,
pub status: StatusPending,
}
#[derive(Serialize, Default)]
enum TypeWorld {
#[serde(rename = "world")]
#[default]
World
}
impl WorldNode {
pub fn with_id(id: &str) -> Self{
Self {
id: id.to_string(),
..Default::default()
}
}
}
#[derive(Deserialize)]
struct RawResponse {
pub id: String,
}
#[cfg(test)]
mod tests {
use crate::api::api_types::image_input_object_id::ImageInputObjectId;
use crate::api::api_types::pano_object_id::PanoObjectId;
use crate::api::api_types::run_object_id::RunObjectId;
use crate::api::api_types::meta_world_object_id::MetaWorldObjectId;
use crate::api::api_types::world_id::WorldObjectId;
use crate::api::requests::objects::update_run_object_with_world::{RawRequest, UpdateRunObjectWithWorldPayloadArgs};
#[test]
fn request_default() {
let request = RawRequest::default();
assert_eq!(request.object.metadata.version, "0.0.1");
assert!(request.object.metadata.created_at > 10000);
assert!(request.object.metadata.updated_at > 10000);
}
#[test]
fn json() {
let run_id = RunObjectId::from_str("79795b32-e44d-4333-bac1-05b2c9a3ea12");
let image_input_id = ImageInputObjectId::from_str("bc17252b-811e-49d7-be3e-b7c538df9d30");
let pano_id = PanoObjectId::from_str("82f6b488-8afe-4311-9022-80ad5789ad92");
let meta_world_id = MetaWorldObjectId::from_str("f08ec501-601c-47c6-a104-402d1820b8f0");
let world_id = WorldObjectId::from_str("d60cfa21-5506-43de-9a9c-0707fc17a5ec");
let title = "Cows Grazing in Indoor Pasture";
let caption = "The scene is a surreal indoor agricultural environment, depicted with a realistic and slightly eerie tone, as rows of bright lights illuminate a vast, artificial pasture. The overall mood is quiet and contemplative, emphasizing the unusual juxtaposition of natural elements within a manufactured setting. Large herds of cattle are distributed across the lush, green grassy floor, peacefully grazing on the abundant vegetation. The entire space is encased within a massive, warehouse-like structure, supported by countless concrete columns that extend from the floor to the ceiling in an orderly grid. Above the columns, a network of metal beams forms the infrastructure of the roof, from which an extensive array of industrial lights is suspended. These lights are arranged in long, parallel lines, creating a striking visual perspective that converges towards a distant vanishing point at the center of the structure. The dense, vibrant green grass covers every inch of the ground, appearing soft and uniform, without any discernible paths or bare patches. Each cow is distinct, varying in color from black to brown and white, and each is engaged in individual grazing or resting. The concrete columns maintain a consistent light gray color and texture, creating a rhythmic architectural presence throughout the vast indoor landscape. To the right, another cluster of columns continues the architectural pattern, while the grassy expanse remains uninterrupted, extending toward the edges of the structure. ";
let args = UpdateRunObjectWithWorldPayloadArgs {
run_created_at_timestamp: 1765756772176,
first_patch_timestamp: 1765756773647,
image_upload_url: "https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg",
run_id: &run_id,
image_input_id: &image_input_id,
pano_id: &pano_id,
meta_world_id: &meta_world_id,
world_id: &world_id,
title,
text_prompt: caption,
};
let request = RawRequest::from_args(&args);
let json = serde_json::to_string_pretty(&request).unwrap();
println!("{}", json);
assert_eq!(json, r#"{"type":"abcxyz_image_input_id","value":"image_input_id"}"#);
}
}
@@ -0,0 +1 @@
pub mod recaption_image;
@@ -0,0 +1,171 @@
use crate::api::api_types::run_object_id::RunObjectId;
use crate::api::api_types::upload_object_id::UploadObjectId;
use crate::api::api_types::upload_mime_type::UploadMimeType;
use crate::api::common::common_header_values::{ORIGIN_VALUE, REFERER_VALUE};
use crate::api::utils::upload_id_to_image_url::upload_id_to_image_url;
use crate::credentials::world_labs_bearer_token::WorldLabsBearerToken;
use crate::credentials::world_labs_cookies::WorldLabsCookies;
use crate::error::world_labs_client_error::WorldLabsClientError;
use crate::error::world_labs_error::WorldLabsError;
use crate::error::world_labs_generic_api_error::WorldLabsGenericApiError;
use http_headers::names::{PRIORITY, SEC_FETCH_DEST, SEC_FETCH_MODE, SEC_FETCH_SITE, SEC_GPC};
use http_headers::values::accept::ACCEPT_ALL;
use http_headers::values::cache_control::CACHE_CONTROL_NO_CACHE;
use http_headers::values::connection::CONNECTION_KEEP_ALIVE;
use http_headers::values::content_type::CONTENT_TYPE_APPLICATION_JSON;
use http_headers::values::pragma::PRAGMA_NO_CACHE;
use http_headers::values::priority::PRIORITY_4;
use http_headers::values::sec::{SEC_FETCH_DEST_EMPTY, SEC_FETCH_MODE_CORS, SEC_FETCH_SITE_CROSS_SITE};
use http_headers::values::te::TE_TRAILERS;
use log::{debug, error};
use serde::{Deserialize, Serialize};
use std::time::Duration;
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_TYPE, ORIGIN, PRAGMA, REFERER, TE};
use wreq::Client;
use wreq_util::Emulation;
const URL : &str = "https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/recaption2";
pub struct RecaptionImageArgs<'a> {
pub cookies: &'a WorldLabsCookies,
pub bearer_token: &'a WorldLabsBearerToken,
pub upload_id: &'a UploadObjectId,
pub upload_mime_type: UploadMimeType,
pub run_id: &'a RunObjectId,
pub request_timeout: Option<Duration>,
}
pub struct RecaptionImageResponse {
pub title: String,
pub caption: String,
}
/// Marble Image-to-World
/// This request generates captions and titles for images. It's a VLM.
/// The prompts are then used downstream to create the scenes.
/// Request #6 (of ~10)
pub async fn recaption_image(args: RecaptionImageArgs<'_>) -> Result<RecaptionImageResponse, WorldLabsError> {
let client = Client::builder()
.emulation(Emulation::Firefox143)
.build()
.map_err(|err| WorldLabsClientError::WreqClientError(err))?;
debug!("Requesting URL: {}", URL);
let mut request_builder = client.post(URL)
.header(ACCEPT, ACCEPT_ALL)
.header(ACCEPT_LANGUAGE, "en-US,en;q=0.5")
.header(ACCEPT_ENCODING, "gzip, deflate, br, zstd")
.header(REFERER, REFERER_VALUE)
.header(CONTENT_TYPE, CONTENT_TYPE_APPLICATION_JSON)
.header(AUTHORIZATION, args.bearer_token.to_bearer_token_header_string())
.header(ORIGIN, ORIGIN_VALUE)
.header(SEC_GPC, "1")
.header(CONNECTION, CONNECTION_KEEP_ALIVE)
.header(SEC_FETCH_DEST, SEC_FETCH_DEST_EMPTY)
.header(SEC_FETCH_MODE, SEC_FETCH_MODE_CORS)
.header(SEC_FETCH_SITE, SEC_FETCH_SITE_CROSS_SITE)
.header(PRIORITY, PRIORITY_4)
.header(PRAGMA, PRAGMA_NO_CACHE)
.header(CACHE_CONTROL, CACHE_CONTROL_NO_CACHE)
.header(TE, TE_TRAILERS);
if let Some(timeout) = args.request_timeout {
request_builder = request_builder.timeout(timeout);
}
let request_payload = RawRequest::for_image_and_run(args.upload_id, args.upload_mime_type, args.run_id);
let http_request = request_builder.json(&request_payload)
.build()
.map_err(|err| {
error!("Error building request: {:?}", err);
WorldLabsClientError::WreqClientError(err)
})?;
let response = client.execute(http_request)
.await
.map_err(|err| {
error!("Error during request execution: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
let status = response.status();
let response_body = response.text()
.await
.map_err(|err| {
error!("Error reading response body: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
// TODO: Handle errors (Cloudflare, Grok, etc.)
if !status.is_success() {
error!("Request returned an error (code {}) : {:?}", status.as_u16(), response_body);
//return Err(classify_general_http_status_code_and_body(status, response_body));
return Err(WorldLabsGenericApiError::UncategorizedBadResponseWithStatusAndBody { status_code: status, body: response_body}.into())
}
debug!("Response body (200): {}", response_body);
let response : RawResponse = serde_json::from_str(&response_body)
.map_err(|err| WorldLabsGenericApiError::SerdeResponseParseErrorWithBody(err, response_body.to_string()))?;
Ok(RecaptionImageResponse {
title: response.title,
caption: response.caption,
})
}
#[derive(Serialize)]
struct RawRequest {
pub world_prompt: WorldPrompt,
pub user_caption: String,
pub context: Context,
}
#[derive(Serialize)]
struct WorldPrompt {
pub r#type: String,
pub image_prompt: ImagePrompt,
pub text_prompt: String,
}
#[derive(Serialize)]
struct ImagePrompt {
pub uri: String,
}
#[derive(Serialize)]
struct Context {
pub run_id: String,
}
impl RawRequest {
pub fn for_image_and_run(image_upload_id: &UploadObjectId, image_mime_type: UploadMimeType, run_id: &RunObjectId) -> Self {
let image_url = upload_id_to_image_url(image_upload_id, image_mime_type);
Self {
world_prompt: WorldPrompt {
r#type: "image".to_string(),
image_prompt: ImagePrompt {
uri: image_url,
},
text_prompt: "".to_string(), // NB: empty
},
user_caption: "".to_string(), // NB: empty
context: Context {
run_id: run_id.0.clone(),
}
}
}
}
#[derive(Deserialize)]
struct RawResponse {
pub caption: String,
pub title: String,
}
#[cfg(test)]
mod tests {
}
@@ -0,0 +1,183 @@
use crate::api::api_types::meta_world_object_id::MetaWorldObjectId;
use crate::api::api_types::run_object_id::RunObjectId;
use crate::api::api_types::upload_mime_type::UploadMimeType;
use crate::api::api_types::upload_object_id::UploadObjectId;
use crate::api::api_types::world_id::WorldObjectId;
use crate::api::common::common_header_values::{ORIGIN_VALUE, REFERER_VALUE};
use crate::api::utils::upload_id_to_image_url::upload_id_to_image_url;
use crate::credentials::world_labs_bearer_token::WorldLabsBearerToken;
use crate::credentials::world_labs_cookies::WorldLabsCookies;
use crate::error::world_labs_client_error::WorldLabsClientError;
use crate::error::world_labs_error::WorldLabsError;
use crate::error::world_labs_generic_api_error::WorldLabsGenericApiError;
use http_headers::names::{PRIORITY, SEC_FETCH_DEST, SEC_FETCH_MODE, SEC_FETCH_SITE, SEC_GPC};
use http_headers::values::accept::ACCEPT_ALL;
use http_headers::values::cache_control::CACHE_CONTROL_NO_CACHE;
use http_headers::values::connection::CONNECTION_KEEP_ALIVE;
use http_headers::values::content_type::CONTENT_TYPE_APPLICATION_JSON;
use http_headers::values::pragma::PRAGMA_NO_CACHE;
use http_headers::values::priority::PRIORITY_4;
use http_headers::values::sec::{SEC_FETCH_DEST_EMPTY, SEC_FETCH_MODE_CORS, SEC_FETCH_SITE_CROSS_SITE};
use http_headers::values::te::TE_TRAILERS;
use log::{debug, error};
use serde::{Deserialize, Serialize};
use std::time::Duration;
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_TYPE, ORIGIN, PRAGMA, REFERER, TE};
use wreq::Client;
use wreq_util::Emulation;
const URL : &str = "https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds";
pub struct CreateWorldArgs<'a> {
pub cookies: &'a WorldLabsCookies,
pub bearer_token: &'a WorldLabsBearerToken,
// eg. https://cdn.marble.worldlabs.ai/object/13ca760c-8ef9-4bf5-acc3-5a507fad3abf/asset.jpg
pub image_upload_url: &'a str,
pub text_prompt: &'a str,
pub request_timeout: Option<Duration>,
}
pub struct CreateWorldResponse {
pub world_id: WorldObjectId,
}
/// Marble Image-to-World
/// This request starts world generation
/// Request #7 (of ~10)
pub async fn create_world(args: CreateWorldArgs<'_>) -> Result<CreateWorldResponse, WorldLabsError> {
let client = Client::builder()
.emulation(Emulation::Firefox143)
.build()
.map_err(|err| WorldLabsClientError::WreqClientError(err))?;
debug!("Requesting URL: {}", URL);
let mut request_builder = client.post(URL)
.header(ACCEPT, ACCEPT_ALL)
.header(ACCEPT_LANGUAGE, "en-US,en;q=0.5")
.header(ACCEPT_ENCODING, "gzip, deflate, br, zstd")
.header(REFERER, REFERER_VALUE)
.header(CONTENT_TYPE, CONTENT_TYPE_APPLICATION_JSON)
.header(AUTHORIZATION, args.bearer_token.to_bearer_token_header_string())
.header(ORIGIN, ORIGIN_VALUE)
.header(SEC_GPC, "1")
.header(CONNECTION, CONNECTION_KEEP_ALIVE)
.header(SEC_FETCH_DEST, SEC_FETCH_DEST_EMPTY)
.header(SEC_FETCH_MODE, SEC_FETCH_MODE_CORS)
.header(SEC_FETCH_SITE, SEC_FETCH_SITE_CROSS_SITE)
.header(PRIORITY, PRIORITY_4)
.header(PRAGMA, PRAGMA_NO_CACHE)
.header(CACHE_CONTROL, CACHE_CONTROL_NO_CACHE)
.header(TE, TE_TRAILERS);
if let Some(timeout) = args.request_timeout {
request_builder = request_builder.timeout(timeout);
}
let mut payload = RawRequest::default();
payload.generation_input.prompt.image_prompt.uri = Some(args.image_upload_url.to_string());
payload.generation_input.prompt.text_prompt = Some(args.text_prompt.to_string());
let http_request = request_builder.json(&payload)
.build()
.map_err(|err| {
error!("Error building request: {:?}", err);
WorldLabsClientError::WreqClientError(err)
})?;
let response = client.execute(http_request)
.await
.map_err(|err| {
error!("Error during request execution: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
let status = response.status();
let response_body = response.text()
.await
.map_err(|err| {
error!("Error reading response body: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
// TODO: Handle errors (Cloudflare, Grok, etc.)
if !status.is_success() {
error!("Request returned an error (code {}) : {:?}", status.as_u16(), response_body);
//return Err(classify_general_http_status_code_and_body(status, response_body));
return Err(WorldLabsGenericApiError::UncategorizedBadResponseWithStatusAndBody { status_code: status, body: response_body}.into())
}
debug!("Response body (200): {}", response_body);
let response : RawResponse = serde_json::from_str(&response_body)
.map_err(|err| WorldLabsGenericApiError::SerdeResponseParseErrorWithBody(err, response_body.to_string()))?;
Ok(CreateWorldResponse {
world_id: WorldObjectId(response.id),
})
}
#[derive(Serialize)]
struct RawRequest {
pub permission: Permission,
pub generation_input: GenerationInput,
}
#[derive(Serialize)]
struct Permission {
pub public: bool,
}
#[derive(Serialize)]
struct GenerationInput {
pub model: String,
pub prompt: Prompt,
}
#[derive(Serialize)]
struct Prompt {
pub r#type: String,
pub image_prompt: ImagePrompt,
// NB: Not null in request, just for building
pub text_prompt: Option<String>,
}
#[derive(Serialize)]
struct ImagePrompt {
// NB: Not null in request, just for building
pub uri: Option<String>,
}
impl Default for RawRequest {
fn default() -> Self {
Self {
permission: Permission {
public: true,
},
generation_input: GenerationInput {
model: "Marble 0.1-plus".to_string(),
prompt: Prompt {
r#type: "image".to_string(),
image_prompt: ImagePrompt {
uri: None,
},
text_prompt: None,
},
},
}
}
}
#[derive(Deserialize)]
struct RawResponse {
pub id: String,
}
#[cfg(test)]
mod tests {
}
@@ -0,0 +1,2 @@
pub mod create_world;
pub mod poll_world_status;
@@ -0,0 +1,186 @@
use crate::api::api_types::run_object_id::RunObjectId;
use crate::api::api_types::upload_mime_type::UploadMimeType;
use crate::api::api_types::upload_object_id::UploadObjectId;
use crate::api::api_types::world_id::WorldObjectId;
use crate::api::common::common_header_values::{ORIGIN_VALUE, REFERER_VALUE};
use crate::credentials::world_labs_bearer_token::WorldLabsBearerToken;
use crate::credentials::world_labs_cookies::WorldLabsCookies;
use crate::error::world_labs_client_error::WorldLabsClientError;
use crate::error::world_labs_error::WorldLabsError;
use crate::error::world_labs_generic_api_error::WorldLabsGenericApiError;
use chrono::Utc;
use http_headers::names::{PRIORITY, SEC_FETCH_DEST, SEC_FETCH_MODE, SEC_FETCH_SITE, SEC_GPC};
use http_headers::values::accept::ACCEPT_ALL;
use http_headers::values::cache_control::CACHE_CONTROL_NO_CACHE;
use http_headers::values::connection::CONNECTION_KEEP_ALIVE;
use http_headers::values::content_type::CONTENT_TYPE_APPLICATION_JSON;
use http_headers::values::pragma::PRAGMA_NO_CACHE;
use http_headers::values::priority::PRIORITY_4;
use http_headers::values::sec::{SEC_FETCH_DEST_EMPTY, SEC_FETCH_MODE_CORS, SEC_FETCH_SITE_CROSS_SITE};
use http_headers::values::te::TE_TRAILERS;
use log::{debug, error};
use serde::{Deserialize, Serialize};
use std::time::Duration;
use uuid::Uuid;
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_LENGTH, CONTENT_TYPE, ORIGIN, PRAGMA, REFERER, TE};
use wreq::Client;
use wreq_util::Emulation;
const BASE_URL : &str = "https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds";
fn get_url(world_id: &WorldObjectId) -> String {
format!("{}/{}", BASE_URL, world_id.0)
}
pub struct PollWorldStatusArgs<'a> {
pub cookies: &'a WorldLabsCookies,
pub bearer_token: &'a WorldLabsBearerToken,
pub world_id: &'a WorldObjectId,
pub request_timeout: Option<Duration>,
}
pub struct PollWorldStatusResponse {
pub is_complete: bool,
pub spz_splat_url: Option<String>,
}
/// Marble Image-to-World
/// Poll the world generation status
/// Request #10 (of ~10)
pub async fn poll_world_status(args: PollWorldStatusArgs<'_>) -> Result<PollWorldStatusResponse, WorldLabsError> {
let client = Client::builder()
.emulation(Emulation::Firefox143)
.build()
.map_err(|err| WorldLabsClientError::WreqClientError(err))?;
let url = get_url(args.world_id);
debug!("Requesting URL: {}", url);
let mut request_builder = client.get(url)
.header(ACCEPT, ACCEPT_ALL)
.header(ACCEPT_LANGUAGE, "en-US,en;q=0.5")
.header(ACCEPT_ENCODING, "gzip, deflate, br, zstd")
.header(REFERER, REFERER_VALUE)
.header(AUTHORIZATION, args.bearer_token.to_bearer_token_header_string())
.header(ORIGIN, ORIGIN_VALUE)
.header(SEC_GPC, "1")
.header(CONNECTION, CONNECTION_KEEP_ALIVE)
.header(SEC_FETCH_DEST, SEC_FETCH_DEST_EMPTY)
.header(SEC_FETCH_MODE, SEC_FETCH_MODE_CORS)
.header(SEC_FETCH_SITE, SEC_FETCH_SITE_CROSS_SITE)
.header(PRIORITY, PRIORITY_4)
.header(PRAGMA, PRAGMA_NO_CACHE)
.header(CACHE_CONTROL, CACHE_CONTROL_NO_CACHE)
.header(CONTENT_LENGTH, 0)
.header(TE, TE_TRAILERS);
if let Some(timeout) = args.request_timeout {
request_builder = request_builder.timeout(timeout);
}
let http_request = request_builder
.build()
.map_err(|err| {
error!("Error building request: {:?}", err);
WorldLabsClientError::WreqClientError(err)
})?;
let response = client.execute(http_request)
.await
.map_err(|err| {
error!("Error during request execution: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
let status = response.status();
let response_body = response.text()
.await
.map_err(|err| {
error!("Error reading response body: {:?}", err);
WorldLabsGenericApiError::WreqError(err)
})?;
// TODO: Handle errors (Cloudflare, Grok, etc.)
if !status.is_success() {
error!("Request returned an error (code {}) : {:?}", status.as_u16(), response_body);
//return Err(classify_general_http_status_code_and_body(status, response_body));
return Err(WorldLabsGenericApiError::UncategorizedBadResponseWithStatusAndBody { status_code: status, body: response_body}.into())
}
debug!("Response body (200): {}", response_body);
let response : RawResponse = serde_json::from_str(&response_body)
.map_err(|err| WorldLabsGenericApiError::SerdeResponseParseErrorWithBody(err, response_body.to_string()))?;
debug!("World status: {}", response.status);
let maybe_spz_url = response.generation_output
.map(|out| out.spz_urls.full_res);
Ok(PollWorldStatusResponse {
is_complete: maybe_spz_url.is_some(),
spz_splat_url: maybe_spz_url,
})
}
#[derive(Deserialize)]
struct RawResponse {
/// eg. "INITIALIZING", "SUCCEEDED", etc.
pub status: String,
pub generation_output: Option<GenerationOutput>,
}
#[derive(Deserialize)]
struct GenerationOutput {
pub spz_urls: SpzUrls,
}
#[derive(Deserialize)]
struct SpzUrls {
// eg. https://cdn.marble.worldlabs.ai/d60cfa21-5506-43de-9a9c-0707fc17a5ec/1002dd35-fcad-4eeb-ba15-0d113c1778d8_ceramic.spz
pub full_res: String,
}
#[cfg(test)]
mod tests {
use crate::api::api_types::world_id::WorldObjectId;
use crate::api::requests::worlds::poll_world_status::{get_url, poll_world_status, PollWorldStatusArgs};
use crate::test_utils::get_test_bearer_token::get_test_bearer_token;
use crate::test_utils::get_test_cookies::get_typed_test_cookies;
use crate::test_utils::setup_test_logging::setup_test_logging;
use log::LevelFilter;
#[test]
fn test_get_url() {
let world_id = WorldObjectId("d60cfa21-5506-43de-9a9c-0707fc17a5ec".to_string());
let expected = "https://marble2-kgw-prod-iac1.wlt-ai.art/api/v1/worlds/d60cfa21-5506-43de-9a9c-0707fc17a5ec";
assert_eq!(get_url(&world_id), expected);
}
#[tokio::test]
#[ignore] // Client side tests only
async fn test_requests() {
setup_test_logging(LevelFilter::Debug);
let cookies = get_typed_test_cookies().unwrap();
let bearer_token = get_test_bearer_token().unwrap();
let world_id = WorldObjectId("d60cfa21-5506-43de-9a9c-0707fc17a5ec".to_string());
let response = poll_world_status(PollWorldStatusArgs {
cookies: &cookies,
bearer_token: &bearer_token,
world_id: &world_id,
request_timeout: None,
}).await.unwrap();
println!("Is complete: {}", response.is_complete);
println!("Spz Url: {}", response.spz_splat_url.unwrap_or_else(|| "incomplete".to_string()));
assert_eq!(1, 2);
}
}
@@ -0,0 +1 @@
pub mod upload_id_to_image_url;
@@ -0,0 +1,38 @@
use crate::api::api_types::upload_object_id::UploadObjectId;
use crate::api::api_types::upload_mime_type::UploadMimeType;
pub fn upload_id_to_image_url(upload_id: &UploadObjectId, upload_mime_type: UploadMimeType) -> String {
let extension_without_period = match upload_mime_type {
UploadMimeType::ImageJpeg => "jpg",
};
let upload_id_str = upload_id.as_str();
format!("https://cdn.marble.worldlabs.ai/object/{upload_id_str}/asset.{extension_without_period}")
}
#[cfg(test)]
mod tests {
use super::upload_id_to_image_url;
use crate::api::api_types::upload_object_id::UploadObjectId;
use crate::api::api_types::upload_mime_type::UploadMimeType;
// llm tests... sigh
#[test]
fn builds_jpeg_url_with_jpg_extension() {
let id = UploadObjectId("abc123".to_string());
let url = upload_id_to_image_url(&id, UploadMimeType::ImageJpeg);
assert_eq!(
url,
"https://cdn.marble.worldlabs.ai/object/abc123/asset.jpg"
);
}
// llm tests... sigh
#[test]
fn preserves_exact_upload_id_in_url() {
let raw_id = "550e8400-e29b-41d4-a716-446655440000";
let id = UploadObjectId(raw_id.to_string());
let url = upload_id_to_image_url(&id, UploadMimeType::ImageJpeg);
assert!(url.contains(raw_id));
assert!(url.ends_with("/asset.jpg"));
}
}
@@ -0,0 +1,10 @@
/// Firefox 139 (2025) on macOS, which matches wreq's Emulation::Firefox139
pub const FIREFOX_139_MAC_USER_AGENT : &str =
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:139.0) Gecko/20100101 Firefox/139.0";
pub const FIREFOX_143_MAC_USER_AGENT : &str =
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0";
pub const FIREFOX_144_MAC_USER_AGENT_UNSUPPORTED_TLS_FINGERPRINTING : &str =
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:144.0) Gecko/20100101 Firefox/144.0";
@@ -0,0 +1 @@
pub mod browser_user_agents;

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