move code
This commit is contained in:
@@ -205,7 +205,7 @@
|
||||
## 2026-07-03 画布Agent会话元数据入 SpacetimeDB、消息正文存 OSS
|
||||
|
||||
- 背景:图片画布工程需要对话式编辑历史,但消息正文随流式输出增长,不适合放入表行或画布布局快照;同时画布 Agent 只属于编辑器画布域,不能复用拼图 `creative-agent` 内存会话。
|
||||
- 决策:新增 `module-editor-agent` 承载纯领域规则,`editor_agent_conversation` 只保存会话元数据,完整消息以 `editor-agent/{conversationId}.json` 会话粒度存 OSS;`api-server` 负责编排 LLM、SSE、OSS 读写和既有生成工具调用。
|
||||
- 决策:`module-editor-agent` 只承载可供 SpacetimeDB WASM 使用的纯领域规则;Agent runner、工具实现和资产 DTO 迁入原生 `platform-editor-agent`,仅由 `api-server` 依赖。`editor_agent_conversation` 只保存会话元数据,完整消息以 `editor-agent/{conversationId}.json` 会话粒度存 OSS;`api-server` 负责编排 LLM、SSE、OSS 读写和既有生成工具调用。
|
||||
- 影响范围:图片画布右侧 Agent 面板、`shared-contracts` / `packages/shared` 的 `editorAgent` 契约、`spacetime-module` / `spacetime-client`、`platform-oss` 内部读签名边界、画布生成落板规则。
|
||||
- 验证方式:`npm run spacetime:generate`、`npm run check:spacetime-schema`、`cargo test -p module-editor-agent --manifest-path server-rs/Cargo.toml`、`cargo test -p api-server --manifest-path server-rs/Cargo.toml editor_agent`、前端 Agent 面板与 SSE client 定向测试、`npm run check:encoding`、`git diff --check`。
|
||||
- 关联文档:`docs/【编辑器】画布Agent对话面板-2026-07-03.md`、`docs/adr/【ADR】画布Agent会话消息存OSS-2026-07-03.md`、`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`。
|
||||
|
||||
Generated
+13
-4
@@ -238,6 +238,7 @@ dependencies = [
|
||||
"platform-agent",
|
||||
"platform-audio",
|
||||
"platform-auth",
|
||||
"platform-editor-agent",
|
||||
"platform-hyper3d",
|
||||
"platform-image",
|
||||
"platform-llm",
|
||||
@@ -3153,12 +3154,8 @@ dependencies = [
|
||||
name = "module-editor-agent"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"hmac",
|
||||
"platform-llm",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"sha2",
|
||||
"shared-contracts",
|
||||
"shared-kernel",
|
||||
"spacetimedb",
|
||||
]
|
||||
@@ -4445,6 +4442,18 @@ dependencies = [
|
||||
"urlencoding",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "platform-editor-agent"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"hmac",
|
||||
"platform-llm",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"sha2",
|
||||
"shared-contracts",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "platform-hyper3d"
|
||||
version = "0.1.0"
|
||||
|
||||
@@ -42,6 +42,7 @@ members = [
|
||||
"crates/platform-wechat",
|
||||
"crates/platform-speech",
|
||||
"crates/platform-agent",
|
||||
"crates/platform-editor-agent",
|
||||
"crates/pingora-gateway",
|
||||
"crates/server-manager-panel",
|
||||
"crates/shared-contracts",
|
||||
@@ -84,6 +85,7 @@ module-square-hole = { path = "crates/module-square-hole", default-features = fa
|
||||
module-story = { path = "crates/module-story", default-features = false }
|
||||
module-visual-novel = { path = "crates/module-visual-novel", default-features = false }
|
||||
platform-agent = { path = "crates/platform-agent", default-features = false }
|
||||
platform-editor-agent = { path = "crates/platform-editor-agent", default-features = false }
|
||||
platform-auth = { path = "crates/platform-auth", default-features = false }
|
||||
platform-audio = { path = "crates/platform-audio", default-features = false }
|
||||
platform-hyper3d = { path = "crates/platform-hyper3d", default-features = false }
|
||||
|
||||
@@ -38,6 +38,7 @@ module-square-hole = { workspace = true }
|
||||
module-story = { workspace = true }
|
||||
module-visual-novel = { workspace = true }
|
||||
platform-agent = { workspace = true }
|
||||
platform-editor-agent = { workspace = true }
|
||||
platform-audio = { workspace = true }
|
||||
platform-auth = { workspace = true }
|
||||
platform-hyper3d = { workspace = true }
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
use axum::extract::{Path, State};
|
||||
use axum::{Extension, Json};
|
||||
use module_editor_agent::framework::agent_builder::AgentBuilder;
|
||||
use module_editor_agent::framework::error::PromptError;
|
||||
use module_editor_agent::framework::memory::VecMemory;
|
||||
use module_editor_agent::framework::run::PromptOutput;
|
||||
use module_editor_agent::framework::tool::Tool;
|
||||
use module_editor_agent::{
|
||||
EDITOR_AGENT_CONVERSATION_ID_PREFIX, EDITOR_AGENT_DEFAULT_CONVERSATION_TITLE,
|
||||
derive_conversation_title, editor_agent_messages_object_key,
|
||||
};
|
||||
use platform_editor_agent::framework::agent_builder::AgentBuilder;
|
||||
use platform_editor_agent::framework::error::PromptError;
|
||||
use platform_editor_agent::framework::memory::VecMemory;
|
||||
use platform_editor_agent::framework::run::PromptOutput;
|
||||
use platform_editor_agent::framework::tool::Tool;
|
||||
use platform_llm::LlmMessage;
|
||||
use serde::Serialize;
|
||||
use serde_json::{Value, json};
|
||||
@@ -54,22 +54,26 @@ use crate::editor_project::{current_utc_micros, map_editor_project_error};
|
||||
use crate::http_error::AppError;
|
||||
use crate::request_context::RequestContext;
|
||||
use crate::state::AppState;
|
||||
use module_editor_agent::agent::agent::LlmChatAgentBuilder;
|
||||
use module_editor_agent::agent::tools::context::EditorToolContext;
|
||||
use module_editor_agent::agent::tools::edit_image::{EditImageTool, EditImageToolArgs};
|
||||
use module_editor_agent::agent::tools::generate_background_music::{
|
||||
use platform_editor_agent::agent::agent::LlmChatAgentBuilder;
|
||||
use platform_editor_agent::agent::tools::context::EditorToolContext;
|
||||
use platform_editor_agent::agent::tools::edit_image::{EditImageTool, EditImageToolArgs};
|
||||
use platform_editor_agent::agent::tools::generate_background_music::{
|
||||
GenerateBackgroundMusicTool, GenerateBackgroundMusicToolArgs,
|
||||
};
|
||||
use module_editor_agent::agent::tools::generate_character::GenerateCharacterTool;
|
||||
use module_editor_agent::agent::tools::generate_icon_spritesheet::{
|
||||
use platform_editor_agent::agent::tools::generate_character::GenerateCharacterTool;
|
||||
use platform_editor_agent::agent::tools::generate_icon_spritesheet::{
|
||||
GenerateIconSpritesheetTool, GenerateIconSpritesheetToolArgs,
|
||||
};
|
||||
use module_editor_agent::agent::tools::generate_image::{GenerateImageTool, GenerateImageToolArgs};
|
||||
use module_editor_agent::agent::tools::generate_sound_effect::{
|
||||
use platform_editor_agent::agent::tools::generate_image::{
|
||||
GenerateImageTool, GenerateImageToolArgs,
|
||||
};
|
||||
use platform_editor_agent::agent::tools::generate_sound_effect::{
|
||||
GenerateSoundEffectTool, GenerateSoundEffectToolArgs,
|
||||
};
|
||||
use module_editor_agent::agent::tools::generate_ui_design::GenerateUiDesignTool;
|
||||
use module_editor_agent::agent::tools::generate_video::{GenerateVideoTool, GenerateVideoToolArgs};
|
||||
use platform_editor_agent::agent::tools::generate_ui_design::GenerateUiDesignTool;
|
||||
use platform_editor_agent::agent::tools::generate_video::{
|
||||
GenerateVideoTool, GenerateVideoToolArgs,
|
||||
};
|
||||
use shared_kernel::{build_prefixed_uuid_id, normalize_optional_string};
|
||||
|
||||
pub async fn editor_agent_message(
|
||||
@@ -188,7 +192,7 @@ pub async fn editor_agent_message(
|
||||
.tool(GenerateCharacterTool {
|
||||
context: tool_context.clone(),
|
||||
})
|
||||
// TODO icons gen's result query is not prepared for now.
|
||||
// TODO icons gen's result query is not prepared for now.
|
||||
// .tool(GenerateIconSpritesheetTool {
|
||||
// context: tool_context.clone(),
|
||||
// })
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
use module_editor_agent::agent::tools::context::EditorToolContext;
|
||||
use platform_editor_agent::agent::tools::context::EditorToolContext;
|
||||
use crate::editor_agent::utils::IntoDataKey;
|
||||
use shared_contracts::editor_agent::EditorAgentConversationMessagesDocument;
|
||||
use std::collections::HashMap;
|
||||
use module_editor_agent::agent::asset::{ImageId, ImageMetadata};
|
||||
use platform_editor_agent::agent::asset::{ImageId, ImageMetadata};
|
||||
|
||||
pub fn build_tool_context(document: &EditorAgentConversationMessagesDocument) -> EditorToolContext {
|
||||
let mut images: HashMap<ImageId, ImageMetadata> = HashMap::new();
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
use serde_json::Value;
|
||||
use module_editor_agent::framework::error::PromptError;
|
||||
use module_editor_agent::framework::tool::Tool;
|
||||
use platform_editor_agent::framework::error::PromptError;
|
||||
use platform_editor_agent::framework::tool::Tool;
|
||||
use shared_contracts::editor_agent::{EditorAgentConversationMessagesDocument, EditorAgentToolCallDisplayArgs, EditorAgentToolCallDisplayExtras, EditorAgentToolCallImageArg, EditorAgentToolCallImageRef, EditorAgentToolCallStringArg};
|
||||
use crate::editor_agent::pricing::EditorAgentPricedTool;
|
||||
use module_editor_agent::agent::tools::context::EditorToolContext;
|
||||
use module_editor_agent::agent::tools::edit_image::{EditImageTool, EditImageToolArgs};
|
||||
use module_editor_agent::agent::tools::generate_background_music::{GenerateBackgroundMusicTool, GenerateBackgroundMusicToolArgs};
|
||||
use module_editor_agent::agent::tools::generate_character::GenerateCharacterTool;
|
||||
use module_editor_agent::agent::tools::generate_icon_spritesheet::{GenerateIconSpritesheetTool, GenerateIconSpritesheetToolArgs};
|
||||
use module_editor_agent::agent::tools::generate_image::{GenerateImageTool, GenerateImageToolArgs};
|
||||
use module_editor_agent::agent::tools::generate_sound_effect::{GenerateSoundEffectTool, GenerateSoundEffectToolArgs};
|
||||
use module_editor_agent::agent::tools::generate_ui_design::GenerateUiDesignTool;
|
||||
use module_editor_agent::agent::tools::generate_video::{GenerateVideoTool, GenerateVideoToolArgs};
|
||||
use module_editor_agent::agent::asset::ImageId;
|
||||
use platform_editor_agent::agent::tools::context::EditorToolContext;
|
||||
use platform_editor_agent::agent::tools::edit_image::{EditImageTool, EditImageToolArgs};
|
||||
use platform_editor_agent::agent::tools::generate_background_music::{GenerateBackgroundMusicTool, GenerateBackgroundMusicToolArgs};
|
||||
use platform_editor_agent::agent::tools::generate_character::GenerateCharacterTool;
|
||||
use platform_editor_agent::agent::tools::generate_icon_spritesheet::{GenerateIconSpritesheetTool, GenerateIconSpritesheetToolArgs};
|
||||
use platform_editor_agent::agent::tools::generate_image::{GenerateImageTool, GenerateImageToolArgs};
|
||||
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::asset::ImageId;
|
||||
use crate::editor_agent::utils::{IntoDataKey, IntoImageId};
|
||||
use crate::editor_generation_config::EditorGenerationPricingConfig;
|
||||
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
use std::collections::HashMap;
|
||||
use module_editor_agent::framework::tool::Tool;
|
||||
use platform_editor_agent::framework::tool::Tool;
|
||||
use platform_image::GPT_IMAGE_2_MODEL;
|
||||
use module_editor_agent::agent::tools::context::EditorToolContext;
|
||||
use module_editor_agent::agent::tools::edit_image::{EditImageTool, EditImageToolArgs};
|
||||
use module_editor_agent::agent::tools::generate_background_music::{
|
||||
use platform_editor_agent::agent::tools::context::EditorToolContext;
|
||||
use platform_editor_agent::agent::tools::edit_image::{EditImageTool, EditImageToolArgs};
|
||||
use platform_editor_agent::agent::tools::generate_background_music::{
|
||||
GenerateBackgroundMusicTool, GenerateBackgroundMusicToolArgs,
|
||||
};
|
||||
use module_editor_agent::agent::tools::generate_character::GenerateCharacterTool;
|
||||
use module_editor_agent::agent::tools::generate_icon_spritesheet::{
|
||||
use platform_editor_agent::agent::tools::generate_character::GenerateCharacterTool;
|
||||
use platform_editor_agent::agent::tools::generate_icon_spritesheet::{
|
||||
GenerateIconSpritesheetTool, GenerateIconSpritesheetToolArgs,
|
||||
};
|
||||
use module_editor_agent::agent::tools::generate_image::{GenerateImageTool, GenerateImageToolArgs};
|
||||
use module_editor_agent::agent::tools::generate_sound_effect::{
|
||||
use platform_editor_agent::agent::tools::generate_image::{GenerateImageTool, GenerateImageToolArgs};
|
||||
use platform_editor_agent::agent::tools::generate_sound_effect::{
|
||||
GenerateSoundEffectTool, GenerateSoundEffectToolArgs,
|
||||
};
|
||||
use module_editor_agent::agent::tools::generate_ui_design::GenerateUiDesignTool;
|
||||
use module_editor_agent::agent::tools::generate_video::{GenerateVideoTool, GenerateVideoToolArgs};
|
||||
use platform_editor_agent::agent::tools::generate_ui_design::GenerateUiDesignTool;
|
||||
use platform_editor_agent::agent::tools::generate_video::{GenerateVideoTool, GenerateVideoToolArgs};
|
||||
use crate::editor_generation_config::{load_editor_generation_pricing_from_paths, EditorGenerationPricingConfig};
|
||||
|
||||
fn context() -> EditorToolContext {
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
use crate::editor_agent::resp_to_asset;
|
||||
use crate::http_error::AppError;
|
||||
use crate::state::AppState;
|
||||
use module_editor_agent::agent::tools::context::EditorToolContext;
|
||||
use module_editor_agent::agent::tools::edit_image::{
|
||||
use platform_editor_agent::agent::tools::context::EditorToolContext;
|
||||
use platform_editor_agent::agent::tools::edit_image::{
|
||||
EditImageTool, EditImageToolArgs, EditorImageEditResult,
|
||||
};
|
||||
use module_editor_agent::agent::tools::generate_background_music::{
|
||||
use platform_editor_agent::agent::tools::generate_background_music::{
|
||||
GenerateBackgroundMusicTool, GenerateBackgroundMusicToolArgs,
|
||||
};
|
||||
use module_editor_agent::agent::tools::generate_character::GenerateCharacterTool;
|
||||
use module_editor_agent::agent::tools::generate_icon_spritesheet::{
|
||||
use platform_editor_agent::agent::tools::generate_character::GenerateCharacterTool;
|
||||
use platform_editor_agent::agent::tools::generate_icon_spritesheet::{
|
||||
EditorIconSpritesheetResult, GenerateIconSpritesheetTool, GenerateIconSpritesheetToolArgs,
|
||||
};
|
||||
use module_editor_agent::agent::tools::generate_image::{
|
||||
use platform_editor_agent::agent::tools::generate_image::{
|
||||
EditorImageGenerationResult, GenerateImageTool, GenerateImageToolArgs,
|
||||
};
|
||||
use module_editor_agent::agent::tools::generate_sound_effect::{
|
||||
use platform_editor_agent::agent::tools::generate_sound_effect::{
|
||||
GenerateSoundEffectTool, GenerateSoundEffectToolArgs,
|
||||
};
|
||||
use module_editor_agent::agent::tools::generate_ui_design::GenerateUiDesignTool;
|
||||
use module_editor_agent::agent::tools::generate_video::{GenerateVideoTool, GenerateVideoToolArgs};
|
||||
use module_editor_agent::framework::tool::Tool;
|
||||
use platform_editor_agent::agent::tools::generate_ui_design::GenerateUiDesignTool;
|
||||
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};
|
||||
use shared_contracts::editor_agent::{
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
use serde_json::Value;
|
||||
use shared_contracts::assets::{EditorAudioGenerateResponse, EditorVideoGenerateResponse};
|
||||
use shared_contracts::editor_agent::{EditorAgentGeneratedAudio, EditorAgentGeneratedImage, EditorAgentGeneratedVideo};
|
||||
use module_editor_agent::agent::tools::edit_image::EditorImageEditResult;
|
||||
use module_editor_agent::agent::tools::generate_icon_spritesheet::EditorIconSpritesheetResult;
|
||||
use module_editor_agent::agent::tools::generate_image::EditorImageGenerationResult;
|
||||
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;
|
||||
|
||||
fn value_string(value: Option<&Value>, field: &str) -> Option<String> {
|
||||
value
|
||||
|
||||
@@ -22,7 +22,7 @@ use spacetime_client::{
|
||||
};
|
||||
use std::collections::BTreeMap;
|
||||
use std::sync::{Arc, Mutex, OnceLock};
|
||||
use module_editor_agent::agent::asset::ImageId;
|
||||
use platform_editor_agent::agent::asset::ImageId;
|
||||
|
||||
pub trait IntoDataKey {
|
||||
fn into_data_key(self) -> String;
|
||||
@@ -107,7 +107,7 @@ impl IntoResourceId for EditorAssetRecord {
|
||||
|
||||
#[cfg(test)]
|
||||
mod image_id_tests {
|
||||
use module_editor_agent::agent::asset::ImageId;
|
||||
use platform_editor_agent::agent::asset::ImageId;
|
||||
|
||||
#[test]
|
||||
fn image_id_is_a_stable_hash_of_the_data_key() {
|
||||
|
||||
@@ -13,7 +13,3 @@ serde = { workspace = true }
|
||||
serde_json = { workspace = true }
|
||||
shared-kernel = { workspace = true }
|
||||
spacetimedb = { workspace = true, optional = true }
|
||||
platform-llm = { workspace = true }
|
||||
shared-contracts = { workspace = true }
|
||||
hmac = { workspace = true }
|
||||
sha2 = { workspace = true }
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
pub mod agent;
|
||||
mod application;
|
||||
mod commands;
|
||||
mod domain;
|
||||
mod errors;
|
||||
pub mod framework;
|
||||
|
||||
pub use application::*;
|
||||
pub use commands::*;
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
[package]
|
||||
name = "platform-editor-agent"
|
||||
edition.workspace = true
|
||||
version.workspace = true
|
||||
license.workspace = true
|
||||
|
||||
[dependencies]
|
||||
hmac = { workspace = true }
|
||||
platform-llm = { workspace = true }
|
||||
serde = { workspace = true }
|
||||
serde_json = { workspace = true }
|
||||
sha2 = { workspace = true }
|
||||
shared-contracts = { workspace = true, features = ["oss-contracts"] }
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
pub mod agent;
|
||||
pub mod tools;
|
||||
pub mod asset;
|
||||
pub mod agent;
|
||||
+1
-1
@@ -19,4 +19,4 @@ impl EditorToolContext {
|
||||
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
|
||||
pub struct EditorToolContext {
|
||||
pub images: HashMap<ImageId, ImageMetadata>,
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user