Skip to content

Commit b7c3a88

Browse files
committed
Merge branch 'master' of https://github.com/elecvoid243/AstrBot
2 parents 885e1e0 + 40ce239 commit b7c3a88

108 files changed

Lines changed: 4489 additions & 1262 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"metadata": {
3+
"display_name": "AstrBot",
4+
"desc": "AstrBot's internal plugin, providing some basic capabilities."
5+
}
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"metadata": {
3+
"display_name": "AstrBot",
4+
"desc": "AstrBot 的内部插件,提供一些基础能力。"
5+
}
6+
}

astrbot/builtin_stars/astrbot/main.py

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
1+
import copy
12
import traceback
3+
from sys import maxsize
24

5+
import astrbot.api.message_components as Comp
36
from astrbot.api import star
47
from astrbot.api.event import AstrMessageEvent, filter
58
from astrbot.api.message_components import Image, Plain
69
from astrbot.api.provider import LLMResponse, ProviderRequest
710
from astrbot.core import logger
11+
from astrbot.core.utils.session_waiter import (
12+
FILTERS,
13+
USER_SESSIONS,
14+
SessionController,
15+
SessionWaiter,
16+
session_waiter,
17+
)
818

919
from .long_term_memory import LongTermMemory
1020

@@ -18,6 +28,103 @@ def __init__(self, context: star.Context) -> None:
1828
except BaseException as e:
1929
logger.error(f"聊天增强 err: {e}")
2030

