This commit is contained in:
2026-04-28 19:36:39 +08:00
parent a9febe7678
commit f0471a4f8d
206 changed files with 18456 additions and 10133 deletions

View File

@@ -350,6 +350,8 @@ pub struct CharacterWorkflowCachePayload {
pub cache_scope_id: Option<String>,
pub visual_prompt_text: String,
pub animation_prompt_text: String,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub animation_prompt_text_by_key: BTreeMap<String, String>,
pub visual_drafts: Vec<CharacterVisualDraftPayload>,
pub selected_visual_draft_id: String,
pub selected_animation: String,
@@ -376,6 +378,8 @@ pub struct CharacterWorkflowCacheSaveRequest {
#[serde(default)]
pub animation_prompt_text: Option<String>,
#[serde(default)]
pub animation_prompt_text_by_key: BTreeMap<String, String>,
#[serde(default)]
pub visual_drafts: Vec<CharacterVisualDraftPayload>,
#[serde(default)]
pub selected_visual_draft_id: Option<String>,
@@ -398,6 +402,91 @@ pub struct CharacterWorkflowCacheGetResponse {
pub cache: Option<CharacterWorkflowCachePayload>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CharacterAssetRolePromptInput {
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub title: String,
#[serde(default)]
pub role: String,
#[serde(default)]
pub visual_description: Option<String>,
#[serde(default)]
pub action_description: Option<String>,
#[serde(default)]
pub scene_visual_description: Option<String>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub backstory: Option<String>,
#[serde(default)]
pub personality: Option<String>,
#[serde(default)]
pub motivation: Option<String>,
#[serde(default)]
pub combat_style: Option<String>,
#[serde(default)]
pub tags: Vec<String>,
#[serde(default)]
pub image_src: Option<String>,
#[serde(default)]
pub generated_visual_asset_id: Option<String>,
#[serde(default)]
pub generated_animation_set_id: Option<String>,
#[serde(default)]
pub animation_map: Option<Value>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct CharacterRolePromptBundlePayload {
pub visual_prompt_text: String,
pub animation_prompt_text: String,
pub scene_prompt_text: String,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CharacterRoleAssetWorkflowPayload {
pub role: CharacterAssetRolePromptInput,
pub default_prompt_bundle: CharacterRolePromptBundlePayload,
pub visual_prompt_text: String,
pub animation_prompt_text: String,
pub animation_prompt_text_by_key: BTreeMap<String, String>,
pub visual_drafts: Vec<CharacterVisualDraftPayload>,
pub selected_visual_draft_id: String,
pub selected_animation: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub image_src: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub generated_visual_asset_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub generated_animation_set_id: Option<String>,
#[serde(default)]
pub animation_map: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CharacterRoleAssetWorkflowResolveRequest {
#[serde(default)]
pub cache_scope_id: Option<String>,
pub role: CharacterAssetRolePromptInput,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CharacterRoleAssetWorkflowResponse {
pub ok: bool,
pub cache: Option<CharacterWorkflowCachePayload>,
pub workflow: CharacterRoleAssetWorkflowPayload,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CharacterWorkflowCacheSaveResponse {
@@ -767,6 +856,10 @@ mod tests {
cache_scope_id: Some("world-01".to_string()),
visual_prompt_text: "主形象".to_string(),
animation_prompt_text: "待机".to_string(),
animation_prompt_text_by_key: BTreeMap::from([(
"idle".to_string(),
"待机".to_string(),
)]),
visual_drafts: vec![CharacterVisualDraftPayload {
id: "draft-1".to_string(),
label: "候选 1".to_string(),
@@ -790,6 +883,10 @@ mod tests {
assert_eq!(payload["ok"], json!(true));
assert_eq!(payload["cache"]["characterId"], json!("hero"));
assert_eq!(payload["cache"]["cacheScopeId"], json!("world-01"));
assert_eq!(
payload["cache"]["animationPromptTextByKey"]["idle"],
json!("待机")
);
assert_eq!(
payload["cache"]["visualDrafts"][0]["imageSrc"],
json!("/generated-character-drafts/hero/visual/job/candidate.svg")