feat: Enhance emoji and image management with asynchronous background processing

- Added support for scheduling background tasks to build emoji and image descriptions when not found in cache.
- Improved error handling and logging for emoji and image processing.
- Updated `SessionMessage` processing to allow for optional heavy media analysis and voice transcription.
- Refactored logging messages for better clarity and consistency across various modules.
- Introduced a new function to build outbound log previews for messages, enhancing logging capabilities.
This commit is contained in:
DrSmoothl
2026-03-26 23:03:47 +08:00
parent 777d4cb0d2
commit 0a08973c41
17 changed files with 488 additions and 167 deletions

View File

@@ -578,19 +578,16 @@ class HookDispatcher:
return
if not hook_spec.allow_abort:
logger.warning(
"Hook %s 禁止 abort已将 %s 的错误策略按 skip 处理",
dispatch_result.hook_name,
target.entry.full_name,
f"Hook {dispatch_result.hook_name} 禁止 abort"
f"已将 {target.entry.full_name} 的错误策略按 skip 处理"
)
return
dispatch_result.aborted = True
dispatch_result.stopped_by = target.entry.full_name
logger.warning(
"HookHandler %s 因错误策略 abort 中止了 Hook %s: %s",
target.entry.full_name,
dispatch_result.hook_name,
error_message,
f"HookHandler {target.entry.full_name} 因错误策略 abort "
f"中止了 Hook {dispatch_result.hook_name}: {error_message}"
)
def _schedule_observe_handler(
@@ -610,7 +607,7 @@ class HookDispatcher:
"""
if not hook_spec.allow_observe:
logger.warning("Hook %s 不允许 observe 处理器,已跳过 %s", hook_name, target.entry.full_name)
logger.warning(f"Hook {hook_name} 不允许 observe 处理器,已跳过 {target.entry.full_name}")
return
task = asyncio.create_task(
@@ -649,20 +646,15 @@ class HookDispatcher:
if not execution_result.success:
logger.warning(
"观察型 HookHandler %s 执行失败: %s",
target.entry.full_name,
execution_result.error_message or "未知错误",
f"观察型 HookHandler {target.entry.full_name} 执行失败: "
f"{execution_result.error_message or '未知错误'}"
)
return
if execution_result.modified_kwargs is not None:
logger.warning(
"观察型 HookHandler %s 返回了 modified_kwargs已忽略", target.entry.full_name
)
logger.warning(f"观察型 HookHandler {target.entry.full_name} 返回了 modified_kwargs已忽略")
if execution_result.action == "abort":
logger.warning(
"观察型 HookHandler %s 请求 abort已忽略", target.entry.full_name
)
logger.warning(f"观察型 HookHandler {target.entry.full_name} 请求 abort已忽略")
def _handle_background_task_done(self, task: asyncio.Task[Any]) -> None:
"""处理观察任务完成回调。

View File

@@ -164,7 +164,7 @@ class RunnerIPCLogHandler(logging.Handler):
return f"{event_text} {' '.join(extras)}".strip()
return event_text
# format() 会处理 %s 参数替换和 exc_info 文本拼接。
# format() 会处理占位参数替换和 exc_info 文本拼接。
return self.format(record)
@staticmethod