31+
@filter.event_message_type(filter.EventMessageType.ALL, priority=maxsize)
32+
async def handle_session_control_agent(self, event: AstrMessageEvent) -> None:
33+
"""会话控制代理"""
34+
for session_filter in FILTERS:
35+
session_id = session_filter.filter(event)
36+
if session_id in USER_SESSIONS:
37+
await SessionWaiter.trigger(session_id, event)
38+
event.stop_event()
39+
40+
@filter.event_message_type(filter.EventMessageType.ALL, priority=maxsize - 1)
41+
async def handle_empty_mention(self, event: AstrMessageEvent):
42+
"""处理只有一个 @ 或仅有唤醒前缀的消息,并等待用户下一条内容。"""
43+
try:
44+
messages = event.get_messages()
45+
cfg = self.context.get_config(umo=event.unified_msg_origin)
46+
p_settings = cfg["platform_settings"]
47+
wake_prefix = cfg.get("wake_prefix", [])
48+
if len(messages) != 1:
49+
return
50+
51+
is_empty_mention = (
52+
isinstance(messages[0], Comp.At)
53+
and str(messages[0].qq) == str(event.get_self_id())
54+
and p_settings.get("empty_mention_waiting", True)
55+
)
56+
is_wake_prefix_only = (
57+
isinstance(messages[0], Comp.Plain)
58+
and messages[0].text.strip() in wake_prefix
59+
)
60+
61+
if not (is_empty_mention or is_wake_prefix_only):
62+
return
63+
64+
if p_settings.get("empty_mention_waiting_need_reply", True):
65+
try:
66+
curr_cid = await self.context.conversation_manager.get_curr_conversation_id(
67+
event.unified_msg_origin,
68+
)
69+
conversation = None
70+
71+
if curr_cid:
72+
conversation = (
73+
await self.context.conversation_manager.get_conversation(
74+
event.unified_msg_origin,
75+
curr_cid,
76+
)
77+
)
78+
else:
79+
curr_cid = (
80+
await self.context.conversation_manager.new_conversation(
81+
event.unified_msg_origin,
82+
platform_id=event.get_platform_id(),
83+
)
84+
)
85+
86+
yield event.request_llm(
87+
prompt=(
88+
"注意,你正在社交媒体上中与用户进行聊天,用户只是通过@来唤醒你,但并未在这条消息中输入内容,他可能会在接下来一条发送他想发送的内容。"
89+
"你友好地询问用户想要聊些什么或者需要什么帮助,回复要符合人设,不要太过机械化。"
90+
"请注意,你仅需要输出要回复用户的内容,不要输出其他任何东西"
91+
),
92+
session_id=curr_cid,
93+
contexts=[],
94+
system_prompt="",
95+
conversation=conversation,
96+
)
97+
except Exception as e:
98+
logger.error(f"LLM response failed: {e!s}")
99+
yield event.plain_result("想要问什么呢?😄")
100+
101+
@session_waiter(60)
102+
async def empty_mention_waiter(
103+
controller: SessionController,
104+
event: AstrMessageEvent,
105+
) -> None:
106+
if not event.message_str or not event.message_str.strip():
107+
return
108+
event.message_obj.message.insert(
109+
0,
110+
Comp.At(qq=event.get_self_id(), name=event.get_self_id()),
111+
)
112+
new_event = copy.copy(event)
113+
self.context.get_event_queue().put_nowait(new_event)
114+
event.stop_event()
115+
controller.stop()
116+
117+
try:
118+
await empty_mention_waiter(event)
119+
except TimeoutError:
120+
pass
121+
except Exception as e:
122+
yield event.plain_result("发生错误,请联系管理员: " + str(e))
123+
finally:
124+
event.stop_event()
125+
except Exception as e:
126+
logger.error("handle_empty_mention error: " + str(e))
127+
21128
def ltm_enabled(self, event: AstrMessageEvent):
22129
ltmse = self.context.get_config(umo=event.unified_msg_origin)[
23130
"provider_ltm_settings"
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
name: astrbot
2-
desc: AstrBot 自带插件,包含人格注入、思考内容注入、群聊上下文感知等功能的实现,禁用后将无法使用这些功能。
3-
author: Soulter
4-
version: 4.1.0
2+
desc: AstrBot's internal plugin, providing some basic capabilities.
3+
author: AstrBot Team
4+
version: 4.1.0
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"metadata": {
3+
"display_name": "Built-in Commands",
4+
"desc": "AstrBot's internal plugin, providing built-in commands such as /reset, /help, and /sid."
5+
}
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"metadata": {
3+
"display_name": "内置指令",
4+
"desc": "AstrBot 自带插件,提供 /reset、/help、/sid 等内置指令。"
5+
}
6+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
name: builtin_commands
2-
desc: AstrBot 自带指令,提供常用的对话管理、工具使用、插件管理等功能。
2+
desc: AstrBot's internal plugin, providing all built-in commands such as /reset.
33
author: Soulter
44
version: 0.0.1

astrbot/builtin_stars/session_controller/main.py

Lines changed: 0 additions & 115 deletions
This file was deleted.

astrbot/builtin_stars/session_controller/metadata.yaml

Lines changed: 0 additions & 5 deletions
This file was deleted.

astrbot/core/astr_main_agent.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ class MainAgentBuildConfig:
153153
This enforce max turns before compression"""
154154
dequeue_context_length: int = 1
155155
"""The number of oldest turns to remove when context length limit is reached."""
156+
fallback_max_context_tokens: int = 128000
157+
"""Fallback max context tokens. When max_context_tokens is 0 and the model is not in LLM_METADATAS, use this value."""
156158
llm_safety_mode: bool = True
157159
"""This will inject healthy and safe system prompt into the main agent,
158160
to prevent LLM output harmful information"""
@@ -400,6 +402,9 @@ async def _ensure_persona_and_skills(
400402
event, extract_persona_custom_error_message_from_persona(persona)
401403
)
402404

405+
if req.system_prompt is None:
406+
req.system_prompt = ""
407+
403408
if persona:
404409
# Inject persona system prompt
405410
if prompt := persona["prompt"]:
@@ -1462,6 +1467,11 @@ async def build_main_agent(
14621467
provider.provider_config["max_context_tokens"] = model_info["limit"][
14631468
"context"
14641469
]
1470+
else:
1471+
# fallback: default to configured fallback value
1472+
provider.provider_config["max_context_tokens"] = (
1473+
config.fallback_max_context_tokens
1474+
)
14651475

14661476
if event.get_platform_name() == "webchat":
14671477
asyncio.create_task(_handle_webchat(event, req, provider))

0 commit comments

Comments
 (0)