feat: 优化 Agent 运行时与聊天设置体验

This commit is contained in:
qzl
2026-03-16 18:32:09 +08:00
parent 3f79cf0df7
commit 5a34616287
41 changed files with 2603 additions and 1263 deletions
+28 -23
View File
@@ -11,7 +11,7 @@ from core.agentscope.runtime.ui_compiler import compile as compile_ui_hints
from schemas.messages.chat_message import (
AgentChatMessage,
AgentChatMessageMetadata,
UserMessageAttachments,
extract_user_message_attachments,
)
@@ -23,7 +23,7 @@ def convert_message_to_history(
将 AgentChatMessage 转换为 HistoryMessage 格式
转换规则:
- role=user: 读取 metadata.user_message_attachments将 bucket 转临时访问 url
- role=user: 读取 metadata.user_message_attachments转换为 attachments[]
- role=tool: 读取 content 和 metadata.tool_agent_output.ui_hints,编译成 ui_schema
- role=assistant: 读取 metadata.worker_agent_output.ui_hints,编译成 ui_schema
"""
@@ -31,11 +31,11 @@ def convert_message_to_history(
content = message.content
metadata = message.metadata
url: str | None = None
attachments: list[dict[str, str]] = []
ui_schema: dict[str, Any] | None = None
if role == "user":
url = _convert_user_attachments(metadata, get_signed_url_fn)
attachments = _convert_user_attachments(metadata, get_signed_url_fn)
elif role == "tool":
ui_schema = _compile_tool_ui_hints(metadata)
@@ -51,8 +51,8 @@ def convert_message_to_history(
"timestamp": message.timestamp.isoformat(),
}
if url:
result["url"] = url
if attachments:
result["attachments"] = attachments
if ui_schema:
result["ui_schema"] = ui_schema
@@ -63,28 +63,33 @@ def convert_message_to_history(
def _convert_user_attachments(
metadata: AgentChatMessageMetadata | dict[str, Any] | None,
get_signed_url_fn: Callable[[dict[str, str]], str] | None,
) -> str | None:
"""转换用户附件为临时访问 URL"""
if not metadata:
return None
) -> list[dict[str, str]]:
"""转换用户附件为临时访问 URL 列表"""
if not metadata or not get_signed_url_fn:
return []
if isinstance(metadata, AgentChatMessageMetadata):
attachments = metadata.user_message_attachments
resolved = extract_user_message_attachments(metadata)
elif isinstance(metadata, dict):
resolved = extract_user_message_attachments(metadata)
else:
attachments_data = metadata.get("user_message_attachments")
if not attachments_data:
return None
attachments = UserMessageAttachments.model_validate(attachments_data)
return []
if not attachments or not get_signed_url_fn:
return None
try:
return get_signed_url_fn(
{"bucket": attachments.bucket, "path": attachments.path}
signed_attachments: list[dict[str, str]] = []
for attachment in resolved:
try:
signed_url = get_signed_url_fn(
{"bucket": attachment.bucket, "path": attachment.path}
)
except Exception:
continue
signed_attachments.append(
{
"url": signed_url,
"mimeType": attachment.mime_type,
}
)
except Exception:
return None
return signed_attachments
def _compile_tool_ui_hints(