Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
c13cd2e
Feat/rebuilt (#14)
united-pooh Feb 20, 2026
f26391c
Merge branch 'AstrBotDevs:master' into dev-i18n
united-pooh Feb 20, 2026
1cc8daf
refactor(i18n): internationalize builtin_stars astrbot main
letr007 Feb 19, 2026
0b2e47b
refactor(i18n): internationalize builtin_stars long term memory
letr007 Feb 19, 2026
ab8ba92
refactor(i18n): internationalize builtin_stars session controller
letr007 Feb 19, 2026
9b3bd38
refactor(i18n): internationalize builtin_stars plugin commands
letr007 Feb 19, 2026
41baac3
refactor(i18n): internationalize builtin_stars provider commands
letr007 Feb 19, 2026
6b8bb4a
fix: rollback some changes in builtin_stars session_controller
letr007 Feb 19, 2026
d488b56
refactor(i18n): internationalize builtin_stars t2i command
letr007 Feb 19, 2026
f57cabc
refactor(i18n): internationalize builtin_stars tts command
letr007 Feb 19, 2026
5666337
refactor(i18n): internationalize builtin_stars llm command
letr007 Feb 19, 2026
6e8099f
refactor(i18n): internationalize builtin_stars setunset commands
letr007 Feb 19, 2026
ada2297
refactor(i18n): internationalize builtin_stars sid command
letr007 Feb 19, 2026
3ac8007
refactor(i18n): internationalize builtin_stars admin commands
letr007 Feb 19, 2026
79416b7
refactor(i18n): internationalize builtin_stars help command
letr007 Feb 19, 2026
0d285ec
refactor(i18n): internationalize builtin_stars alter_cmd command
letr007 Feb 19, 2026
ed70fa9
refactor(i18n): internationalize builtin_stars persona commands
letr007 Feb 19, 2026
b8f2642
refactor(i18n): internationalize builtin_stars conversation commands
letr007 Feb 19, 2026
a67faf9
Merge branch 'AstrBotDevs:master' into dev-i18n
united-pooh Feb 20, 2026
7d9e9b9
Merge branch 'AstrBotDevs:master' into dev-i18n
united-pooh Feb 20, 2026
ccff4e6
add:修改en目录下的文件移动到en-us
Li-shi-ling Feb 20, 2026
52b9cb9
fix:给astr_agent_run_util添加i18n日志
Li-shi-ling Feb 20, 2026
05066cb
fix:给core/astr_agent_tool_exec添加i18n日志
Li-shi-ling Feb 20, 2026
d0ad6a8
fix:给core/zip_updator添加i18n日志
Li-shi-ling Feb 20, 2026
8e61ad7
fix:修改路由问题,添加详细日志(需要在后续工作中删除)
Li-shi-ling Feb 20, 2026
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
2 changes: 1 addition & 1 deletion astrbot/api/all.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,4 @@

from astrbot.core.platform.register import register_platform_adapter

from .message_components import *
from .message_components import *
42 changes: 35 additions & 7 deletions astrbot/builtin_stars/astrbot/long_term_memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from astrbot.api.message_components import At, Image, Plain
from astrbot.api.platform import MessageType
from astrbot.api.provider import LLMResponse, Provider, ProviderRequest
from astrbot.core import t
from astrbot.core.astrbot_config_mgr import AstrBotConfigManager

"""
Expand All @@ -28,7 +29,7 @@ def cfg(self, event: AstrMessageEvent):
try:
max_cnt = int(cfg["provider_ltm_settings"]["group_message_max_cnt"])
except BaseException as e:
logger.error(e)
logger.error(t("builtin-stars-astrbot-ltm-invalid-max-count", error=str(e)))
max_cnt = 300
image_caption_prompt = cfg["provider_settings"]["image_caption_prompt"]
image_caption_provider_id = cfg["provider_ltm_settings"].get(
Expand Down Expand Up @@ -74,9 +75,19 @@ async def get_image_caption(
else:
provider = self.context.get_provider_by_id(image_caption_provider_id)
if not provider:
raise Exception(f"没有找到 ID 为 {image_caption_provider_id} 的提供商")
raise Exception(
t(
"builtin-stars-astrbot-ltm-provider-not-found",
provider_id=image_caption_provider_id,
)
)
if not isinstance(provider, Provider):
raise Exception(f"提供商类型错误({type(provider)}),无法获取图片描述")
raise Exception(
t(
"builtin-stars-astrbot-ltm-provider-type-invalid",
provider_type=str(type(provider)),
)
)
response = await provider.text_chat(
prompt=image_caption_prompt,
session_id=uuid.uuid4().hex,
Expand Down Expand Up @@ -128,22 +139,35 @@ async def handle_message(self, event: AstrMessageEvent) -> None:
try:
url = comp.url if comp.url else comp.file
if not url:
raise Exception("图片 URL 为空")
raise Exception(
t("builtin-stars-astrbot-ltm-empty-image-url")
)
caption = await self.get_image_caption(
url,
cfg["image_caption_provider_id"],
cfg["image_caption_prompt"],
)
parts.append(f" [Image: {caption}]")
except Exception as e:
logger.error(f"获取图片描述失败: {e}")
logger.error(
t(
"builtin-stars-astrbot-ltm-image-caption-failed",
error=str(e),
)
)
else:
parts.append(" [Image]")
elif isinstance(comp, At):
parts.append(f" [At: {comp.name}]")

final_message = "".join(parts)
logger.debug(f"ltm | {event.unified_msg_origin} | {final_message}")
logger.debug(
t(
"builtin-stars-astrbot-ltm-recorded-message",
umo=event.unified_msg_origin,
message=final_message,
)
)
self.session_chats[event.unified_msg_origin].append(final_message)
if len(self.session_chats[event.unified_msg_origin]) > cfg["max_cnt"]:
self.session_chats[event.unified_msg_origin].pop(0)
Expand Down Expand Up @@ -180,7 +204,11 @@ async def after_req_llm(
if llm_resp.completion_text:
final_message = f"[You/{datetime.datetime.now().strftime('%H:%M:%S')}]: {llm_resp.completion_text}"
logger.debug(
f"Recorded AI response: {event.unified_msg_origin} | {final_message}"
t(
"builtin-stars-astrbot-ltm-recorded-ai-response",
umo=event.unified_msg_origin,
message=final_message,
)
)
self.session_chats[event.unified_msg_origin].append(final_message)
cfg = self.cfg(event)
Expand Down
40 changes: 30 additions & 10 deletions astrbot/builtin_stars/astrbot/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from astrbot.api.event import AstrMessageEvent, filter
from astrbot.api.message_components import Image, Plain
from astrbot.api.provider import LLMResponse, ProviderRequest
from astrbot.core import logger
from astrbot.core import logger, t

from .long_term_memory import LongTermMemory

Expand All @@ -16,7 +16,9 @@ def __init__(self, context: star.Context) -> None:
try:
self.ltm = LongTermMemory(self.context.astrbot_config_mgr, self.context)
except BaseException as e:
logger.error(f"聊天增强 err: {e}")
logger.error(
t("builtin-stars-astrbot-main-chat-enhance-error", error=str(e))
)

def ltm_enabled(self, event: AstrMessageEvent):
ltmse = self.context.get_config(umo=event.unified_msg_origin)[
Expand Down Expand Up @@ -44,13 +46,20 @@ async def on_message(self, event: AstrMessageEvent):
try:
await self.ltm.handle_message(event)
except BaseException as e:
logger.error(e)
logger.error(
t(
"builtin-stars-astrbot-main-record-message-error",
error=str(e),
)
)

if need_active:
"""主动回复"""
provider = self.context.get_using_provider(event.unified_msg_origin)
if not provider:
logger.error("未找到任何 LLM 提供商。请先配置。无法主动回复")
logger.error(
t("builtin-stars-astrbot-main-no-llm-provider-for-active-reply")
)
return
try:
conv = None
Expand All @@ -60,7 +69,9 @@ async def on_message(self, event: AstrMessageEvent):

if not session_curr_cid:
logger.error(
"当前未处于对话状态,无法主动回复,请确保 平台设置->会话隔离(unique_session) 未开启,并使用 /switch 序号 切换或者 /new 创建一个会话。",
t(
"builtin-stars-astrbot-main-no-conversation-active-reply"
),
)
return

Expand All @@ -72,7 +83,11 @@ async def on_message(self, event: AstrMessageEvent):
prompt = event.message_str

if not conv:
logger.error("未找到对话,无法主动回复")
logger.error(
t(
"builtin-stars-astrbot-main-conversation-not-found-active-reply"
)
)
return

yield event.request_llm(
Expand All @@ -82,7 +97,12 @@ async def on_message(self, event: AstrMessageEvent):
)
except BaseException as e:
logger.error(traceback.format_exc())
logger.error(f"主动回复失败: {e}")
logger.error(
t(
"builtin-stars-astrbot-main-active-reply-failed",
error=str(e),
)
)

@filter.on_llm_request()
async def decorate_llm_req(
Expand All @@ -93,7 +113,7 @@ async def decorate_llm_req(
try:
await self.ltm.on_req_llm(event, req)
except BaseException as e:
logger.error(f"ltm: {e}")
logger.error(t("builtin-stars-astrbot-main-ltm-error", error=str(e)))

@filter.on_llm_response()
async def record_llm_resp_to_ltm(
Expand All @@ -104,7 +124,7 @@ async def record_llm_resp_to_ltm(
try:
await self.ltm.after_req_llm(event, resp)
except Exception as e:
logger.error(f"ltm: {e}")
logger.error(t("builtin-stars-astrbot-main-ltm-error", error=str(e)))

@filter.after_message_sent()
async def after_message_sent(self, event: AstrMessageEvent) -> None:
Expand All @@ -115,4 +135,4 @@ async def after_message_sent(self, event: AstrMessageEvent) -> None:
if clean_session:
await self.ltm.remove_session(event)
except Exception as e:
logger.error(f"ltm: {e}")
logger.error(t("builtin-stars-astrbot-main-ltm-error", error=str(e)))
39 changes: 27 additions & 12 deletions astrbot/builtin_stars/builtin_commands/commands/admin.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from astrbot.api import star
from astrbot.api.event import AstrMessageEvent, MessageChain, MessageEventResult
from astrbot.core import t
from astrbot.core.config.default import VERSION
from astrbot.core.utils.io import download_dashboard

Expand All @@ -13,65 +14,79 @@ async def op(self, event: AstrMessageEvent, admin_id: str = "") -> None:
if not admin_id:
event.set_result(
MessageEventResult().message(
"使用方法: /op <id> 授权管理员;/deop <id> 取消管理员。可通过 /sid 获取 ID。",
t("builtin-stars-admin-op-usage"),
),
)
return
self.context.get_config()["admins_id"].append(str(admin_id))
self.context.get_config().save_config()
event.set_result(MessageEventResult().message("授权成功。"))
event.set_result(
MessageEventResult().message(t("builtin-stars-admin-op-success"))
)

async def deop(self, event: AstrMessageEvent, admin_id: str = "") -> None:
"""取消授权管理员。deop <admin_id>"""
if not admin_id:
event.set_result(
MessageEventResult().message(
"使用方法: /deop <id> 取消管理员。可通过 /sid 获取 ID。",
t("builtin-stars-admin-deop-usage"),
),
)
return
try:
self.context.get_config()["admins_id"].remove(str(admin_id))
self.context.get_config().save_config()
event.set_result(MessageEventResult().message("取消授权成功。"))
event.set_result(
MessageEventResult().message(t("builtin-stars-admin-deop-success"))
)
except ValueError:
event.set_result(
MessageEventResult().message("此用户 ID 不在管理员名单内。"),
MessageEventResult().message(t("builtin-stars-admin-deop-not-in-list")),
)

async def wl(self, event: AstrMessageEvent, sid: str = "") -> None:
"""添加白名单。wl <sid>"""
if not sid:
event.set_result(
MessageEventResult().message(
"使用方法: /wl <id> 添加白名单;/dwl <id> 删除白名单。可通过 /sid 获取 ID。",
t("builtin-stars-admin-wl-usage"),
),
)
return
cfg = self.context.get_config(umo=event.unified_msg_origin)
cfg["platform_settings"]["id_whitelist"].append(str(sid))
cfg.save_config()
event.set_result(MessageEventResult().message("添加白名单成功。"))
event.set_result(
MessageEventResult().message(t("builtin-stars-admin-wl-success"))
)

async def dwl(self, event: AstrMessageEvent, sid: str = "") -> None:
"""删除白名单。dwl <sid>"""
if not sid:
event.set_result(
MessageEventResult().message(
"使用方法: /dwl <id> 删除白名单。可通过 /sid 获取 ID。",
t("builtin-stars-admin-dwl-usage"),
),
)
return
try:
cfg = self.context.get_config(umo=event.unified_msg_origin)
cfg["platform_settings"]["id_whitelist"].remove(str(sid))
cfg.save_config()
event.set_result(MessageEventResult().message("删除白名单成功。"))
event.set_result(
MessageEventResult().message(t("builtin-stars-admin-dwl-success"))
)
except ValueError:
event.set_result(MessageEventResult().message("此 SID 不在白名单内。"))
event.set_result(
MessageEventResult().message(t("builtin-stars-admin-dwl-not-in-list"))
)

async def update_dashboard(self, event: AstrMessageEvent) -> None:
"""更新管理面板"""
await event.send(MessageChain().message("正在尝试更新管理面板..."))
await event.send(
MessageChain().message(t("builtin-stars-admin-update-dashboard-start"))
)
await download_dashboard(version=f"v{VERSION}", latest=False)
await event.send(MessageChain().message("管理面板更新完成。"))
await event.send(
MessageChain().message(t("builtin-stars-admin-update-dashboard-finished"))
)
Loading
Loading