Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 6 additions & 15 deletions astrbot/builtin_stars/astrbot/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,7 @@
from astrbot.core.message.message_event_result import MessageChain
from astrbot.core.platform.message_type import MessageType
from astrbot.core.utils.session_waiter import (
FILTERS,
USER_SESSIONS,
SessionController,
SessionWaiter,
session_waiter,
)

Expand All @@ -41,15 +38,6 @@ def __init__(self, context: star.Context) -> None:
except BaseException as e:
logger.error(f"group chat context init failed: {e}")

@filter.event_message_type(filter.EventMessageType.ALL, priority=maxsize)
async def handle_session_control_agent(self, event: AstrMessageEvent) -> None:
"""会话控制代理"""
for session_filter in FILTERS:
session_id = session_filter.filter(event)
if session_id in USER_SESSIONS:
await SessionWaiter.trigger(session_id, event)
event.stop_event()

@filter.event_message_type(filter.EventMessageType.ALL, priority=maxsize - 1)
async def handle_empty_mention(self, event: AstrMessageEvent):
"""处理只有一个 @ 或仅有唤醒前缀的消息,并等待用户下一条内容。"""
Expand Down Expand Up @@ -147,8 +135,8 @@ def group_context_enabled(self, event: AstrMessageEvent):
or group_context_settings["active_reply"]["enable"]
)

