add formating

This commit is contained in:
kandrusyak
2026-07-27 17:14:07 +03:00
parent 7b7ff51d0f
commit 275eca8dc5
10 changed files with 628 additions and 157 deletions

View File

@@ -16,11 +16,15 @@ from .prompts import ASSISTANT_SYSTEM_PROMPT
from .reminders import parse_reminder
from .storage import AssistantStorage
from .telegram_utils import (
edit_markdown,
edit_or_reply,
escape_markdown_text,
get_ai_client,
get_storage,
get_tz,
markdown_code,
parse_positive_int,
reply_markdown,
require_user_id,
)
from .time_utils import format_local_dt, to_utc_iso, utc_now
@@ -80,12 +84,16 @@ def build_agent_tool_prompt(tz: ZoneInfo) -> str:
"Ты работаешь как агент с внутренними tools. Пользователь пишет свободным текстом, "
"а Telegram-команды ему не нужны.\n"
f"Текущее локальное время: {now_local}. Таймзона: {tz.key}.\n\n"
"Отвечай СТРОГО одним JSON-объектом без Markdown и без текста вокруг.\n"
"Отвечай СТРОГО одним JSON-объектом без Markdown-блока и без текста вокруг.\n"
"Если нужно выполнить действие, верни tool_calls. Если действие уже выполнено "
"или tool не нужен, верни final.\n\n"
"Форматы ответа:\n"
'{"tool_calls":[{"name":"create_note","arguments":{"text":"..."}}],"reset_context":false}\n'
'{"final":"Короткий ответ пользователю","reset_context":false}\n\n'
"Значение final оформляй обычным Markdown, не MarkdownV2. Умеренно используй "
"жирный и курсивный текст, списки, ссылки и блоки кода, когда они улучшают "
"читаемость. Для короткого простого ответа разметка не обязательна. "
"Не добавляй декоративные эмодзи чаще одного раза на сообщение.\n\n"
"Доступные tools:\n"
"- get_current_datetime {} - узнать текущее локальное и UTC-время.\n"
'- remember {"text": string} - сохранить важный долгосрочный факт о пользователе.\n'
@@ -389,7 +397,10 @@ async def run_agent_prompt(
user_id = require_user_id(update)
if user_id is None:
await update.effective_message.reply_text("Не могу определить пользователя.")
await reply_markdown(
update.effective_message,
"⚠️ **Не могу определить пользователя.**",
)
return
storage = get_storage(context)
@@ -428,8 +439,10 @@ async def run_agent_prompt(
chat_id=chat_id,
action=ChatAction.TYPING,
)
placeholder = await update.effective_message.reply_text(
f"Думаю через {ai_client.display_name} / {model}..."
placeholder = await reply_markdown(
update.effective_message,
f"💭 *Думаю через {escape_markdown_text(ai_client.display_name)} / "
f"{markdown_code(model)}…*",
)
try:
@@ -502,7 +515,7 @@ async def run_agent_prompt(
"content": (
"Лимит tool-шагов исчерпан. Больше не вызывай tools. "
f"Последние результаты tools: {json_dumps(last_tool_results)}. "
"Сформулируй короткий финальный ответ пользователю обычным текстом."
"Сформулируй короткий финальный ответ пользователю обычным Markdown."
),
},
],
@@ -523,13 +536,20 @@ async def run_agent_prompt(
hint = (
"Проверь YANDEX_CLOUD_FOLDER, YC_API_KEY и доступ к выбранной модели."
)
await placeholder.edit_text(
f"Не получилось вызвать {ai_client.display_name}.\n{exc}\n\n{hint}"
await edit_markdown(
placeholder,
f"⚠️ **Не получилось вызвать "
f"{escape_markdown_text(ai_client.display_name)}.**\n\n"
f"{escape_markdown_text(exc)}\n\n"
f"{escape_markdown_text(hint)}",
)
return
except Exception:
logger.exception("Failed to run AI prompt")
await placeholder.edit_text("Произошла внутренняя ошибка при запросе к модели.")
await edit_markdown(
placeholder,
"⚠️ **Произошла внутренняя ошибка** при запросе к модели.",
)
async def run_ai_prompt(