This commit is contained in:
2026-05-08 20:48:29 +08:00
parent abf1f1ebea
commit 94975e4735
82 changed files with 7786 additions and 1012 deletions

View File

@@ -520,8 +520,7 @@ mod tests {
})
.expect("event data should serialize"),
};
let catalog_payload =
serde_json::to_value(catalog_event).expect("event should serialize");
let catalog_payload = serde_json::to_value(catalog_event).expect("event should serialize");
assert_eq!(catalog_payload["event"], json!("puzzle_template_catalog"));
assert_eq!(
catalog_payload["data"]["templates"][0]["templateId"],

View File

@@ -28,6 +28,13 @@ pub enum VisualNovelAssetSource {
External,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum VisualNovelAudioGenerationKind {
BackgroundMusic,
SoundEffect,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum VisualNovelSceneAvailability {
@@ -407,6 +414,59 @@ pub struct VisualNovelCompileResponse {
pub work: VisualNovelWorkDetail,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct CreateVisualNovelBackgroundMusicRequest {
pub prompt: String,
pub title: String,
#[serde(default)]
pub tags: Option<String>,
#[serde(default)]
pub model: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct CreateVisualNovelSoundEffectRequest {
pub prompt: String,
#[serde(default)]
pub duration: Option<u8>,
#[serde(default)]
pub seed: Option<u64>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct VisualNovelAudioGenerationTaskResponse {
pub kind: VisualNovelAudioGenerationKind,
pub task_id: String,
pub provider: String,
pub status: String,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct PublishVisualNovelGeneratedAudioAssetRequest {
pub scene_id: String,
#[serde(default)]
pub profile_id: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct VisualNovelGeneratedAudioAssetResponse {
pub kind: VisualNovelAudioGenerationKind,
pub task_id: String,
pub provider: String,
pub status: String,
#[serde(default)]
pub asset_object_id: Option<String>,
#[serde(default)]
pub asset_kind: Option<String>,
#[serde(default)]
pub audio_src: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct SendVisualNovelMessageRequest {
@@ -671,6 +731,36 @@ mod tests {
assert_eq!(step_payload["sceneId"], json!("scene-1"));
}
#[test]
fn audio_generation_contracts_use_camel_case_fields() {
let request = CreateVisualNovelSoundEffectRequest {
prompt: "雨声".to_string(),
duration: Some(5),
seed: Some(12),
};
let payload = serde_json::to_value(request).expect("request should serialize");
assert_eq!(payload["duration"], json!(5));
assert_eq!(payload["seed"], json!(12));
let response = VisualNovelGeneratedAudioAssetResponse {
kind: VisualNovelAudioGenerationKind::SoundEffect,
task_id: "task-1".to_string(),
provider: "vector-engine-vidu".to_string(),
status: "completed".to_string(),
asset_object_id: Some("assetobj_1".to_string()),
asset_kind: Some("visual_novel_ambient_sound".to_string()),
audio_src: Some("/generated-custom-world-scenes/a.wav".to_string()),
};
let payload = serde_json::to_value(response).expect("response should serialize");
assert_eq!(payload["kind"], json!("sound_effect"));
assert_eq!(payload["taskId"], json!("task-1"));
assert_eq!(payload["assetObjectId"], json!("assetobj_1"));
assert_eq!(
payload["audioSrc"],
json!("/generated-custom-world-scenes/a.wav")
);
}
#[test]
fn runtime_stream_event_uses_tagged_envelope() {
let event = VisualNovelRuntimeStreamEvent::Step {