storage generated assets metadata in external job payload (only for editor agent source)

This commit is contained in:
2026-07-15 15:47:17 +08:00
parent fda0931716
commit e39d5fb278
3 changed files with 247 additions and 24 deletions
@@ -19,7 +19,9 @@ use platform_editor_agent::agent::tools::generate_sound_effect::{
GenerateSoundEffectTool, GenerateSoundEffectToolArgs,
};
use platform_editor_agent::agent::tools::generate_ui_design::GenerateUiDesignTool;
use platform_editor_agent::agent::tools::generate_video::{GenerateVideoTool, GenerateVideoToolArgs};
use platform_editor_agent::agent::tools::generate_video::{
GenerateVideoTool, GenerateVideoToolArgs,
};
use platform_editor_agent::framework::tool::Tool;
use serde_json::Value;
use shared_contracts::assets::{EditorAudioGenerateResponse, EditorVideoGenerateResponse};
@@ -108,9 +110,9 @@ fn reconcile_completed_editor_agent_tool_call(
let response = result_payload_json
.ok_or_else(|| "生成任务缺少结果数据".to_string())
.and_then(|payload| serde_json::from_str::<Value>(payload).map_err(|e| e.to_string()))?
.get("response")
.get("editor-agent-tool-call-result")
.cloned()
.ok_or_else(|| "生成任务缺少 response 结果".to_string())?;
.ok_or_else(|| "生成任务缺少 Agent 工具调用结果".to_string())?;
let tool_call = message
.tool_call
.as_mut()
@@ -153,7 +155,7 @@ fn reconcile_completed_editor_agent_tool_call(
context: EditorToolContext::default(),
}
.format_execute_message(&args, &result);
tool_call.images = vec![resp_to_asset::editor_agent_generated_spritesheet(&result)];
tool_call.images = resp_to_asset::editor_agent_generated_spritesheet_images(&result);
}
GenerateVideoTool::NAME => {
let args: GenerateVideoToolArgs = parse_reconciled_value(&tool_call.args)?;
@@ -1,9 +1,11 @@
use serde_json::Value;
use shared_contracts::assets::{EditorAudioGenerateResponse, EditorVideoGenerateResponse};
use shared_contracts::editor_agent::{EditorAgentGeneratedAudio, EditorAgentGeneratedImage, EditorAgentGeneratedVideo};
use platform_editor_agent::agent::tools::edit_image::EditorImageEditResult;
use platform_editor_agent::agent::tools::generate_icon_spritesheet::EditorIconSpritesheetResult;
use platform_editor_agent::agent::tools::generate_image::EditorImageGenerationResult;
use serde_json::Value;
use shared_contracts::assets::{EditorAudioGenerateResponse, EditorVideoGenerateResponse};
use shared_contracts::editor_agent::{
EditorAgentGeneratedAudio, EditorAgentGeneratedImage, EditorAgentGeneratedVideo,
};
fn value_string(value: Option<&Value>, field: &str) -> Option<String> {
value
@@ -12,7 +14,9 @@ fn value_string(value: Option<&Value>, field: &str) -> Option<String> {
.map(ToOwned::to_owned)
}
pub fn editor_agent_generated_image(result: &EditorImageGenerationResult) -> EditorAgentGeneratedImage {
pub fn editor_agent_generated_image(
result: &EditorImageGenerationResult,
) -> EditorAgentGeneratedImage {
EditorAgentGeneratedImage {
resource_id: value_string(result.resource.as_ref(), "resourceId"),
object_key: result.object_key.clone(),
@@ -52,7 +56,32 @@ pub fn editor_agent_generated_spritesheet(
}
}
pub fn editor_agent_generated_video(result: &EditorVideoGenerateResponse) -> EditorAgentGeneratedVideo {
pub fn editor_agent_generated_spritesheet_images(
result: &EditorIconSpritesheetResult,
) -> Vec<EditorAgentGeneratedImage> {
let images = result
.icon_image_srcs
.iter()
.map(|image| EditorAgentGeneratedImage {
resource_id: value_string(image.resource.as_ref(), "resourceId"),
object_key: value_string(image.resource.as_ref(), "objectKey"),
asset_object_id: value_string(image.resource.as_ref(), "assetObjectId"),
image_src: image.image_src.clone(),
thumbnail_src: None,
width: Some(image.width),
height: Some(image.height),
})
.collect::<Vec<_>>();
if images.is_empty() {
vec![editor_agent_generated_spritesheet(result)]
} else {
images
}
}
pub fn editor_agent_generated_video(
result: &EditorVideoGenerateResponse,
) -> EditorAgentGeneratedVideo {
EditorAgentGeneratedVideo {
resource_id: value_string(result.resource.as_ref(), "resourceId"),
object_key: result.object_key.clone(),
@@ -64,7 +93,9 @@ pub fn editor_agent_generated_video(result: &EditorVideoGenerateResponse) -> Edi
}
}
pub fn editor_agent_generated_audio(result: &EditorAudioGenerateResponse) -> EditorAgentGeneratedAudio {
pub fn editor_agent_generated_audio(
result: &EditorAudioGenerateResponse,
) -> EditorAgentGeneratedAudio {
EditorAgentGeneratedAudio {
resource_id: value_string(result.resource.as_ref(), "resourceId"),
object_key: result.object_key.clone(),