Merge pull request #612 from SuanmoSuanyangTechnology/feature/message-file

feat(workflow): move conversation file content into metadata
This commit is contained in:
Mark
2026-03-19 11:12:28 +08:00
committed by GitHub
6 changed files with 20 additions and 14 deletions

View File

@@ -8,6 +8,7 @@ from app.core.response_utils import success
from app.db import get_db from app.db import get_db
from app.dependencies import get_current_user from app.dependencies import get_current_user
from app.models import User from app.models import User
from app.schemas import conversation_schema
from app.schemas.response_schema import ApiResponse from app.schemas.response_schema import ApiResponse
from app.services.conversation_service import ConversationService from app.services.conversation_service import ConversationService
@@ -90,11 +91,7 @@ def get_messages(
conversation_id, conversation_id,
) )
messages = [ messages = [
{ conversation_schema.Message.model_validate(message)
"role": message.role,
"content": message.content,
"created_at": int(message.created_at.timestamp() * 1000),
}
for message in messages_obj for message in messages_obj
] ]
return success(data=messages, msg="get conversation history success") return success(data=messages, msg="get conversation history success")

View File

@@ -13,7 +13,6 @@ from app.core.logging_config import get_business_logger
from app.core.response_utils import success, fail from app.core.response_utils import success, fail
from app.db import get_db, get_db_read from app.db import get_db, get_db_read
from app.dependencies import get_share_user_id, ShareTokenData from app.dependencies import get_share_user_id, ShareTokenData
from app.models.app_model import App
from app.models.app_model import AppType from app.models.app_model import AppType
from app.repositories import knowledge_repository from app.repositories import knowledge_repository
from app.repositories.end_user_repository import EndUserRepository from app.repositories.end_user_repository import EndUserRepository
@@ -618,11 +617,11 @@ async def chat(
# 多 Agent 非流式返回 # 多 Agent 非流式返回
result = await app_chat_service.workflow_chat( result = await app_chat_service.workflow_chat(
message=payload.message, message=payload.message,
conversation_id=conversation.id, # 使用已创建的会话 ID conversation_id=conversation.id, # 使用已创建的会话 ID
user_id=end_user_id, # 转换为字符串 user_id=end_user_id, # 转换为字符串
variables=payload.variables, variables=payload.variables,
files=payload.files,
config=config, config=config,
web_search=payload.web_search, web_search=payload.web_search,
memory=payload.memory, memory=payload.memory,

View File

@@ -280,6 +280,7 @@ async def chat(
memory=memory, memory=memory,
storage_type=storage_type, storage_type=storage_type,
user_rag_memory_id=user_rag_memory_id, user_rag_memory_id=user_rag_memory_id,
files=payload.files,
app_id=app.id, app_id=app.id,
workspace_id=workspace_id, workspace_id=workspace_id,
release_id=app.current_release.id release_id=app.current_release.id

View File

@@ -51,6 +51,10 @@ class Message(BaseModel):
def _serialize_created_at(self, dt: datetime.datetime): def _serialize_created_at(self, dt: datetime.datetime):
return int(dt.timestamp() * 1000) if dt else None return int(dt.timestamp() * 1000) if dt else None
@field_serializer("meta_data", when_used="json")
def _serialize_meta_data(self, data: Optional[Dict[str, Any]]):
return data or {}
class Conversation(BaseModel): class Conversation(BaseModel):
"""会话输出""" """会话输出"""

View File

@@ -623,6 +623,7 @@ class AppChatService:
app_id: uuid.UUID, app_id: uuid.UUID,
release_id: uuid.UUID, release_id: uuid.UUID,
workspace_id: uuid.UUID, workspace_id: uuid.UUID,
files: Optional[List[FileInput]] = None,
user_id: Optional[str] = None, user_id: Optional[str] = None,
variables: Optional[Dict[str, Any]] = None, variables: Optional[Dict[str, Any]] = None,
web_search: bool = False, web_search: bool = False,
@@ -636,7 +637,8 @@ class AppChatService:
variables=variables, variables=variables,
conversation_id=str(conversation_id), conversation_id=str(conversation_id),
stream=True, stream=True,
user_id=user_id user_id=user_id,
files=files
) )
return await self.workflow_service.run( return await self.workflow_service.run(
app_id=app_id, app_id=app_id,

View File

@@ -802,30 +802,33 @@ class WorkflowService:
final_messages = event.get("data", {}).get("messages", [])[init_message_length:] final_messages = event.get("data", {}).get("messages", [])[init_message_length:]
human_message = "" human_message = ""
assistant_message = "" assistant_message = ""
human_meta = {
"files": []
}
for message in final_messages: for message in final_messages:
if message["role"] == "user": if message["role"] == "user":
if isinstance(message["content"], str): if isinstance(message["content"], str):
human_message += message["content"] human_message += message["content"]
elif isinstance(message["content"], list): elif isinstance(message["content"], list):
for file in message["content"]: for file in message["content"]:
if file.get("type") == FileType.IMAGE: human_meta["files"].append({
human_message += f"![image]({file.get('url', '')})" "type": file.get("type"),
else: "url": file.get("url")
human_message += f"[{file.get('type')}]({file.get('url', '')})" })
if message["role"] == "assistant": if message["role"] == "assistant":
assistant_message = message["content"] assistant_message = message["content"]
self.conversation_service.add_message( self.conversation_service.add_message(
conversation_id=conversation_id_uuid, conversation_id=conversation_id_uuid,
role="user", role="user",
content=human_message, content=human_message,
meta_data=None meta_data=human_meta
) )
self.conversation_service.add_message( self.conversation_service.add_message(
message_id=message_id, message_id=message_id,
conversation_id=conversation_id_uuid, conversation_id=conversation_id_uuid,
role="assistant", role="assistant",
content=assistant_message, content=assistant_message,
meta_data={"usage": token_usage} meta_data={"usage": token_usage, "audio_url": None}
) )
self.update_execution_status( self.update_execution_status(
execution.execution_id, execution.execution_id,