Improve agent image capability routing

This commit is contained in:
jxxghp
2026-04-15 08:55:32 +08:00
parent bf127d6a70
commit 13c3c082b8
14 changed files with 417 additions and 57 deletions
+65 -3
View File
@@ -1,8 +1,8 @@
from dataclasses import dataclass
from enum import Enum
from typing import Optional, Union, List, Dict, Set
from typing import Optional, Union, List, Dict, Set, Any
from pydantic import BaseModel, Field
from pydantic import BaseModel, Field, field_validator
from app.schemas.types import ContentType, NotificationType, MessageChannel
@@ -29,6 +29,61 @@ class CommingMessage(BaseModel):
外来消息
"""
class MessageImage(BaseModel):
"""
外来消息图片
"""
ref: str
name: Optional[str] = None
mime_type: Optional[str] = None
size: Optional[int] = None
@classmethod
def from_value(cls, value: Any) -> Optional["CommingMessage.MessageImage"]:
if value is None:
return None
if isinstance(value, cls):
return value
if isinstance(value, str):
return cls(ref=value)
if isinstance(value, dict):
ref = (
value.get("ref")
or value.get("url")
or value.get("image_url")
or value.get("file_url")
)
if not ref:
return None
size = value.get("size")
try:
size = int(size) if size is not None else None
except (TypeError, ValueError):
size = None
return cls(
ref=ref,
name=value.get("name") or value.get("filename"),
mime_type=value.get("mime_type") or value.get("content_type"),
size=size,
)
return None
@classmethod
def normalize_list(
cls, values: Optional[Any]
) -> Optional[List["CommingMessage.MessageImage"]]:
if not values:
return None
if not isinstance(values, list):
values = [values]
normalized = []
for value in values:
item = cls.from_value(value)
if item:
normalized.append(item)
return normalized or None
class MessageAttachment(BaseModel):
"""
外来消息附件(非图片/非语音)
@@ -64,12 +119,19 @@ class CommingMessage(BaseModel):
# 完整的回调查询信息(原始数据)
callback_query: Optional[Dict] = None
# 图片列表(图片URL或file_id
images: Optional[List[str]] = None
images: Optional[List[MessageImage]] = None
# 语音/音频引用列表
audio_refs: Optional[List[str]] = None
# 文件附件列表
files: Optional[List[MessageAttachment]] = None
@field_validator("images", mode="before")
@classmethod
def _normalize_images(
cls, value: Any
) -> Optional[List["CommingMessage.MessageImage"]]:
return cls.MessageImage.normalize_list(value)
def to_dict(self):
"""
转换为字典