From 93306952d9f0cc653865654bc430fb640b789498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Mon, 21 Sep 2026 12:38:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=8A=E7=94=BB=E5=B8=83=E5=8D=A0=E4=BD=8D?= =?UTF-8?q?=E8=BD=BD=E8=8D=B7=E7=A7=BB=E5=87=BA=E5=8F=97feature=E9=97=A8?= =?UTF-8?q?=E6=8E=A7=E7=9A=84assets=E6=A8=A1=E5=9D=97=20-=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20shared-contracts::editor=5Fcanvas=EF=BC=8C=E6=89=BF?= =?UTF-8?q?=E8=BD=BD=E7=94=BB=E5=B8=83=E5=8D=A0=E4=BD=8D=E4=B8=8E=E5=9B=9E?= =?UTF-8?q?=E5=A1=AB=E8=BD=BD=E8=8D=B7=E5=B9=B6=E6=8E=A5=E5=85=A5=20ts-rs?= =?UTF-8?q?=20=E7=94=9F=E6=88=90=20-=20assets=20=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=86=85=E9=83=A8=E5=BC=95=E7=94=A8=E8=AF=A5?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=EF=BC=8C=E4=B8=8D=E5=86=8D=E8=87=AA=E5=B8=A6?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=20-=20api-server=20=E4=B8=83=E5=A4=84?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E6=94=B9=E5=88=B0=E6=96=B0=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/character_animation_assets.rs | 2 +- .../api-server/src/editor_agent/utils.rs | 6 ++-- .../crates/api-server/src/editor_project.rs | 6 ++-- .../api-server/src/editor_project_icon.rs | 2 +- .../api-server/src/external_editor_api.rs | 2 +- .../src/external_generation_worker.rs | 3 +- .../generation.rs | 5 +-- .../crates/shared-contracts/src/assets.rs | 22 ++---------- .../shared-contracts/src/editor_canvas.rs | 36 +++++++++++++++++++ server-rs/crates/shared-contracts/src/lib.rs | 1 + 10 files changed, 53 insertions(+), 32 deletions(-) create mode 100644 server-rs/crates/shared-contracts/src/editor_canvas.rs diff --git a/server-rs/crates/api-server/src/character_animation_assets.rs b/server-rs/crates/api-server/src/character_animation_assets.rs index bfe357866..a4c59f384 100644 --- a/server-rs/crates/api-server/src/character_animation_assets.rs +++ b/server-rs/crates/api-server/src/character_animation_assets.rs @@ -3654,7 +3654,7 @@ fn prepare_editor_video_result( } fn build_editor_character_animation_canvas_placement_item( - completion: &shared_contracts::assets::EditorCanvasGenerationCompletionPayload, + completion: &shared_contracts::editor_canvas::EditorCanvasGenerationCompletionPayload, resource_id: &str, width: u32, height: u32, diff --git a/server-rs/crates/api-server/src/editor_agent/utils.rs b/server-rs/crates/api-server/src/editor_agent/utils.rs index bc367a2ae..156919576 100644 --- a/server-rs/crates/api-server/src/editor_agent/utils.rs +++ b/server-rs/crates/api-server/src/editor_agent/utils.rs @@ -8,15 +8,15 @@ use platform_oss::{ LegacyAssetPrefix, OssObjectAccess, OssPutObjectRequest, OssSignedGetObjectUrlRequest, }; use serde_json::{Value, json}; -use shared_contracts::assets::{ - EditorCanvasGenerationCompletionPayload, EditorCanvasGenerationPlaceholderPayload, -}; use shared_contracts::editor_agent::{ EDITOR_AGENT_ATTACHMENT_LABEL_MAX_CODE_POINTS, EDITOR_AGENT_MESSAGES_DOCUMENT_VERSION, EditorAgentAttachmentRef, EditorAgentAttachmentSource, EditorAgentConversationDetail, EditorAgentConversationMessagesDocument, EditorAgentConversationSummary, EditorAgentGeneratedImage, EditorAgentMessage, }; +use shared_contracts::editor_canvas::{ + EditorCanvasGenerationCompletionPayload, EditorCanvasGenerationPlaceholderPayload, +}; use shared_kernel::normalize_required_string; use spacetime_client::{ EditorAgentConversationRecord, EditorAssetLibraryRecord, EditorAssetRecord, diff --git a/server-rs/crates/api-server/src/editor_project.rs b/server-rs/crates/api-server/src/editor_project.rs index 5f92b841a..b3af452cf 100644 --- a/server-rs/crates/api-server/src/editor_project.rs +++ b/server-rs/crates/api-server/src/editor_project.rs @@ -28,10 +28,10 @@ use serde_json::{Value, json}; use sha2::{Digest as _, Sha256}; #[cfg(test)] use shared_contracts::assets::EditorAudioGenerateResponse; -use shared_contracts::assets::{ - EDITOR_ASSET_LABEL_MAX_CHARS, +use shared_contracts::assets::{EDITOR_ASSET_LABEL_MAX_CHARS, EditorSceneGenerateRequest}; +use shared_contracts::editor_canvas::{ EditorCanvasGenerationCompletionPayload as EditorCanvasGenerationCompletionRequest, - EditorCanvasGenerationPlaceholderPayload, EditorSceneGenerateRequest, + EditorCanvasGenerationPlaceholderPayload, }; use shared_contracts::editor_generation::editor_generation_request_fingerprint; use shared_contracts::editor_generation::{ diff --git a/server-rs/crates/api-server/src/editor_project_icon.rs b/server-rs/crates/api-server/src/editor_project_icon.rs index c109dab63..f974e9d4c 100644 --- a/server-rs/crates/api-server/src/editor_project_icon.rs +++ b/server-rs/crates/api-server/src/editor_project_icon.rs @@ -22,7 +22,7 @@ use platform_oss::{LegacyAssetPrefix, OssHeadObjectRequest, OssObjectAccess}; use serde::{Deserialize, Deserializer, Serialize, Serializer, de}; use serde_json::{Value, json}; use sha2::{Digest as _, Sha256}; -use shared_contracts::assets::EditorCanvasGenerationCompletionPayload; +use shared_contracts::editor_canvas::EditorCanvasGenerationCompletionPayload; use shared_contracts::editor_generation::editor_generation_stable_asset_object_id; use shared_kernel::build_prefixed_uuid_id; use spacetime_client::editor_project::{ diff --git a/server-rs/crates/api-server/src/external_editor_api.rs b/server-rs/crates/api-server/src/external_editor_api.rs index 6a53d32d8..6c5498870 100644 --- a/server-rs/crates/api-server/src/external_editor_api.rs +++ b/server-rs/crates/api-server/src/external_editor_api.rs @@ -7,7 +7,7 @@ use axum::{ use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; use serde_json::{Value, json}; -use shared_contracts::assets::EditorCanvasGenerationCompletionPayload; +use shared_contracts::editor_canvas::EditorCanvasGenerationCompletionPayload; use shared_contracts::external_generation::{ ExternalEditorGenerationJobResponse, ExternalEditorGenerationSubmissionResponse, ExternalGenerationJobStatus, diff --git a/server-rs/crates/api-server/src/external_generation_worker.rs b/server-rs/crates/api-server/src/external_generation_worker.rs index 6c89e8fb2..73f65a096 100644 --- a/server-rs/crates/api-server/src/external_generation_worker.rs +++ b/server-rs/crates/api-server/src/external_generation_worker.rs @@ -1187,7 +1187,8 @@ struct LegacyEditorImageEditWorkerPayload { asset_label: Option, source_resource_id: Option, target_layer_id: Option, - canvas_completion: Option, + canvas_completion: + Option, } fn parse_editor_image_edit_worker_payload( diff --git a/server-rs/crates/api-server/src/vector_engine_audio_generation/generation.rs b/server-rs/crates/api-server/src/vector_engine_audio_generation/generation.rs index bfe6c55ac..ebfa963e6 100644 --- a/server-rs/crates/api-server/src/vector_engine_audio_generation/generation.rs +++ b/server-rs/crates/api-server/src/vector_engine_audio_generation/generation.rs @@ -11,6 +11,7 @@ use platform_oss::LegacyAssetPrefix; use serde_json::Value; use serde_json::json; use shared_contracts::assets; +use shared_contracts::editor_canvas; use shared_contracts::editor_generation::{ editor_generation_request_fingerprint, editor_generation_stable_asset_binding_id, editor_generation_stable_asset_object_id, @@ -460,7 +461,7 @@ struct ProductionSoundEffectWorkerStages<'a> { operation_id: &'a str, target: AudioAssetBindingTarget, project_id: Option, - canvas_completion: Option, + canvas_completion: Option, asset_folder_id: Option, asset_label: Option, normalized: &'a NormalizedEditorSoundEffectRequest, @@ -1171,7 +1172,7 @@ struct PreparedEditorAudioGenerationInput { prompt: String, model: String, generation_inputs: Option, - canvas_completion: Option, + canvas_completion: Option, price_mud_points: u32, generated: PreparedGeneratedEditorAudio, } diff --git a/server-rs/crates/shared-contracts/src/assets.rs b/server-rs/crates/shared-contracts/src/assets.rs index f06c23d9c..17c68664d 100644 --- a/server-rs/crates/shared-contracts/src/assets.rs +++ b/server-rs/crates/shared-contracts/src/assets.rs @@ -3,6 +3,7 @@ use std::collections::BTreeMap; use serde::{Deserialize, Serialize}; use serde_json::Value; +use crate::editor_canvas::EditorCanvasGenerationCompletionPayload; use crate::external_generation::ExternalGenerationJobStatusRecord; pub const EDITOR_ASSET_LABEL_MAX_CHARS: usize = 80; @@ -472,26 +473,6 @@ pub struct EditorVideoGenerateResponse { pub queue_state: Option, } -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct EditorCanvasGenerationPlaceholderPayload { - pub x: f64, - pub y: f64, - pub width: f64, - pub height: f64, - pub original_width: f64, - pub original_height: f64, -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct EditorCanvasGenerationCompletionPayload { - #[serde(default, skip_serializing_if = "Option::is_none")] - pub dialog_id: Option, - pub title: String, - pub placeholder: EditorCanvasGenerationPlaceholderPayload, -} - #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct EditorIconSpritesheetGenerateRequest { @@ -1106,6 +1087,7 @@ pub struct AssetBindingPayload { #[cfg(test)] mod tests { use super::*; + use crate::editor_canvas::EditorCanvasGenerationPlaceholderPayload; use serde_json::json; #[test] diff --git a/server-rs/crates/shared-contracts/src/editor_canvas.rs b/server-rs/crates/shared-contracts/src/editor_canvas.rs new file mode 100644 index 000000000..557f0f73b --- /dev/null +++ b/server-rs/crates/shared-contracts/src/editor_canvas.rs @@ -0,0 +1,36 @@ +//! 图片画布占位框与生成完成回填载荷。 +//! +//! 这些类型是纯 DTO,不依赖 OSS 契约,因此不放在受 `oss-contracts` feature +//! 门控的 `assets` 模块里:3D 生成等不带该 feature 的构建也需要引用它们。 + +use serde::{Deserialize, Serialize}; + +pub(crate) const EDITOR_CANVAS_TS_EXPORT_DIR: &str = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../../packages/shared/src/contracts/editor-canvas/" +); + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +#[derive(ts_rs::TS)] +#[ts(export, export_to = EDITOR_CANVAS_TS_EXPORT_DIR)] +pub struct EditorCanvasGenerationPlaceholderPayload { + pub x: f64, + pub y: f64, + pub width: f64, + pub height: f64, + pub original_width: f64, + pub original_height: f64, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +#[derive(ts_rs::TS)] +#[ts(export, export_to = EDITOR_CANVAS_TS_EXPORT_DIR)] +pub struct EditorCanvasGenerationCompletionPayload { + #[serde(default, skip_serializing_if = "Option::is_none")] + #[ts(optional = nullable)] + pub dialog_id: Option, + pub title: String, + pub placeholder: EditorCanvasGenerationPlaceholderPayload, +} diff --git a/server-rs/crates/shared-contracts/src/lib.rs b/server-rs/crates/shared-contracts/src/lib.rs index 19ad8557d..4848e2fe0 100644 --- a/server-rs/crates/shared-contracts/src/lib.rs +++ b/server-rs/crates/shared-contracts/src/lib.rs @@ -19,6 +19,7 @@ pub mod creation_entry_config; #[cfg(any())] pub mod creative_agent; pub mod editor_agent; +pub mod editor_canvas; pub mod editor_generation; pub mod error_reports; pub use editor_generation::{