@filter.platform_adapter_type(
filter.PlatformAdapterType.ALL,
@filter.event_message_type(
filter.EventMessageType.GROUP_MESSAGE,
priority=maxsize - 2,
)
async def persist_group_message(self, event: AstrMessageEvent) -> None:
Expand Down Expand Up @@ -193,7 +181,10 @@ async def persist_group_message(self, event: AstrMessageEvent) -> None:
except Exception:
logger.exception("Failed to persist an incoming group message.")

@filter.platform_adapter_type(filter.PlatformAdapterType.ALL)
@filter.event_message_type(
filter.EventMessageType.GROUP_MESSAGE,
priority=maxsize - 2,
)
async def on_message(self, event: AstrMessageEvent):
"""群聊上下文感知"""
message_components = _iter_message_components(event)
Expand Down
1 change: 0 additions & 1 deletion astrbot/core/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
"""**Deprecated**. For plugin developers, please use `self.context.html_renderer` instead."""
logger = LogManager.GetLogger(log_name="astrbot")
LogManager.configure_logger(logger, astrbot_config)
LogManager.configure_trace_logger(astrbot_config)
db_helper = SQLiteDatabase(DB_PATH)
sp = SharedPreferences(db_helper=db_helper)
file_token_service = FileTokenService()
Expand Down
11 changes: 3 additions & 8 deletions astrbot/core/astr_main_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,7 @@ async def _ensure_persona_and_skills(
event: AstrMessageEvent,
) -> None:
"""Ensure persona and skills are applied to the request's system prompt or user prompt."""
event.set_extra("_trace_persona_id", None)
if req.system_prompt is None:
req.system_prompt = ""

Expand All @@ -592,6 +593,8 @@ async def _ensure_persona_and_skills(
provider_settings=cfg,
)

event.set_extra("_trace_persona_id", persona_id)

set_persona_custom_error_message_on_event(
event, extract_persona_custom_error_message_from_persona(persona)
)
Expand Down Expand Up @@ -727,14 +730,6 @@ async def _ensure_persona_and_skills(
).strip()
if router_prompt:
req.system_prompt += f"\n{router_prompt}\n"
try:
event.trace.record(
"sel_persona",
persona_id=persona_id,
persona_toolset=persona_toolset.names(),
)
except Exception:
pass


async def _request_img_caption(
Expand Down
42 changes: 21 additions & 21 deletions astrbot/core/config/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -309,9 +309,9 @@ def get_local_permission_defaults(system: str | None = None) -> dict:
"log_file_max_mb": 20,
"temp_dir_max_size": 1024,
"trace_enable": False,
"trace_log_enable": False,
"trace_log_path": "logs/astrbot.trace.log",
"trace_log_max_mb": 20,
"trace_db_path": "logs/traces.db",
"trace_db_max_mb": 80,
"trace_retention_days": 7,
"pip_install_arg": "",
"pypi_index_url": "https://mirrors.aliyun.com/pypi/simple/",
"persona": [], # deprecated
Expand Down Expand Up @@ -3236,15 +3236,10 @@ def get_local_permission_defaults(system: str | None = None) -> dict:
"log_file_path": {"type": "string", "condition": {"log_file_enable": True}},
"log_file_max_mb": {"type": "int", "condition": {"log_file_enable": True}},
"temp_dir_max_size": {"type": "int"},
"trace_log_enable": {"type": "bool"},
"trace_log_path": {
"type": "string",
"condition": {"trace_log_enable": True},
},
"trace_log_max_mb": {
"type": "int",
"condition": {"trace_log_enable": True},
},
"trace_enable": {"type": "bool"},
"trace_db_path": {"type": "string"},
"trace_db_max_mb": {"type": "int"},
"trace_retention_days": {"type": "int"},
"t2i_strategy": {
"type": "string",
"options": ["remote", "local"],
Expand Down Expand Up @@ -4851,20 +4846,25 @@ def get_local_permission_defaults(system: str | None = None) -> dict:
"type": "int",
"hint": "用于限制 data/temp 目录总大小,单位为 MB。系统每 10 分钟检查一次,超限时按文件修改时间从旧到新删除,释放约 30% 当前体积。",
},
"trace_log_enable": {
"description": "启用 Trace 文件日志",
"trace_enable": {
"description": "启用追踪记录",
"type": "bool",
"hint": "将 Trace 事件写入独立文件(不影响控制台输出)。",
"hint": "追踪用户的每次指令和 AI 调用。",
},
"trace_log_path": {
"description": "Trace 日志文件路径",
"trace_db_path": {
"description": "追踪数据库路径",
"type": "string",
"hint": "相对路径以 data 目录为基准,例如 logs/astrbot.trace.log;支持绝对路径。",
"hint": "相对路径以 data 目录为基准,例如 logs/traces.db;支持绝对路径。",
},
"trace_log_max_mb": {
"description": "Trace 日志大小上限 (MB)",
"trace_db_max_mb": {
"description": "追踪数据库容量预算 (MB)",
"type": "int",
"hint": "超过大小后自动轮转,默认 20MB。",
"hint": "默认 80 MB,最小 32 MB,低于最小值时按 32 MB 生效。超出后自动清除旧数据。",
},
"trace_retention_days": {
"description": "追踪保留天数",
"type": "int",
"hint": "默认 7 天,期限或容量先达到者触发清理。",
},
"pip_install_arg": {
"description": "pip 安装额外参数",
Expand Down
8 changes: 6 additions & 2 deletions astrbot/core/core_lifecycle.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,10 +165,8 @@ async def initialize(self) -> None:
LogManager.configure_logger(
logger, self.astrbot_config, override_level="DEBUG"
)
LogManager.configure_trace_logger(self.astrbot_config)
else:
LogManager.configure_logger(logger, self.astrbot_config)
LogManager.configure_trace_logger(self.astrbot_config)

await self.db.initialize()
if sp.db_helper is self.db:
Expand Down Expand Up @@ -420,6 +418,9 @@ async def stop(self) -> None:
logger.error(f"任务 {task.get_name()} 发生错误: {e}")

# 释放数据库引擎连接池
from astrbot.core.utils.trace_store import close_trace_store

await asyncio.to_thread(close_trace_store)
try:
await self.db.engine.dispose()
except Exception as e:
Expand All @@ -431,6 +432,9 @@ async def restart(self) -> None:
await self.provider_manager.terminate()
await self.platform_manager.terminate()
await self.kb_manager.terminate()
from astrbot.core.utils.trace_store import close_trace_store

await asyncio.to_thread(close_trace_store)
if sp.db_helper is self.db:
await sp.close()
self.dashboard_shutdown_event.set()
Expand Down
13 changes: 11 additions & 2 deletions astrbot/core/cron/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

from astrbot.core.message.components import Plain
from astrbot.core.message.message_event_result import MessageChain
from astrbot.core.platform.astr_message_event import AstrMessageEvent
from astrbot.core.platform.astr_message_event import (
AstrMessageEvent,
streaming_response_event,
)
from astrbot.core.platform.astrbot_message import AstrBotMessage, MessageMember
from astrbot.core.platform.message_session import MessageSession
from astrbot.core.platform.message_type import MessageType
Expand Down Expand Up @@ -56,7 +59,13 @@ def __init__(
async def send(self, message: MessageChain) -> None:
if message is None:
return
if not await self.context_obj.send_message(self.session, message):
# The outer event.send records delivery; suppress its nested public send.
token = streaming_response_event.set(self)
try:
sent = await self.context_obj.send_message(self.session, message)
finally:
streaming_response_event.reset(token)
if not sent:
return
await super().send(message)

Expand Down
Loading
Loading