fix: support AI commands in media captions

This commit is contained in:
Azimkin
2026-09-14 14:35:48 +02:00
parent 40e7930e60
commit c6b93c9aa8
6 changed files with 62 additions and 10 deletions

View File

@@ -437,8 +437,14 @@ async def run_agent_turn(
context["base_dir"] = config.base_dir
existing.session.context.clear()
existing.session.context.update(context)
media = await _download_message_media(
client,
command_message,
Path(existing.workspace.name),
config.max_media_bytes,
)
return AgentTurnResult(
answer=await _run_session(existing.session, invocation.prompt),
answer=await _run_session(existing.session, invocation.prompt, media=media),
handle=existing,
)
@@ -463,6 +469,12 @@ async def run_agent_turn(
user_template=templates.user,
template_context=context,
)
media = await _download_message_media(
client,
command_message,
temp_path,
config.max_media_bytes,
)
tools = [
*WebPageTools(
timeout_seconds=config.web_page_timeout_seconds,
@@ -501,7 +513,7 @@ async def run_agent_turn(
session_name=f"telegram:{chat_id}",
messages=messages,
)
answer = await _run_session(session, invocation.prompt)
answer = await _run_session(session, invocation.prompt, media=media)
return AgentTurnResult(
answer=answer,
handle=AgentSessionHandle(session, workspace, set()),
@@ -511,8 +523,11 @@ async def run_agent_turn(
raise
async def _run_session(session: Any, prompt: str) -> str:
result = await session.run(prompt)
async def _run_session(session: Any, prompt: str, *, media: list[Media] | None = None) -> str:
if media:
result = await session.run(prompt, media=media)
else:
result = await session.run(prompt)
if not result.succeeded or result.final_message is None:
raise AgentError("Agent loop failed") from result.error
answer = result.final_message.message().strip()

View File

@@ -59,10 +59,12 @@ class CommandDispatcher:
account: "AccountState",
) -> bool:
text = getattr(message, "text", None)
if not isinstance(text, str):
caption = getattr(message, "caption", None)
command_text = text if isinstance(text, str) else caption
if not isinstance(command_text, str):
return False
parsed = parse_command(text)
parsed = parse_command(command_text)
if parsed is None:
return False
@@ -85,7 +87,7 @@ class CommandDispatcher:
message=message,
command=definition,
prefix=parsed.prefix,
raw_text=text,
raw_text=command_text,
args=parsed.args,
alias=parsed.alias,
)

View File

@@ -18,4 +18,4 @@ def register_common_handlers(client: "Client", manager: "AccountManager", accoun
async def command_handler(client_: "Client", message) -> None:
await dispatcher.dispatch(client_, message, manager, account)
client.add_handler(MessageHandler(command_handler, filters.text))
client.add_handler(MessageHandler(command_handler, filters.text | filters.caption))