fix(avatar): ground replies in recognized images
This commit is contained in:
@@ -50,8 +50,15 @@ BOXIM_IMAGE_MESSAGE_TYPE = 1
|
||||
BOXIM_IMAGE_PROMPT = "请看看这张图片。"
|
||||
BOXIM_IMAGE_UNAVAILABLE_REPLY = "这张图片我暂时没看清,麻烦重新发送一张清晰的原图。"
|
||||
IMAGE_CONTEXT_LOOKBACK_SECONDS = 1800
|
||||
IMAGE_REFERENCE_LOOKBACK_SECONDS = 172_800
|
||||
MAX_RECENT_IMAGE_CONTEXTS = 3
|
||||
|
||||
_IMAGE_REFERENCE_PATTERN = re.compile(
|
||||
r"(?:图片|图像|照片|截图|这张图|刚才.{0,8}图|病例|病历|检查单|检验单|化验单|报告|影像|"
|
||||
r"\b(?:image|photo|picture|screenshot|scan|report)\b)",
|
||||
re.IGNORECASE,
|
||||
)
|
||||
|
||||
|
||||
def _utcnow() -> datetime:
|
||||
return datetime.utcnow()
|
||||
@@ -129,6 +136,10 @@ def _event_prompt(event: TakeoverMessage) -> str:
|
||||
return ""
|
||||
|
||||
|
||||
def _references_recent_image(value: str) -> bool:
|
||||
return bool(_IMAGE_REFERENCE_PATTERN.search(value or ""))
|
||||
|
||||
|
||||
class TakeoverService:
|
||||
"""Poll BOXIM, honor the owner grace period, then generate and send one reply."""
|
||||
|
||||
@@ -693,8 +704,14 @@ class TakeoverService:
|
||||
event: TakeoverMessage,
|
||||
current_source_ids: list[str],
|
||||
) -> list[TakeoverMessage]:
|
||||
"""Recover a recent image that an older deployment recorded without a task."""
|
||||
threshold = event.send_time - timedelta(seconds=IMAGE_CONTEXT_LOOKBACK_SECONDS)
|
||||
"""Recover missed images, or reuse a referenced image from the last two days."""
|
||||
references_image = _references_recent_image(event.content)
|
||||
lookback_seconds = (
|
||||
IMAGE_REFERENCE_LOOKBACK_SECONDS
|
||||
if references_image
|
||||
else IMAGE_CONTEXT_LOOKBACK_SECONDS
|
||||
)
|
||||
threshold = event.send_time - timedelta(seconds=lookback_seconds)
|
||||
candidates = (
|
||||
db.query(TakeoverMessage)
|
||||
.filter(
|
||||
@@ -714,7 +731,15 @@ class TakeoverService:
|
||||
if not candidates:
|
||||
return []
|
||||
|
||||
handled_ids = set(current_source_ids)
|
||||
current_ids = set(current_source_ids)
|
||||
if references_image:
|
||||
return [
|
||||
image
|
||||
for image in reversed(candidates)
|
||||
if image.boxim_message_id not in current_ids
|
||||
]
|
||||
|
||||
handled_ids = set(current_ids)
|
||||
task_sources = (
|
||||
db.query(TakeoverReplyTask.source_message_ids)
|
||||
.filter(
|
||||
|
||||
Reference in New Issue
Block a user