Merge pull request #612 from SuanmoSuanyangTechnology/feature/message-file
feat(workflow): move conversation file content into metadata
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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):
|
||||||
"""会话输出"""
|
"""会话输出"""
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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"})"
|
"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,
|
||||||
|
|||||||
Reference in New Issue
Block a user