diff --git a/docs/【编辑器】画布Agent对话面板-2026-07-03.md b/docs/【编辑器】画布Agent对话面板-2026-07-03.md index 8e31e7744..b0ce4fdf9 100644 --- a/docs/【编辑器】画布Agent对话面板-2026-07-03.md +++ b/docs/【编辑器】画布Agent对话面板-2026-07-03.md @@ -77,7 +77,6 @@ - 工具消息不再保存独立 `status`。OSS 文档只保存可选 `externalJobId` 与确认前取消时间 `cancelledAt`:两者都为空表示待确认,只有 `cancelledAt` 表示已取消;存在 `externalJobId` 时,排队、执行、完成和失败状态统一读取 SpacetimeDB `external_generation_job`,不得在 OSS 中复制第二套执行状态。 - 确认接口必须先把工具参数转换为既有编辑器 worker payload,再使用 `editor-agent:{conversationId}:{messageId}:{toolName}` 稳定 dedupe key 入队;同一确认的请求重试只能得到同一个 external job。入队成功后把返回的 job id 写回同一条 OSS 工具消息,不新增 Agent 工具执行关联表。 - 前端根据 `externalJobId` 查询通用 external-generation job 状态;worker 继续通过 `canvasCompletion` 把生成结果写回工程与素材库。浏览器断线、刷新或 api-server 重启不得导致确认接口重新扣费或重新提交 provider。 -- worker 成功时把既有编辑器生成回包写入该 job 的 `result_payload_json`;通用 job 状态接口只读返回其中的 `result` 投影,Agent 卡据此恢复图片、视频或音频预览。该投影属于 SpacetimeDB job,不回写 OSS 对话文档。 - `EditorAgentToolCall.args` 保留为工具返回的原始 JSON,是确认接口重新反序列化并执行工具的唯一参数真相。图片参数继续只保存由真实 data key 计算出的 opaque SHA-256 `imageId`;不得为了前端预览把 `args` 中的图片 ID 改写成 `objectKey`、URL 或展示对象,也不得由前端重组或回传一份新的执行参数。 - `EditorAgentToolCall.displayArgs` 是必填、只读的用户确认展示投影,与 `args` 分离: - `stringArgs` 保存提示词、比例、清晰度、模型、时长等可展示参数的稳定名称、用户可见标题和值; diff --git a/packages/shared/src/contracts/externalGeneration.ts b/packages/shared/src/contracts/externalGeneration.ts index 308ca0c8a..24919afec 100644 --- a/packages/shared/src/contracts/externalGeneration.ts +++ b/packages/shared/src/contracts/externalGeneration.ts @@ -23,7 +23,6 @@ export interface ExternalGenerationJobStatusRecord { progress: number; error?: string | null; updatedAtMicros: number; - result?: unknown; } export interface ExternalGenerationJobStatusResponse { diff --git a/server-rs/crates/api-server/src/editor_generation_queue.rs b/server-rs/crates/api-server/src/editor_generation_queue.rs index e0f9f2008..640aa6dc9 100644 --- a/server-rs/crates/api-server/src/editor_generation_queue.rs +++ b/server-rs/crates/api-server/src/editor_generation_queue.rs @@ -172,7 +172,6 @@ pub(crate) fn editor_generation_queue_state( progress: 8, error: job.last_error_message, updated_at_micros: job.updated_at_micros, - result: None, } } diff --git a/server-rs/crates/api-server/src/external_generation.rs b/server-rs/crates/api-server/src/external_generation.rs index 80634fcc2..5d3bacc4b 100644 --- a/server-rs/crates/api-server/src/external_generation.rs +++ b/server-rs/crates/api-server/src/external_generation.rs @@ -180,11 +180,6 @@ fn map_external_generation_job_status( progress, error: job.last_error_message.clone(), updated_at_micros: job.updated_at_micros, - result: job - .result_payload_json - .as_deref() - .and_then(|payload| serde_json::from_str::(payload).ok()) - .and_then(|payload| payload.get("response").cloned()), } } 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 2bb0bbead..993a75ad9 100644 --- a/server-rs/crates/api-server/src/external_generation_worker.rs +++ b/server-rs/crates/api-server/src/external_generation_worker.rs @@ -671,9 +671,7 @@ async fn process_external_generation_job_once( ) .await { - Ok(result) => { - complete_editor_generation_job(&state, &worker_id, &job, result.0).await - } + Ok(_) => complete_editor_generation_job(&state, &worker_id, &job).await, Err(error) => { let message = error.body_text(); fail_job(&state, &worker_id, &job, message.clone()).await?; @@ -701,9 +699,7 @@ async fn process_external_generation_job_once( ) .await { - Ok(result) => { - complete_editor_generation_job(&state, &worker_id, &job, result.0).await - } + Ok(_) => complete_editor_generation_job(&state, &worker_id, &job).await, Err(error) => { let message = error.body_text(); fail_job(&state, &worker_id, &job, message.clone()).await?; @@ -732,9 +728,7 @@ async fn process_external_generation_job_once( ) .await { - Ok(result) => { - complete_editor_generation_job(&state, &worker_id, &job, result.0).await - } + Ok(_) => complete_editor_generation_job(&state, &worker_id, &job).await, Err(error) => { let message = error.body_text(); fail_job(&state, &worker_id, &job, message.clone()).await?; @@ -762,9 +756,7 @@ async fn process_external_generation_job_once( ) .await { - Ok(result) => { - complete_editor_generation_job(&state, &worker_id, &job, result.0).await - } + Ok(_) => complete_editor_generation_job(&state, &worker_id, &job).await, Err(error) => { let message = error.body_text(); fail_job(&state, &worker_id, &job, message.clone()).await?; @@ -792,9 +784,7 @@ async fn process_external_generation_job_once( ) .await { - Ok(result) => { - complete_editor_generation_job(&state, &worker_id, &job, result.0).await - } + Ok(_) => complete_editor_generation_job(&state, &worker_id, &job).await, Err(error) => { let message = error.body_text(); fail_job(&state, &worker_id, &job, message.clone()).await?; @@ -823,9 +813,7 @@ async fn process_external_generation_job_once( ) .await { - Ok(result) => { - complete_editor_generation_job(&state, &worker_id, &job, result.0).await - } + Ok(_) => complete_editor_generation_job(&state, &worker_id, &job).await, Err(response) => { let message = response_error_message(response).await; fail_job(&state, &worker_id, &job, message.clone()).await?; @@ -854,9 +842,7 @@ async fn process_external_generation_job_once( ) .await { - Ok(result) => { - complete_editor_generation_job(&state, &worker_id, &job, result.0).await - } + Ok(_) => complete_editor_generation_job(&state, &worker_id, &job).await, Err(response) => { let message = response_error_message(response).await; fail_job(&state, &worker_id, &job, message.clone()).await?; @@ -885,9 +871,7 @@ async fn process_external_generation_job_once( ) .await { - Ok(result) => { - complete_editor_generation_job(&state, &worker_id, &job, result.0).await - } + Ok(_) => complete_editor_generation_job(&state, &worker_id, &job).await, Err(response) => { let message = response_error_message(response).await; fail_job(&state, &worker_id, &job, message.clone()).await?; @@ -916,9 +900,7 @@ async fn process_external_generation_job_once( ) .await { - Ok(result) => { - complete_editor_generation_job(&state, &worker_id, &job, result.0).await - } + Ok(_) => complete_editor_generation_job(&state, &worker_id, &job).await, Err(response) => { let message = response_error_message(response).await; fail_job(&state, &worker_id, &job, message.clone()).await?; @@ -1023,7 +1005,6 @@ async fn complete_editor_generation_job( state: &AppState, worker_id: &str, job: &ExternalGenerationJobRecord, - result: serde_json::Value, ) -> Result<(), String> { complete_job( state, @@ -1033,7 +1014,6 @@ async fn complete_editor_generation_job( json!({ "sourceModule": job.source_module.clone(), "sourceEntityId": job.source_entity_id.clone(), - "response": result, }) .to_string(), ), diff --git a/server-rs/crates/api-server/src/jump_hop.rs b/server-rs/crates/api-server/src/jump_hop.rs index 70fef9b71..a689909d0 100644 --- a/server-rs/crates/api-server/src/jump_hop.rs +++ b/server-rs/crates/api-server/src/jump_hop.rs @@ -354,7 +354,6 @@ fn map_jump_hop_queue_job_status( progress: 8, error: job.last_error_message, updated_at_micros: job.updated_at_micros, - result: None, } } diff --git a/server-rs/crates/api-server/src/puzzle.rs b/server-rs/crates/api-server/src/puzzle.rs index 472cb5b8e..13c042dde 100644 --- a/server-rs/crates/api-server/src/puzzle.rs +++ b/server-rs/crates/api-server/src/puzzle.rs @@ -262,7 +262,6 @@ fn map_puzzle_queue_job_status( .unwrap_or(100), error: job.last_error_message.clone(), updated_at_micros: job.updated_at_micros, - result: None, } } diff --git a/server-rs/crates/api-server/src/puzzle_clear.rs b/server-rs/crates/api-server/src/puzzle_clear.rs index d09fca18e..77f50d6db 100644 --- a/server-rs/crates/api-server/src/puzzle_clear.rs +++ b/server-rs/crates/api-server/src/puzzle_clear.rs @@ -331,7 +331,6 @@ fn map_puzzle_clear_queue_job_status( progress: 8, error: job.last_error_message, updated_at_micros: job.updated_at_micros, - result: None, } } diff --git a/server-rs/crates/api-server/src/wooden_fish.rs b/server-rs/crates/api-server/src/wooden_fish.rs index d3902829a..ba6214920 100644 --- a/server-rs/crates/api-server/src/wooden_fish.rs +++ b/server-rs/crates/api-server/src/wooden_fish.rs @@ -340,7 +340,6 @@ fn map_wooden_fish_queue_job_status( progress: 8, error: job.last_error_message, updated_at_micros: job.updated_at_micros, - result: None, } } diff --git a/server-rs/crates/shared-contracts/src/external_generation.rs b/server-rs/crates/shared-contracts/src/external_generation.rs index a9bddeaaa..004574c81 100644 --- a/server-rs/crates/shared-contracts/src/external_generation.rs +++ b/server-rs/crates/shared-contracts/src/external_generation.rs @@ -34,8 +34,6 @@ pub struct ExternalGenerationJobStatusRecord { pub progress: u8, pub error: Option, pub updated_at_micros: i64, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub result: Option, } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] diff --git a/src/components/image-editor/EditorAgentConversation/MessageBubble.tsx b/src/components/image-editor/EditorAgentConversation/MessageBubble.tsx index c74198dcd..94545f036 100644 --- a/src/components/image-editor/EditorAgentConversation/MessageBubble.tsx +++ b/src/components/image-editor/EditorAgentConversation/MessageBubble.tsx @@ -111,26 +111,6 @@ function ToolCallView({ }; }, [onJobCompleted, toolCall.externalJobId]); const effectiveJobStatus = jobStatus ?? resolvedJob?.status ?? null; - const generationResult = - resolvedJob?.result && typeof resolvedJob.result === 'object' - ? (resolvedJob.result as Record) - : null; - const resultImageSrc = - typeof generationResult?.imageSrc === 'string' - ? generationResult.imageSrc - : null; - const resultVideoSrc = - typeof generationResult?.videoSrc === 'string' - ? generationResult.videoSrc - : null; - const resultAudioSrc = - typeof generationResult?.audioSrc === 'string' - ? generationResult.audioSrc - : null; - const resultObjectKey = - typeof generationResult?.objectKey === 'string' - ? generationResult.objectKey - : null; const isCancelled = Boolean(toolCall.cancelledAt); const isExecuting = effectiveJobStatus === 'queued' || effectiveJobStatus === 'running'; @@ -181,16 +161,6 @@ function ToolCallView({ ))} - ) : resultImageSrc ? ( -
- -
) : null} {videos.length ? (
@@ -214,16 +184,6 @@ function ToolCallView({
))} - ) : resultVideoSrc ? ( - ) : null} {audios.length ? (
@@ -249,15 +209,6 @@ function ToolCallView({
))} - ) : resultAudioSrc ? ( - ) : null} );